嵌入式 ARM Linux 系统构成(3):根文件系统(Root File System)
目录
一、根文件系统的原理与重要性
二、根文件系统的构成
2.1. 基本目录结构
2.2. 核心组件
2.3. 设备驱动
2.4. 网络工具和协议
2.5. 调试工具
三、根文件系统的制作方法
四、根文件系统的测试
五、构建根文件系统的关键技术
5.1. 最小化构建工具
5.2. 关键配置文件
5.3. 动态库优化
六、嵌入式根文件系统类型
七、优化根文件系统
八、常见问题解决
九、参考资料
在嵌入式 ARM Linux 系统的构建中,根文件系统(Root File System,简称根文件系统)扮演着至关重要的角色。它是整个系统运行的基础,承载着系统运行所需的各种文件和目录,如同大树的根系,为系统的正常运转提供必要的支持。
一、根文件系统的原理与重要性
根文件系统是 Linux 系统中所有其他文件系统和目录的起源。在 Linux 中,所有文件、目录、设备和驱动都被组织为一个树型结构,根文件系统就是这个结构的根节点。它是 Linux 内核启动后挂载的第一个文件系统,内核代码映像文件保存在根文件系统中,系统引导程序会在其挂载之后将一些初始化脚本和服务加载到内存中去运行。
一套完整的 Linux 系统,只有内核本身是无法正常工作的。内核需要 rootfs 上的 etc 目录下的配置文件、/bin /sbin 等目录下的 shell 命令,以及 /lib 目录下的库文件等相配合才能工作。如果没有根文件系统,Linux 内核在启动时会提示内核崩溃(Kernel panic)。
其主要作用包括:
-
提供可执行程序:存放系统启动时需要运行的初始化脚本、守护进程等可执行文件,确保系统能够顺利启动并运行各种服务。例如,系统的 init 进程就是从根文件系统中加载并执行的,它负责启动其他进程和服务。
-
存储库文件:包含了系统和应用程序运行所需的各种库文件。这些库文件提供了函数和功能的实现,使得应用程序能够调用它们来完成特定的任务。比如,C 语言标准库、图形库等。
-
保存配置信息:根文件系统中的配置文件记录了系统和应用程序的各种设置和参数。例如,网络配置文件用于设置网络接口的 IP 地址、子网掩码等信息;系统服务的配置文件则决定了服务的运行方式和参数。
-
管理设备文件:在 Linux 系统中,设备被抽象为文件。根文件系统中的设备文件目录(如 /dev)包含了各种设备文件,通过这些文件,系统可以对硬件设备进行访问和控制。例如,/dev/ttyS0 可能代表串口设备,应用程序可以通过操作这个文件来与串口设备进行通信。
二、根文件系统的构成
2.1. 基本目录结构
嵌入式 ARM Linux 系统的根文件系统通常由以下几个关键部分组成:
目录 | 核心内容 | 典型示例文件/工具 |
---|---|---|
/bin | 基础用户命令(所有用户可用) | ls , cp , sh , mount |
/sbin | 系统管理员命令(需root权限) | ifconfig , reboot , fsck |
/etc | 系统配置文件 | fstab , passwd , network/ |
/lib | 动态链接库(如glibc、内核模块) | libc.so , ld-linux-armhf.so.3 |
/dev | 设备节点文件(由内核或udev 生成) | ttyS0 , mmcblk0p1 , gpiochip0 |
/proc | 内核和进程信息的虚拟文件系统(运行时生成) | cpuinfo , meminfo |
/sys | 内核对象和硬件控制的虚拟文件系统 | 电源管理、GPIO控制接口 |
/usr | 用户级程序和非关键库(可挂载为独立分区) | /usr/bin , /usr/lib |
/var | 可变数据(日志、缓存等) | /var/log/messages |
/tmp | 临时文件(通常挂载为tmpfs 以提高性能) | - |
/root | root用户的家目录 | - |
/home | 普通用户的家目录(嵌入式系统可能省略) | - |
2.2. 核心组件
- init 系统:负责系统启动过程中的初始化和进程管理,如 SysVinit、Upstart 或 systemd。
- Shell:提供用户与操作系统交互的界面,如 Bash、Sh 等。
- 基本工具:如 ls、cp、mv、rm 等文件操作命令,以及 grep、sed、awk 等文本处理工具。
- 网络配置工具:如 ifconfig、route、ping 等,用于配置和管理网络连接。
2.3. 设备驱动
虽然设备驱动通常包含在内核中,但某些特定设备或外设的驱动可能以用户空间程序的形式存在,并位于根文件系统的某个目录中。
2.4. 网络工具和协议
如 SSH、Telnet、FTP、HTTP、DHCP、DNS 等。这些工具和协议提供了系统连接其他网络设备、数据交换和网络管理的能力。
2.5. 调试工具
如 gdb、strace、top 等。这些工具能够帮助开发者定位和解决系统中的各种问题和异常。
三、根文件系统的制作方法
制作根文件系统的方法有多种,下面介绍一种常用的基于 BusyBox 的方法:
①准备开发环境:
- 安装交叉编译工具链,如 arm-linux-gcc。
- 下载 BusyBox 源码。
②配置 BusyBox:
- 解压 BusyBox 源码并进入源码目录。
- 运行
make menuconfig
进入配置界面。 - 选择需要的功能和配置选项,如选择静态链接、设置安装前缀等。
③编译 BusyBox:
- 运行
make
进行编译。 - 运行
make install
将编译结果安装到指定的目录(如 rootfs)。
④创建根文件系统目录结构:
- 在开发主机中创建一个空文件夹作为根文件系统的雏形。
- 在该文件夹中创建必要的目录,如 /bin、/sbin、/etc、/lib 等。
⑤添加必要的文件:
- 将 BusyBox 安装到根文件系统目录中。
- 复制必要的库文件到 /lib 目录。
- 创建必要的配置文件到 /etc 目录。
⑥制作根文件系统镜像:使用专用工具(如 mke2fs)将文件夹形式的根文件系统制作成可供烧录的镜像文件。
四、根文件系统的测试
制作完成后,需要对根文件系统进行测试以确保其能够正常工作。常用的测试方法包括:
①使用 NFS 挂载测试:
- 在开发主机中搭建 NFS 服务器,并导出根文件系统目录。
- 在开发板中配置 NFS 启动参数,通过 NFS 挂载根文件系统进行测试。
②烧录到块设备测试:
- 将根文件系统镜像烧录到开发板的块设备(如 EMMC、NAND Flash)中。
- 启动开发板,测试根文件系统是否能够正常挂载和运行。
五、构建根文件系统的关键技术
5.1. 最小化构建工具
-
BusyBox:集成精简版UNIX工具(
ls
,ifconfig
,init
等),替代GNU Coreutils
# 编译BusyBox示例
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig
make menuconfig # 选择所需工具
make install # 输出到_install目录
-
Buildroot/Yocto:自动化构建工具链、库和文件系统
-
Buildroot适合快速构建轻量级系统
-
Yocto适合复杂定制和长期维护
-
5.2. 关键配置文件
-
/etc/inittab:定义系统初始化行为(串口登录、启动脚本)
::sysinit:/etc/init.d/rcS
ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100
- /etc/fstab:定义文件系统挂载点
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults,size=64M 0 0
-
/etc/init.d/rcS:系统启动脚本(挂载文件系统、启动服务)
5.3. 动态库优化
-
使用
arm-linux-gnueabihf-strip
裁剪调试符号 -
通过
ldd
检查依赖:
arm-linux-gnueabihf-ldd /bin/busybox
-
可选方案:静态编译(增大体积但减少依赖)
六、嵌入式根文件系统类型
类型 | 特点 | 适用场景 |
---|---|---|
initramfs | 压缩的CPIO归档,直接嵌入内核镜像 | 早期启动/临时根文件系统 |
squashfs | 只读压缩文件系统(节省空间) | 固件升级(与可写分区配合使用) |
UBIFS | 专为NAND Flash设计(支持磨损均衡、坏块管理) | NAND Flash存储设备 |
ext4 | 经典日志文件系统(支持读写) | eMMC/SD卡等块设备 |
tmpfs | 内存文件系统(高速但易失) | /tmp目录或临时数据存储 |
七、优化根文件系统
在嵌入式系统中,资源有限,因此需要对根文件系统进行优化以提高性能和降低功耗。以下是一些优化建议:
①空间节省:
-
删除未使用语言包:
rm -rf /usr/share/locale/*
-
使用
musl-libc
替代glibc
(更小的体积)
②只读优化:
# 挂载为只读(提高可靠性)
mount -o remount,ro /
③调试手段:
-
通过
strace
跟踪系统调用 -
使用
df -h
检查存储空间占用
④裁剪不必要的组件:移除根文件系统中不必要的程序和库文件,以减少系统的大小和复杂度。
⑤使用压缩文件系统:选择压缩文件系统(如 CRAMFS、SquashFS 等)来减少根文件系统的大小,同时提高读取速度。
⑥优化启动过程:使用轻量级的 init 系统(如 systemd 的简化版或 BusyBox 的 init)来加快系统启动速度。
⑦动态加载库文件:使用动态链接库(Shared Libraries)来减少程序占用的空间,并允许在运行时按需加载库文件。
⑧调整系统配置:根据实际需求调整系统配置文件(如 /etc/inittab
、/etc/fstab
等),以减少不必要的启动服务和挂载点。
八、常见问题解决
①启动失败:Kernel panic - not syncing: No init found
-
检查内核命令行参数:
root=
是否正确指定设备 -
确认
/sbin/init
或/bin/sh
存在且有可执行权限
②动态库缺失
-
使用
LD_LIBRARY_PATH
指定库路径 -
通过
readelf -d <binary>
查看依赖库
③存储空间不足
-
启用压缩文件系统(如squashfs+lzo)
-
将大文件移到独立分区(如/usr挂载到单独分区)
九、参考资料
- 《嵌入式 Linux 应用开发完全手册》:作者宋宝华,这本书全面深入地介绍了嵌入式 Linux 系统开发的各个方面,包括根文件系统的概念、构建方法以及在实际项目中的应用。
- 《深入理解 Linux 内核》(第三版):虽然主要聚焦于 Linux 内核,但其中关于文件系统的部分,包括根文件系统的原理和机制,讲解得非常深入细致。
- 《ARM 嵌入式 Linux 系统开发实战指南》:详细介绍了基于 ARM 架构的嵌入式 Linux 系统开发流程,其中对根文件系统的构建、配置以及优化等方面都有专门的章节进行讲解。
- Linux 官方文档(The Linux Kernel documentation — The Linux Kernel documentation):Linux 内核官方文档中包含了关于各种文件系统的详细技术文档,对于深入了解根文件系统的实现原理和内核接口非常有价值。
- Buildroot 官方文档(https://buildroot.org/downloads/manual/manual.html):Buildroot 是一个常用的嵌入式 Linux 系统构建工具,其官方文档详细介绍了如何使用 Buildroot 构建根文件系统,包括配置选项、软件包管理以及生成根文件系统的具体步骤等。
- Yocto Project 官方文档(Welcome to the Yocto Project Documentation — The Yocto Project ® 5.1.999 documentation):Yocto Project 是一个功能强大的嵌入式 Linux 开发框架,官方文档对其各个方面都有详细的说明。在根文件系统构建方面,文档中介绍了 Yocto Project 的构建流程、层叠架构以及如何定制根文件系统的内容和结构等,适合想要深入学习和使用 Yocto Project 进行嵌入式系统开发的读者。
- Linux 中国(Linux 中国◆开源社区):该网站上有许多关于嵌入式 Linux 系统开发的博客文章,其中不乏关于根文件系统的技术分享。博主们会结合自己的实际开发经验,介绍根文件系统的构建技巧、常见问题及解决方法等,内容丰富且实用。
- Linux 社区(https://www.linux.org/):这是一个全球性的 Linux 技术社区,用户可以在论坛上提问、分享经验和讨论技术问题。
- 电子发烧友论坛(电子发烧友):作为电子技术领域的专业论坛,电子发烧友论坛上有很多关于嵌入式系统开发的讨论
- ARM 社区(Challenge Validation):ARM 官方社区提供了丰富的关于 ARM 架构的技术资源和讨论平台。
相关文章:
嵌入式 ARM Linux 系统构成(3):根文件系统(Root File System)
目录 一、根文件系统的原理与重要性 二、根文件系统的构成 2.1. 基本目录结构 2.2. 核心组件 2.3. 设备驱动 2.4. 网络工具和协议 2.5. 调试工具 三、根文件系统的制作方法 四、根文件系统的测试 五、构建根文件系统的关键技术 5.1. 最小化构建工具 5.2. 关键配置文…...
electron + vue3 + vite 主进程到渲染进程的单向通信
用示例讲解下主进程到渲染进程的单向通信 初始版本项目结构可参考项目:https://github.com/ylpxzx/electron-forge-project/tree/init_project 主进程到渲染进程(单向) 以Electron官方文档给出的”主进程主动触发动作,发送内容给渲…...
基于Python实现的智能旅游推荐系统(Django)
基于Python实现的智能旅游推荐系统(Django) 开发语言:Python 数据库:MySQL所用到的知识:Django框架工具:pycharm、Navicat 系统功能实现 总体设计 系统实现 系统首页模块 统首页页面主要包括首页,旅游资讯,景点信息…...
分布式存储—— HBase数据模型 详解
目录 1.3 HBase数据模型 1.3.1 两类数据模型 1.3.2 数据模型的重要概念 1.3.3 数据模型的操作 1.3.4 数据模型的特殊属性 1.3.5 CAP原理与最终一致性 1.3.6 小结 本文章参考、总结于学校教材课本《HBase开发与应用》 1.3 HBase数据模型 在开始学习HBase之前非常…...
使用AI整理知识点--WPF动画核心知识
一、WPF动画基础 1、动画本质 通过随时间改变依赖属性值实现视觉效果(如位置、透明度、颜色等)。 依赖属性必须支持 DependencyProperty,且需是可动画的(如 Double, Color, Point 等)。 2、动画三要素 起始值 (Fr…...
计算光学成像与光学计算概论
计算光学成像所涉及研究的内容非常广泛,虽然计算光学成像的研究内容是发散的,但目的都是一致的:如何让相机记录到客观实物更丰富的信息,延伸并扩展人眼的视觉感知。总的来说,计算光学成像现阶段已经取得了很多令人振奋…...
100天精通Python(爬虫篇)——第115天:爬虫在线小工具_Curl转python爬虫代码工具(快速构建初始爬虫代码)
文章目录 一、curl是什么?二、爬虫在线小工具(牛逼puls)三、实战操作 一、curl是什么? 基本概念:curl 支持多种协议,如 HTTP、HTTPS、FTP、SFTP 等,可用于从服务器获取数据或向服务器发送数据&a…...
点云软件VeloView开发环境搭建与编译
官方编译说明 LidarView / LidarView-Superbuild GitLab 我的编译过程: 安装vs2019,windows sdk,qt5.14.2(没安装到5.15.7),git,cmake3.31,python3.7.9,ninja下载放到…...
PHP配置虚拟主机
虚拟主机: 不是真实存在的主机, 因为一台电脑理论上讲只能作为一个网站: 事实上,一个网站是一个文件夹. 在本地开发中,通过虚拟主机配置可以实现多域名独立访问不同项目目录(如 www.project1.test 和 www.project2.test),以 ”XAM…...
笔记四:C语言中的文件和文件操作
Faye:只要有正确的伴奏,什么都能变成好旋律。 ---------《寻找天堂》 目录 一、文件介绍 1.1程序文件 1.2 数据文件 1.3 文件名 二、文件的打开和关闭 2.1 文件指针 2.2.文件的打开和关闭 2.3 文件读取结束的判定 三、 文件的顺序读写 3.1 顺序读写…...
PyTorch中的线性变换:nn.Parameter VS nn.Linear
self.weight nn.Parameter(torch.randn(in_channels, out_channels)) 和 self.linear nn.Linear(in_channels, out_channels) 并不完全一致,尽管它们都可以用于实现线性变换(即全连接层),但它们的使用方式和内部实现有所不同。 …...
计算机网络(1) 网络通信基础,协议介绍,通信框架
网络结构模式 C/S-----客户端和服务器 B/S -----浏览器服务器 MAC地址 每一个网卡都拥有独一无二的48位串行号,也即MAC地址,也叫做物理地址、硬件地址或者是局域网地址 MAC地址表示为12个16进制数 如00-16-EA-AE-3C-40 (每一个数可以用四个…...
PHP之常量
在你有别的编程语言的基础下,你想学习PHP,可能要了解的一些关于常量的信息。 PHP中的常量不用指定数据类型,可以使用两次方法定义。 使用const //定义常量 const B 2; echo B . PHP_EOL;使用define define("A", 1); echo A . P…...
苦瓜书盘官网,免费pdf/mobi电子书下载网站
苦瓜书盘(kgbook)是一个专注于提供6英寸PDF和MOBI格式电子书的免费下载平台,专为电子阅读器用户设计。该平台为用户提供了丰富的电子书资源,涵盖文学、历史、科学、技术等多个领域,旨在打造一个全面的电子书资源库。用…...
通过 Docker openssl 容器生成生成Nginx证书文件
使用 alpine/openssl 镜像生成证书 1. 拉取容器 [rootlocalhost ~]# docker run --rm alpine/openssl version OpenSSL 3.3.3 11 Feb 2025 (Library: OpenSSL 3.3.3 11 Feb 2025)2. 运行 alpine/openssl 生成证书(Nginx) # 生成1个.key私钥文件&#…...
第四十一:Axios 模型的 get ,post请求
Axios 的 get 请求方式 9.双向数据绑定 v-model - 邓瑞编程 Axios 的 post 请求方式:...
从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十) 收发消息
1.聊天框 首先我们完善前端的消息输入框 components下面新建MessageInput组件 import { useState,useRef } from "react" import {X,Image,Send} from "lucide-react"import { useChatStore } from "../store/useChatStore" import toast from…...
Spring Boot面试问答
1. Spring Boot 基础知识 问题 1:什么是Spring Boot?它与Spring框架有何不同? 回答: Spring Boot是基于Spring框架的一个开源框架,旨在简化新Spring应用的初始化和开发过程。与传统的Spring框架相比,Spring Boot提供了以下优势: 自动配置:根据项目依赖自动配置Spring…...
win11编译llama_cpp_python cuda128 RTX30/40/50版本
Geforce 50xx系显卡最低支持cuda128,llama_cpp_python官方源只有cpu版本,没有cuda版本,所以自己基于0.3.5版本源码编译一个RTX 30xx/40xx/50xx版本。 1. 前置条件 1. 访问https://developer.download.nvidia.cn/compute/cuda/12.8.0/local_…...
2025-03-07 学习记录--C/C++-C语言 截取字符串的三种方法
C语言 截取字符串 ⭐️ 方法 1:使用 strncpy 函数 🍭 strncpy 是C标准库中的一个函数,用于从源字符串中复制指定长度的字符到目标字符串中。【详情请查看我的另一篇文章】 示例代码:🌰 #include <stdio.h> #in…...
doris: Oracle
Apache Doris JDBC Catalog 支持通过标准 JDBC 接口连接 Oracle 数据库。本文档介绍如何配置 Oracle 数据库连接。 使用须知 要连接到 Oracle 数据库,您需要 Oracle 19c, 18c, 12c, 11g 或 10g。 Oracle 数据库的 JDBC 驱动程序,您可以从 Maven 仓库…...
【神经网络】python实现神经网络(一)——数据集获取
一.概述 在文章【机器学习】一个例子带你了解神经网络是什么中,我们大致了解神经网络的正向信息传导、反向传导以及学习过程的大致流程,现在我们正式开始进行代码的实现,首先我们来实现第一步的运算过程模拟讲解:正向传导。本次代…...
自学嵌入式第27天------TCP和UDP,URL爬虫
1. TCP和UDP区别 **TCP(传输控制协议)和UDP(用户数据报协议)**是两种主要的传输层协议,它们在数据传输方式上有显著区别: 连接性: TCP是面向连接的协议,通信前需通过三次握手建立连…...
【虚拟化】Docker Desktop 架构简介
在阅读前您需要了解 docker 架构:Docker architecture WSL 技术:什么是 WSL 2 1.Hyper-V backend 我们知道,Docker Desktop 最开始的架构的后端是采用的 Hyper-V。 Docker daemon (dockerd) 运行在一个 Linux distro (LinuxKit build) 中&…...
C#程序加密与解密Demo程序示例
目录 一、加密程序功能介绍 1、加密用途 2、功能 3、程序说明 4、加密过程 5、授权的注册文件保存方式 二、加密程序使用步骤 1、步骤一 编辑2、步骤二 3、步骤三 4、步骤四 三、核心代码说明 1、获取电脑CPU 信息 2、获取硬盘卷标号 3、机器码生成 3、 生成…...
200W数据需要去重,如何优化?
优化去重逻辑的时间取决于多个因素,包括数据量、数据结构、硬件性能(CPU、内存)、去重算法的实现方式等。以下是对优化去重逻辑的详细分析和预期优化效果: 1. 去重逻辑的性能瓶颈 时间复杂度:使用HashSet去重的时间复…...
理解 UDP 协议与实战:Android 使用 UDP 发送和接收消息
一、UDP 协议概述 UDP(User Datagram Protocol,用户数据报协议)是一个无连接的网络通信协议。与 TCP 不同,UDP 不建立连接,不保证数据的顺序和完整性。它的特点是简单、高效,适用于实时性要求较高、对数据…...
7V 至 30V 的超宽 VIN 输入范围,转换效率高达 96%的WD5030
WD5030 具备 7V 至 30V 的超宽 VIN 输入范围,这一特性使其能够适应多种不同电压等级的供电环境,无论是在工业设备中常见的较高电压输入,还是在一些便携式设备经过初步升压后的电压,WD5030 都能轻松应对,极大地拓展了应…...
基于 LeNet 网络的 MNIST 数据集图像分类
1.LeNet的原始实验数据集MNIST 名称:MNIST手写数字数据集 数据类型:灰度图 (一通道) 图像大小:28*28 类别数:10类(数字0-9) 1.通过torchvision.datasets.MNIST下载并保存到本地…...
智能体开发:推理-行动(ReAct)思维链提示
人类在处理一个需要多个步骤才能完成任务时,显著特点是能够将言语推理(内心独白)和实际行动融合在一起,在面对陌生或不确定的情况时通过这种方法学习新知识,做出决策,并执行,从而应对复杂的任务…...
Android Native 之 文件系统挂载
一、文件系统挂载流程概述 二、文件系统挂载流程细节 1、Init启动阶段 众所周知,init进程为android系统的第一个进程,也是native世界的开端,要想让整个android世界能够稳定的运行,文件系统的创建和初始化是必不可少的ÿ…...
DirectX12(D3D12)基础教程四 入门指南
本章主要讲了些D3D12概念和理论,对第一、二章相关概念的补充和纠正,要的理解D3D12概念和理论基础,结合代码加深理解。 命令队列和命令列表 为了实现渲染工作的重用和多线程缩放, 在 D3D12 中,做了三个重要方面不同于 …...
android13打基础: timepicker控件
public class Ch4_TimePickerActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {private TextView tv_time; // 声明一个文本视图对象private TimePicker tp_time; // 声明一个时间选择器对象Overrideprotected void onCreate(Nullable Bund…...
国产化板卡设计原理图:2330-基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡
基于FMC接口的JFM7K325T PCIeX4 3U PXIe接口卡 一、板卡概述 本板卡基于 FPGAJFM7K325T 芯片,pin_to_pin兼容FPGAXC7K410T-2FFG900 ,支持PCIeX8、64bit DDR3容量2GByte,HPC的FMC连接器,板卡支持PXIE标准协议,其中XJ3…...
Oracle SQL优化①——查看SQL执行计划的几种方法
前言 在日常的运维工作中,SQL优化是DBA的进阶技能,SQL优化的前提是要看SQL的执行计划是否正确,下面分享几种查看执行计划的方法,每一种方法都各有各的好处,可以根据特定场景选择某种方法。 一.使用AUTOTRACE查看执行…...
MySQL主从架构配合ShardingJdbc实现读写分离
文章目录 目录架构搭建读写分离pom.xmlfdy-live-user-provider 模块application.ymlfdy-db-sharding.yamlShardingJdbcDatasourceAutoInitConnectionConfig.java 目录 架构搭建 基于Docker去创建MySQL的主从架构 读写分离 pom.xml <dependency><groupId>mysql…...
MyBatis @Param 注解详解:多参数传递与正确使用方式
Param 注解主要用于 MyBatis 进行参数传递时给 SQL 语句中的参数 起别名,通常用于 多参数 方法,使参数在 XML Mapper 文件或注解 SQL 语句中更清晰易用。 1. 基本用法 在 Mapper 接口中使用 Param 来为参数命名,避免 MyBatis 解析时出现参数…...
【JAVA架构师成长之路】【Redis】第14集:Redis缓存穿透原理、规避、解决方案
30分钟自学教程:Redis缓存穿透原理与解决方案 目标 理解缓存穿透的成因及危害。掌握布隆过滤器、空值缓存等核心防御技术。能够通过代码实现请求拦截与缓存保护。学会限流降级、异步加载等应急方案。 教程内容 0~2分钟:缓存穿透的定义与核心原因 定义…...
mybatis报错org/apache/commons/lang3/tuple/Pair] with root cause
mybatis一对多查询配置resultMap映射报错org/apache/commons/lang3/tuple/Pair] with root cause 原因是mybatis依赖common-lang3这个包, 只需要添加common-lang3的依赖坐标即可: <dependency><groupId>org.apache.commons</groupId><artifactId>comm…...
supervisord管理Gunicorn进程,使用Nginx作为反向代理运行flask web项目
1. 安装 Gunicorn 在项目虚拟环境中安装 Gunicorn:2. 基本用法 配置文件 创建一个 Gunicorn 配置文件(如 gunicorn_config.py),方便管理复杂配置。 示例 gunicorn_config.py: bind "0.0.0.0:8000" #…...
STM32之软件SPI
SPI传输更快,最大可达80MHz,而I2C最大只有3.4MHz。输入输出是分开的,可以同时输出输入。是同步全双工。仅支持一主多从。SS是从机选择线。每个从机一根。SPI无应答机制的设计。 注意:所有设备需要共地,时钟线主机输出&…...
fastjson漏洞
fastjson漏洞 fastjson工作原理攻击原理补充 例子 fastjson工作原理 fastjson的作用是将JAVA对象转换成对应的json表示形式,也可以反过来将json转化为对应的Java对象。fastjson使用AutoType功能进行反序列化,AutoType使用type标记字符的原始类型&#x…...
【YOLOv12改进trick】医学图像分割网络CMUNeXt引入YOLOv12中,增强全局上下文信息实现涨点,含创新点Python代码,方便发论文
🍋改进模块🍋:医学全卷积U型网络(CMUNeXtBlock) 🍋解决问题🍋:CMUNeXtBlock模块解决了在医学图像分割任务中,传统的卷积操作由于其局部性限制,难以有效提取全局上下文信息的问题。 🍋改进优势🍋:利用大卷积核和倒置瓶颈结构,提取全局上下文信息,同时保持卷…...
机器学习的半监督学习,弱监督学习,自监督学习
半监督学习、弱监督学习和自监督学习是机器学习中利用不同形式监督信号的三种方法,它们的核心区别在于标注数据的数量、质量以及监督信号的来源。以下是它们的详细对比: 1. 半监督学习(Semi-Supervised Learning) 核心特点&#x…...
K8S学习之基础十七:k8s的蓝绿部署
蓝绿部署概述 蓝绿部署中,一共有两套系统,一套是正在提供服务的系统,一套是准备发布的系统。两套系统都是功能完善、正在运行的系统,只是版本和对外服务情况不同。 开发新版本,要用新版本替换线上的旧版本&…...
【计算机网络】计算机网络的性能指标——时延、时延带宽积、往返时延、信道利用率
计算机网络的性能指标 导读 大家好,很高兴又和大家见面啦!!! 在上一篇内容中我们介绍了计算机网络的三个性能指标——速率、带宽和吞吐量。用大白话来说就是:网速、最高网速和实时网速。 相信大家看到这三个词应该就…...
单片机如何用C语言重写vfprintf
在单片机中,标准库函数 vfprintf 可能不可用或占用过多资源(如内存或代码空间),因此我们可以通过自定义实现一个轻量级的 vfprintf 函数,专门用于单片机的串口输出。以下是一个用 C 语言重写 vfprintf 的示例ÿ…...
1.4 单元测试与热部署
本次实战实现Spring Boot的单元测试与热部署功能。单元测试方面,通过JUnit和Mockito等工具,结合SpringBootTest注解,可以模拟真实环境对应用组件进行独立测试,验证逻辑正确性,提升代码质量。具体演示了HelloWorld01和H…...
使用免费IP数据库离线查询IP归属地
一、准备工作 1.下载免费IP数据库 首先,访问 MaxMind官网(https://www.maxmind.com/en/home)如果你还没有MaxMind账号,可以通过此链接地址(https://www.maxmind.com/en/geolite2/signup)进行账号注册&…...
go语言数据类型
一.Go 语言有四大显著特点:高效性:编译与运行效率高。并发性:原生支持并发编程。简洁性:编程风格简洁直接,代码可读性与可维护性高。跨平台性:程序能在 Windows、Linux、Mac OS 等多系统运行。二.go的包:pa…...