当前位置: 首页 > news >正文

[Linux]从零开始的STM32MP157 Buildroot根文件系统构建

一、前言

        在前面的教程中,教了大家如何移植一个LInux的内核并且正确启动,我们发现Linux内核在启动后会出现一个错误,提示我们没有找到根文件系统。那么什么是根文件系统呢?之前我们使用Ubuntu编译了STM32MP157的TF-A,UBOOT,LINUX内核相信大家对Ubuntu已经不陌生了,我们可以看到Ubuntu的路径都是从“/”开始写的,然而这个“/”就被我们叫做根,“/”与它下面挂载的文件并称为根文件系统。可以看到,根文件系统构建了我们系统的整个文件管理系统,我们的所有操作都是建立在根文件系统之上的,所以Linux内核一般与根文件系统一起出现,那么本次教程就来教大家如何为STM32MP157移植一个根文件系统并且正确启动,如果你准备好了,就让我们开始吧!

二、谁适合本次教程

        根文件系统已经处于Linux内核的上层了,本质上是一些较为上层的操作,移植起来也比较简单,甚至需要我们改动的地方都很少,所以难度是比较低的,至少比移植前面几个模块的难度要低。所以如果你能完成前面模块的移植,那么本次移植肯定是没问题的。如果你使用的是别的开发板,也可以参考本次教程,上层的操作都大同小异,但是也仅仅只是作为参考,中间肯定有不一样的地方。

三、资料的准备

        本次我们依然会使用正点原子的官方资料,下载方式在搭建编译环境时就讲过了,如果还不知道如何下载,可以看下面的文章中的资料下载部分:

STM32MP157交叉编译环境搭建:[Linux]从零开始的STM32MP157交叉编译环境配置-CSDN博客

资料下载完成以后如图所示:

准备好资料以后,就可以进行下一步了。

四、根文件系统的选择

        目前主流的根文件系统有两个,分别是Busybox和Buildroot。我们应该如何选择这两种根文件系统呢,下面会分别探讨一下这两种根文件系统的优缺点。首先时Busybox,这是一款比较老的根文件系统,里面整理了常用的工具,缺点也很明显,许多链接库或者系统文件需要我们自己进行复制,不利于新手,但Busybox可以让我们更好的理解根文件系统中每个文件夹的作用,毕竟每个文件夹都是自己来构建的嘛!然后是Buildroot,Buildroot中集成了我们常用的模块,它将Busybot甚至Uboot与Linux内核都集成到了其中。所以可以看出Buildroot的集成度是非常高的,这也为我们编译省去了非常多不必要的步骤,在本次教程中也会使用Buildroot来进行演示,当然在后面的教程中也会为大家讲解Busybox。

五、Buildroot的编译与挂载

        与前面几个模块一样,Buildroot是需要我们自己编译并且挂载的。当然,编译的第一步我们还是先找源码,Buildroot的源码在它的官网可以直接下载到,但是有一些问题,如果现在去官网下载Buildroot的源码的话,下载下来的源码是2025年2月份的,如果使用正点原子提供的2019年的gcc编译器去编译这个源码的话,就可能出现一些路径找不到的问题,这里除非换编译器,不然编译肯定是会失败的,这里我已经替大家测试过了。所以我们这里就使用正点原子提供给我们的源码。Buildroot的源码被放在了正点原子资料目录下的“01、程序源码\07、Buildroot源码”目录下,如图所示:

这里我们在Ubuntu的用户目录下的“Linux”目录下新建一个名为“BUILDROOT”的文件夹,使用下面的命令即可:

mkdir BUILDROOT

新建完成以后如图所示:

然后我们将一开始找到的Buildroot的源码拷贝的这个目录中,这里不管是使用sftp还是直接复制都可以,将文件传输过去就行,完成以后如图所示:

我们使用下面的命令来解压这个压缩包:

tar -xvf buildroot-2020.02.6.tar.bz2

解压完成以后,得到以下文件夹:

进入这个文件夹中,可以看到以下文件:

这些就是Buildroot的源码文件,下面我们来配置Buildroot,Buildroot是支持图形化配置的,所以我们可以直接在Buildroot的源码目录下输入下面的命令来启动图形化配置:

make menuconfig

关于图形化配置,在之前的UBOOT图像化配置中已经讲得很详细了,这里就不多说了,如果你还不会图形化配置,或者不知到图像化配置的原理,可以看下面的文章:

UBOOT图形化配置及原理讲解:[Linux]从零开始的STM32MP157 U-Boot图形化配置及Kconfig文件讲解_kconfig图形化配置应用于应用层软件代码项目中-CSDN博客

下面我们继续回到正题。 

图形化配置启动以后,如图所示:

下面我们开始配置,首先我们来配置“Target options”:

进入“Target options”后,可以看到以下配置项:

这里我们选择“Target Architecture (i386)  ---> ”回车进入,进图后可以看到以下选项:

针对STM32MP157来说我们需要选择“( ) ARM (little endian) ”,如图所示:

将选框移动到该位置然后按下回车就可以选中这个选项了,选择以后,我们界面中就会出现下面这些选项:

这里我们需要对这些选项进行以下配置:

这里选项都是一一对应,大家直接跟着图上配即可,配置完成以后,如图所示:

这样我们“Target options”的配置就完成了。下面我们来配置“Toolchain”位置如图所示:

“Toolchain”主要用于配置交叉编译器,进入后,可以看到以下选项:

这里的配置我们只需要修改几项即可,大家跟着我操作,首先就是“Toolchain type”我们将其配置为“(External toolchain)  --->  ”配置完成以后如图所示:

然后将“Toolchain”配置为“(Custom toolchain)  ---> ”,表示使用用户自己的编译器,完成后如图:

随后的“Toolchain origin”要配置为“(Pre-installed toolchain)  ---> ”:

随后我们要将“Toolchain path (NEW) ”配置为我们自己交叉编译器的路径,这里如果大家之前也是跟着我配的的话,那么路径就是:

/usr/local/arm/gcc-arm-9.2-2019.12-x86_64-arm-none-linux-gnueabihf

我们直接填入即可:

完成以后如图所示:

此后我们还需要将“Toolchain prefix”修改为“$(ARCH)-none-linux-gnueabihf”,如图:

下方的“External toolchain gcc version ”我们选项“9.x”,“External toolchain kernel headers series”我们选择“4.20.x”,完成后如图所示:

然后下方的“External toolchain C library”我们选择“glibc/eglibc”:

最后我们需要将下方的“Toolchain has SSP support? (NEW)”、“Toolchain has RPC support? (NEW)”、“Toolchain has C++ support?”、“Enable MMU support (NEW) ”都选中,如图所示:

至此,我们的“Toolchain”就配置完成了。下面我们来配置“System configuration”,位置如图所示:

进入以后,可以看到以下选项:

同样的,这里只需要修改几个选项即可,首先是“System hostname”这是我们平台的名字,大家可以自行设置:

“System banner”表示系统的欢迎语,大家自行设置即可:

“Init system”我们这里选择“Busybox”:

“/dev management”我们选择“Dynamic using devtmpfs + mdev”:

这里我们选中“Enable root login with password”表示使能root用户的登录密码,在下方我们可以设置root用户的登录密码:

当然,这里的密码会在我们做Linux驱动开始时取消掉,不然我们每次进入系统都需要输入密码,非常不利于开发。这里作为测试,所以使能了密码。

至此,“System configuration”配置就完成了,下面我们来配置“Filesystem images”,在如图所示位置:

进入以后可以看到以下选项:

这里我们选中“ext2/3/4 root filesystem”,然后在下方新弹出的“ext2/3/4 variant”选项中选择“ext4”:

然后我们将下方的“exact size”改为1G:

至此“Filesystem images”配置就完成了。下面我们来配置“Target packages”,在如图所示位置:

进入以后,可以看到以下选项:

我们往下滑找到“System tools”选项并且进入,在如图所示位置:

进入以后,可以看到以下选项:

我们往下滑找到“kmod”并且选中:

因为buildroot在编译时会在一些国外的网站下载东西,因为网络问题可能会下载失败,所以这里我们需要将下载连接配置为国内镜像,这里我们进入“Build options”选项,在如图所示位置:

进入以后,可以看到以下选项:

我们进入“Mirrors and Download locations”选项,可以看到以下界面:

我们进行下面的修改:

Backup download site  :http://sources.buildroot.net
Kernel.org mirror     :https://mirror.bjtu.edu.cn/kernel/
GNU Software mirror   :http://mirrors.nju.edu.cn/gnu/
LuaRocks mirror       :https://luarocks.cn
CPAN mirror (Perl packages) :http://mirrors.nju.edu.cn/CPAN/

修改完成以后,如图所示:

至此,我们所有的配置都已经完成,我们将配置文件保存到“./configs/stm32mp1_atk_defconfig”目录中,作为默认配置,后面直接加载即可:

保存完成以后,我们使用下方的命令加载配置文件:

make stm32mp1_atk_defconfig

加载完成以后,可以看到,相关配置已经被写到了“.config”文件中:

我们使用下面的命令,这里的编译线程数大家根据自己的情况写即可:

make -j16

编译完成以后,如图所示:

这里我们进入Buildroot项目文件夹的“output/image”文件夹中,可以看到以下文件:

在“rootfs.tar”内就是我们编译的根文件系统了,下面来教大家如何挂载根文件系统。

这里我们要使用nfs来挂载根文件系统,所以这里大家需要确保自己的网络和nfs配置都没有问题,如果你还不会配置Uboot的网络和nfs可以看下面的文章:

UBOOT网络配置:[Linux]从零开始的STM32MP157 U-Boot网络命令讲解及相关配置_stm32mp157 联网-CSDN博客

这里我们在开发板一侧是可以ping到ubuntu的:

现在我们首先在nfs目录中新建一个名为“rootfs”的文件夹用来存放我们的根文件系统:

这里我们将刚才编译出来的“rootfs.tar”复制到新建的“rootfs”中:

然后使用下方的命令解压这个压缩包:

tar -xvf rootfs.tar

解压后我们可以看到以下文件夹,这些文件夹都是Linux的根文件,想必大家已经非常熟悉了:

最后我们使用下面的命令将原本的压缩包删掉:

rm -rf ./rootfs.tar

这里我们还需要修改以下nfs的配置文件,使用下面的命令打开配置文件:

sudo nano /etc/default/nfs-kernel-server

打开后可以看到以下内容:

我们在最后一行加上下面的内容:

RPCNFSDOPTS="--nfs-version 2,3,4 --debug --syslog" 

修改完以后如图所示: 

最后我们保存退出即可。

修改完配置文件以后,我们使用下面的命令重新启动软件:

sudo /etc/init.d/nfs-kernel-server restart 

这里显示ok以后,nfs的配置就修改完成了:

现在在开发板端,我们需要修改一下bootargs环境变量,使用下面的命令:

setenv bootargs console=ttySTM0,115200 root=/dev/nfs nfsroot=192.168.1.100:/home/chulingxiao/linux/nfs/rootfs,proto=tcp rw ip=192.168.1.106:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off

这里大家注意,这是一行命令,不要换行。大家使用时,需要修改几个地方,下面一一来讲,首先是“nfsroot=192.168.1.100:/home/chulingxiao/linux/nfs/rootfs”这里大家需要把这里的IP地址修改为自己Ubuntu的地址。后面的路径大家写自己的rootfs文件夹的路径。然后是“ip=192.168.1.106:192.168.1.100:192.168.1.1:255.255.255.0::eth0:off”这里有三个地址,按照从前到后的顺序是“开发板的IP地址”,“Ubuntu的IP地址”,“网关的IP地址”,大家根据自己的情况配置即可。

输入命令后,使用“saveenv”将环境变量保存到EMMC中:

完成以后,我们使用“boot”命令加载内核和根文件系统:

等内核启动以后,根文件系统就挂载完成了,并且出现了登录提示:

这里用户名我们使用root,密码就是我们设置的密码:

登录完成以后,可以看到前面变成了“#”,我们可以使用cd命令切换到根目录:

这里可以看到,我们的根文件系统已经启动完成了,虽然前面被提示一些目录找不到,但是问题不大,至少根文件系统启动成功,后面我们再来慢慢完善这个系统吧!

六、结语

        在本次教程中,我们编译并且成功启动了buildroot根文件系统,这也意味着我们移植了一个完整可用的Linux系统,在后续,我们会在此基础上进行完善以及进行LInux驱动开发,那么最后,感谢大家的观看!

相关文章:

[Linux]从零开始的STM32MP157 Buildroot根文件系统构建

一、前言 在前面的教程中,教了大家如何移植一个LInux的内核并且正确启动,我们发现Linux内核在启动后会出现一个错误,提示我们没有找到根文件系统。那么什么是根文件系统呢?之前我们使用Ubuntu编译了STM32MP157的TF-A,UBOOT,LINUX内…...

阿里云服务器 篇五(加更):短链服务网站:添加反垃圾邮件功能

文章目录 系列文章(可选)更新YOURLS版本安装 Compliance 插件安装 Phishtank-2.0 插件(可选)安装 httpBL 插件样例网站(不推荐)使用谷歌解决方案更多系列文章 阿里云服务器 篇一:申请和初始化 阿里云服务器 篇二:搭建静态网站 阿里云服务器 篇三:提交搜索引擎收录 阿…...

状压 DP 详解

文章目录 简介做法洛谷 P1171 简介 状压 DP 其实约等于一个 DP 的小技巧,一般应用在处理一个或多个集合的问题中(因为状压 DP 的下标就是一个集合),而且在 n n n 太大的时候建议不要使用这种方法。(如果你不懂&#…...

多模态大模型轻量化探索-视觉大模型SAM(Segment Anything Model)

往期,笔者基于LLava的数据对齐训练,搞了一个Reyes多模态大模型,并且看了些多模态大模型,相关开源的多模态大模型如:KimiVL、Internvl、QwenVL等,其视觉编码器的尺寸都比较大,如:Moon…...

数据分析_问题/优化

1 报表开发 1.1 数据问题 (1) 数据易错 问题描述 ①数据整合困难:数据来源多样、格式差异大,整合时处理不当易丢错数据. ②计算逻辑复杂:开发人员对复杂计算逻辑的理解产生偏差,会导致计算结果不准. 解决方案 ①建立数据标准,统一修正字段命名、数据类型、日期格式等 ②加强…...

我的stm32驱动电机驱动着突然就卡死程序死机了是为什么

电源不稳定或干扰 电机启动电流冲击:电机运行时可能导致电源电压跌落,影响STM32稳定性。需检查电源滤波电容、使用独立电源或增加稳压模块 地线干扰:电机与MCU共地时,高频噪声可能通过地线耦合,需采用隔离电路或磁耦芯…...

使用 Java 实现一个简单且高效的任务调度框架

目录 一、任务调度系统概述 (一)任务调度的目标 (二)任务调度框架的关键组成 二、任务状态设计 (一)任务状态流转设计 (二)任务表设计(SQL) 三、单机任…...

Git 完整教程:初学者分步指南

大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! Git 是一个分布式版本控制系统,可以帮助开发人员跟踪代码更改、与他人协作以及高效管理软件项目。无论您是初学者还是正在提升…...

数字智慧方案5856丨智慧环保综合解决方案(50页PPT)(文末有下载方式)

资料解读:智慧环保综合解决方案 详细资料请看本解读文章的最后内容。 随着城市化进程的加速和环境问题的日益严峻,智慧环保成为提升城市环境管理水平的重要手段。本文将对智慧环保综合解决方案进行详细解读,探讨其在实际应用中的需求、解决…...

VBA快速合并多列单元格

实例需求:工作表中第3行到第5行有如下图所示的数据表,为了方便展示,隐藏了部分列,实际数据为从C列到DO列。 现需要合并第3行和第4行相同内容的单元格,如第10行到第12行所示。 示例代码如下。 Sub MergeDemo()Dim dicM…...

区块链+IoT:创新场景落地背后的技术攻坚战

物联网(IoT)与区块链技术作为两大颠覆性技术,正通过深度融合推动各行各业的数字化转型。物联网通过连接海量设备实现数据互通与智能化管理,而区块链凭借去中心化、不可篡改和可追溯的特性,为物联网的安全性、隐私保护和…...

自动化测试项目2 --- 比特纵横 [软件测试实战 Java 篇]

目录 项目介绍 项目源码 库地址 项目功能测试 1. 自动化实施步骤 1.1 编写测试用例 1.2 自动化测试脚本开发 1.2.1 配置相关环境, 添加依赖 1.2.2 代码编写 2. 编写自动化脚本过程问题总结 2.1 Actons 方法的使用 2.2 等待的使用 2.3 页面操作 项目性能测试 1. 进…...

【学习笔记】深入理解Java虚拟机学习笔记——第1章 走进Java

第1章 走进Java 1.1 概述 Java成功的原因 1>一次编写到处运行 2>内存管理安全,自动回收 3>运行时编译 4>强大成熟的第三方库 1.2 Java技术体系 1>Java技术体系组成: -Java语言 -Java虚拟机实现 -class文件格式 -Java类库API -第三方J…...

JavaScript性能优化实战之运行时性能优化

在 JavaScript 开发中,运行时性能优化是确保网页响应迅速和流畅的重要环节。优化运行时性能不仅能提高用户体验,还能在高并发的情况下保证应用的稳定性。本文将细化几个常见的 JavaScript 运行时性能优化策略,帮助你提高代码执行效率。 1️⃣ 避免不必要的内存分配和释放 J…...

走进AI的奇妙世界:探索历史、革命与未来机遇

2022年11月30日,ChatGPT的横空出世像一枚深水炸弹,掀起了全球范围的AI狂潮。但这场革命并非偶然——它背后是80年AI发展史的厚积薄发。从图灵的哲学思辨到深度学习的技术突破,再到生成式AI的“涌现”时刻,AI正以惊人的速度模糊人机…...

用c 编写的笔记搜索程序

{XXX文本记录} 文本记录格式 xxx 搜索词条 #include <stdio.h> #include <string.h> #include <stdlib.h>int main(void){FILE *ffopen("help.txt","r");if(fNULL){perror("file");return -1;}char nr[2000];f…...

鼎讯信通 智能通信干扰设备:多频段多模态信号压制解决方案

在万物互联时代&#xff0c;通信安全已成为现代社会的核心基础设施防护重点。面对日益复杂的电磁环境挑战&#xff0c;新一代智能通信干扰设备通过技术创新实现了信号压制能力的革命性突破。本文将深入解析该设备的八大核心功能与技术特性&#xff0c;展现其在商业通信保障、工…...

软件测试概念

这里写目录标题 需求开发模型软件生命周期瀑布模型螺旋模型增量模型、迭代模型敏捷模型Scrum 测试模型V模型W模型&#xff08;双V模型&#xff09; 需求 用户需求&#xff1a;没有经过合理的评估&#xff0c;通常就是一句话 软件需求&#xff1a;是开发人员和测试人员执行工作…...

数据库性能杀手与调优实践

目录 前言一、索引缺失引发的全表扫描灾难1.现象与影响2.优化策略 二、SELECT * 的隐性成本1.危害分析2.优化实践 三、分页查询的性能陷阱1.深度分页问题2.优化方案对比 四、执行计划分析方法论1.关键指标解读2.典型劣化模式识别 五、综合优化最佳实践总结 前言 在数据库应用开…...

初始化列表详解

1.类中包含以下成员&#xff0c;必须放在初始化列表位置进行初始化&#xff1a; 1. 引用成员变量 2.const成员变量 3. 自定义类型成员(且该类没有默认构造函数时 ) 2. 成员变量在类中声明次序就是其在初始化列表中的初始化顺序&#xff0c;与其在初始化列表中的先后次序无关…...

【CVE-2025-1094】:PostgreSQL 14.15 SQL注入漏洞导致的RCE_ 利用代码和分析

目标 PostgreSQL 14.15BeyondTrust Privileged Remote Access (PRA) 和 Remote Support (RS) 软件受影响的版本:使用PostgreSQL 14.15及其版本的BeyondTrust产品Explain CVE-2025-1094 是 PostgreSQL 14.15 版本的 psql 交互式工具中发现的 SQL 注入漏洞。由于输入值的验证不…...

【验证技能】VIP项目大总结

VIP项目快做一段落了&#xff0c;历时一年半&#xff0c;也该要一个大汇总。 VIP简介 VIP开发流程 VIP难点 进程同步 打拍插入不同bit位宽数据问题。 动态升降lane VIP做的不好的地方和改进想法 各层之间交互 testsuite两端关键 所有层的实现架构不统一 VIP经验 ** 架构…...

MyBatis 参数处理全解析

在 Java 开发领域&#xff0c;MyBatis 作为一款优秀的持久层框架&#xff0c;凭借其简洁的设计和强大的功能&#xff0c;受到了广大开发者的青睐。而参数处理作为 MyBatis 中一个至关重要的环节&#xff0c;掌握好它能让我们更高效地使用 MyBatis 进行数据库操作。本文将全面深…...

【自然语言处理与大模型】使用Xtuner进行QLoRA微调实操

本文首先对Xtuner这一微调框架进行简单的介绍。手把手演示如何使用Xtuner对模型进行微调训练&#xff0c;包括数据准备、训练命令执行及训练过程中的监控技巧。最后&#xff0c;在完成微调之后&#xff0c;本文还将介绍如何对微调结果进行简单对话测试。 一、Xtuner微调框架 X…...

2023华为od统一考试B卷【二叉树中序遍历】

前言 博主刷的华为机考题&#xff0c;代码仅供参考&#xff0c;因为没有后台数据&#xff0c;可能有没考虑到的情况 如果感觉对你有帮助&#xff0c;请点点关注点点赞吧&#xff0c;谢谢你&#xff01; 题目描述 思路 0.用Character数组存储树&#xff0c;index下标的左右…...

Midjourney 绘画 + AI 配音:组合玩法打造爆款短视频!

一、引言:AI 重构短视频创作范式 在某短视频工作室的深夜剪辑室里,资深编导正在为一条古风剧情视频发愁:预算有限无法实拍敦煌场景,人工绘制分镜耗时 3 天,配音演员档期排到一周后。而使用 Midjourney 生成敦煌壁画风格的场景图仅需 15 分钟,AI 配音工具实时生成多角色台…...

敏感词 v0.25.1 新特性之返回匹配词,修正 tags 标签

开源项目 敏感词核心 https://github.com/houbb/sensitive-word 敏感词控台 https://github.com/houbb/sensitive-word-admin 版本特性 大家好&#xff0c;我是老马。 敏感词以前在实现的时候&#xff0c;没有返回底层实际匹配的词&#xff0c;有时候问题排查非常耗费时间。 …...

【多线程】六、基于阻塞队列的生产者消费者模型

文章目录 Ⅰ. 生产者消费者模型的概念Ⅱ. 生产者消费者模型的优点Ⅲ. 基于阻塞队列的生产者消费者模型MakefileBlock_queue.hpptask.hpptest.cppⅣ. 如何理解提高了效率❓❓❓Ⅰ. 生产者消费者模型的概念 ​ 生产者消费者模型是一种常见的并发模式,用于解决生产者和消费者之间…...

解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南

解决Flutter项目中Gradle构建Running Gradle task ‘assembleDebug‘卡顿问题的终极指南 前言 在开发Flutter应用时,经常会遇到Gradle构建卡在Running Gradle task assembleDebug阶段的问题。本文将分享如何通过配置华为云镜像和使用自定义脚本下载依赖的方法解决这些问题。…...

IntelliJ IDEA 保姆级使用教程

文章目录 一、创建项目二、创建模块三、创建包四、创建类五、编写代码六、运行代码注意 七、IDEA 常见设置1、主题2、字体3、背景色 八、IDEA 常用快捷键九、IDEA 常见操作9.1、类操作9.1.1、删除类文件9.1.2、修改类名称注意 9.2、模块操作9.2.1、修改模块名快速查看 9.2.2、导…...

从此,K8S入门0门槛!

前言 当你想要入门K8S的时候&#xff0c;往往会被各种概念搞的晕乎乎的&#xff0c;什么API Server&#xff0c;Scheduler&#xff0c;Controller manager&#xff0c;Etcd&#xff0c;Pod&#xff0c;Kubelet&#xff0c;kube-proxy&#xff0c;deployment…… 哪怕你使用了…...

vue2和vue3组件如何监听子组件生命周期

在 Vue 中监听子组件的生命周期是一个常见需求&#xff0c;但 Vue 官方并不直接推荐这么做&#xff0c;因为这会打破组件的封装性。但在**一些特定场景&#xff08;如自动化监控、封装逻辑复用&#xff09;**下仍是有意义的。 下面分别讲解 Vue 2 和 Vue 3 中如何监听 子组件的…...

如何用Python绘制两个圆之间的8条公切线

引言 在几何学中&#xff0c;两圆之间存在多种类型的公共切线。本文将通过Python代码演示如何绘制两个同心圆&#xff08;半径分别为1.0和3.0&#xff09;之间的8条公切线&#xff0c;并解释相关数学原理与代码实现细节。 环境准备 import matplotlib.pyplot as plt import …...

会话历史管理——持久化

​​需求场景​​​​推荐方案​​​​理由​​中小企业级应用&#xff0c;需复杂查询MySQL/PostgreSQL事务支持完善&#xff0c;开发成本低海量数据高并发写入Cassandra水平扩展性强&#xff0c;写入性能高非结构化历史数据快速检索MongoDB灵活存储&#xff0c;内置全文检索本…...

C++之IO流

目录 一、C语言的输入与输出 二、流是什么 三、CIO流 3.1、C标准IO流 3.2、C文件IO流 四、stringstream的简单介绍 一、C语言的输入与输出 C语言中我们用到的最频繁的输入输出方式就是scanf ()与printf()。 scanf(): 从标准输入设备(键盘)读取数据&#xff0c;并将值存放…...

maven install时报错:【无效的目标发行版: 17】

在很多次运行项目前的maven install时&#xff0c;我总是遇到无效的目标发行版: 17的问题&#xff0c;解决过之后就又忘了怎么解决&#xff0c;浪费了很多时间。。 今天把他总结一下&#xff0c;如图报错&#xff1a; 解决方法 注意&#xff1a; 如果只想解决这个项目的问题…...

开闭原则(OCP)

非常棒的问题&#xff01;&#x1f50d; 开闭原则&#xff08;OCP, Open/Closed Principle&#xff09;是软件设计的核心原则之一&#xff0c;下面我将从定义、意义、优劣分析、Python示例和结构图五个方面完整解析给你。 &#x1f9e0; 什么是开闭原则&#xff1f; 开闭原则&a…...

FHQ Treap

按值分裂 /* 按值x分裂Treap&#xff1a;将树u分裂为<x的树l和>x的树r */ void split(int u, int x, int& l, int& r) {if (!u) { l r 0; return; } // 空树直接返回if (t[u].val < x) { // 当前节点值<x&#xff0c;应放入左树l u; …...

题解传送门

做个算法分类&#xff0c;这样找特定算法的题目就方便多了23333 竞赛工具 【竞赛工具】——sublime text4 xcpc竞赛向配置教程 【竞赛工具】——vscode xcpc竞赛向配置教程 算法讲解 [算法学习]——通过RMQ与dfs序实现O(1)求LCA&#xff08;含封装板子&#xff09; [算法…...

ASP.NET MVC​ 入门与提高指南七

39. 量子安全通信与 MVC 应用保障 39.1 量子安全通信概念 量子安全通信基于量子力学原理&#xff0c;利用量子态的特性&#xff08;如量子纠缠、量子不可克隆定理&#xff09;来实现信息的安全传输。与传统加密方式相比&#xff0c;量子安全通信能够提供更高的安全性&#xf…...

Linux工作台文件操作命令全流程解析

全文目录 1 确认当前工作路径2 导航与目录管理2.1 关键命令2.2 逻辑衔接 3 文件基础操作3.1 创建 → 备份 → 重命名 → 清理3.2 文件查看和编辑3.3 文件链接3.4 文件diff 4 文件权限与所有权管理5 文件打包与归档6 参考文献 写在前面 shell是一种命令解释器&#xff0c;它提供…...

03 - spring security自定义登出页面

spring security自定义登出页面 文档 00 - spring security框架使用01 - spring security自定义登录页面02 - spring security基于配置文件及内存的账号密码 自定义登出页面 调整配置类WebSecurityConfig.java package xin.yangshuai.springsecurity03.config;import org.…...

unity webgl netbox2本地部署打开运行

unity webgl netbox2本地部署打开运行 复制NetBox2.exe和index.html 在同一级目录下使用&#xff0c;双击netbox2.exe。 下载文件 下载地址&#xff1a; netbox2.exe...

华为OD机试真题 Java 实现【水库蓄水问题】

前言 博主刷的华为机考题&#xff0c;代码仅供参考&#xff0c;因为没有后台数据&#xff0c;可能有没考虑到的情况 如果感觉对你有帮助&#xff0c;请点点关注点点赞吧&#xff0c;谢谢你&#xff01; 题目描述 思路 1. 其实就是找一个最大的水坑&#xff0c;两个…...

A2A 协议与 MCP 协议:智能代理生态系统的双轮驱动

本文将探讨A2A 协议与MCP 协议的特点、区别及协同作用&#xff0c;帮助开发者和产品设计师更好地理解这一新兴技术领域。 A2A 协议&#xff1a;打造代理间的沟通桥梁 A2A 协议的核心概念 A2A 协议是由 Google 与 50 多家行业合作伙伴共同开发的开放协议&#xff0c;旨在实现…...

使用AI-01开发板和开源后端服务搭建整套小智服务系统

使用AI-01开发板和开源后端服务搭建整套小智服务系统 四博智联的AI-01开发板&#xff0c;基于乐鑫ESP32-C2 专属定制的离线语音模组&#xff0c;能够完美的接入小智AI服务平台&#xff0c;再使用开源后端服务&#xff0c;就能够搭建一个完整的小智AI服务系统了。 下面是具体…...

第三章 权限维持-linux权限维持-隐藏

简介 ssh rootenv.xj.edisec.net -p 密码 xjqxwcyc 1.黑客隐藏的隐藏的文件 完整路径md5 2.黑客隐藏的文件反弹shell的ip端口 {ip:port} 3.黑客提权所用的命令 完整路径的md5 flag{md5} 4.黑客尝试注入恶意代码的工具完整路径md5 5.使用命令运行 ./x.xx 执行该文件 将查询的…...

Linux操作系统系统编程:x86-64架构下的系统调用

在Linux操作系统里&#xff0c;系统编程如同精密仪器的核心部件&#xff0c;掌控着系统运行的关键。而 x86-64 架构下的系统调用&#xff0c;更是连接用户空间程序与内核的关键桥梁。你可以把用户空间的程序想象成一个个 “工匠”&#xff0c;它们有着各式各样的需求&#xff0…...

linux下如何在一个录目中将一个文件复制到另一个录目,删除目录

一.文件复制到另一个目录 在Linux系统中&#xff0c;要将一个文件从一个目录复制到另一个目录&#xff0c;你可以使用cp命令。下面是一些基本的用法&#xff1a; 1. 使用绝对路径 如果你知道文件的绝对路径和目标目录的绝对路径&#xff0c;你可以直接使用cp命令。例如&…...

用Selenium开启自动化网页交互与数据抓取之旅

用Selenium开启自动化网页交互与数据抓取之旅 在当今数字化时代&#xff0c;数据的价值不言而喻&#xff0c;而网页作为海量数据的重要载体&#xff0c;如何高效获取其中的关键信息成为众多开发者和数据爱好者关注的焦点。Selenium这一强大工具&#xff0c;为我们打开了自动化…...