乐于分享
好东西不私藏

嵌入式开发必备:打造最小根文件系统

嵌入式开发必备:打造最小根文件系统

在嵌入式Linux开发中,根文件系统是系统启动和运行的基础。一个最小化的根文件系统不仅可以减少存储空间占用,还能提高系统启动速度和运行效率。

最小根文件系统

一个最小化的嵌入式Linux根文件系统通常包含以下核心组件:

  • • BusyBox:提供最小化的Unix工具集
  • • /bin、/sbin目录:存放基本命令
  • • /dev目录:包含设备节点文件
  • • /etc目录:存放配置文件
  • • /lib目录:存放共享库(动态编译时需要)
  • • /proc和/sys目录:虚拟文件系统挂载点
  • • 初始化脚本:系统启动时执行的脚本

BusyBox基础

BusyBox是一个集成了最常用Linux命令和工具的软件包,将许多常用命令压缩到一个可执行文件中,同时保持了命令的基本功能。

下载BusyBox

从BusyBox官网(https://busybox.net/)下载最新的稳定版本源码。

示例:wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2tar -xvf busybox-1.36.1.tar.bz2cd busybox-1.36.1

BusyBox配置

默认配置

首先使用默认配置作为起点:

make defconfig

菜单配置

使用menuconfig进行更详细的配置:

make menuconfig

在配置菜单中,需要注意以下几个选项:

  1. 1. Build Options
    • • 选择静态编译还是动态编译
    • • 静态编译:[*] Build static binary (no shared libs)
    • • 动态编译:取消上述选项
  2. 2. Installation Options
    • • 设置安装路径:(/home/user/rootfs) BusyBox installation prefix
  3. 3. Linux Module Utilities
    • • 如需支持内核模块,启用相关选项
  4. 4. Linux System Utilities
    • • 确保启用mdev支持,用于动态设备管理

编译和安装

配置完成后,编译并安装BusyBox:

make -j$(nproc)make install

根文件系统目录搭建

创建基本目录结构

mkdir -p rootfs/{dev,proc,sys,etc,lib,mnt,root,tmp,var}mkdir -p rootfs/etc/init.d

复制BusyBox生成的文件

将BusyBox安装的文件复制到根文件系统目录:

cp -r busybox-1.36.1/_install/* rootfs/

静态/dev节点管理

静态/dev节点的创建

静态/dev节点是在构建根文件系统时手动创建的设备节点文件。对于最小系统,需要创建以下设备节点:

cd rootfs/devmknod -m 600 console c 5 1mknod -m 666 null c 1 3mknod -m 666 zero c 1 5mknod -m 644 random c 1 8mknod -m 644 urandom c 1 9

静态/dev的优缺点

优点:

  • • 简单直接,不需要额外的设备管理守护进程
  • • 系统启动速度快
  • • 适用于设备固定的嵌入式系统

缺点:

  • • 缺乏灵活性,无法自动识别热插拔设备
  • • 需要手动创建所有可能用到的设备节点
  • • 对于复杂系统,管理起来比较繁琐

动态设备管理

mdev简介

mdev是BusyBox内置的一个轻量级设备管理工具,是udev的简化版本,专为嵌入式系统设计。它可以在系统启动时和热插拔事件发生时自动创建设备节点。

配置mdev

修改/etc/fstab

创建或编辑rootfs/etc/fstab文件:

proc            /proc           proc    defaults        0       0sysfs           /sys            sysfs   defaults        0       0tmpfs           /tmp            tmpfs   defaults        0       0

配置初始化脚本

创建rootfs/etc/init.d/rcS文件:

#!/bin/sh# 挂载文件系统mount -t proc proc /procmount -t sysfs sysfs /sysmount -t tmpfs tmpfs /tmpmkdir -p /devmknod -m 0622 /dev/console c 5 1mknod -m 0666 /dev/null c 1 3mount -t tmpfs -o size=64k,mode=0755 tmpfs /devecho /sbin/mdev > /proc/sys/kernel/hotplug/sbin/mdev -s# 其他初始化命令ifconfig lo 127.0.0.1 up

设置执行权限

chmod +x rootfs/etc/init.d/rcS

配置inittab

创建rootfs/etc/inittab文件:

::sysinit:/etc/init.d/rcS::respawn:-/bin/sh::ctrlaltdel:/sbin/reboot::shutdown:/bin/umount -a -r

构建步骤示例

准备工作

  1. 1. 安装必要的编译工具:
sudo apt-get install build-essential libncurses5-dev
  1. 2. 下载并解压BusyBox源码:
wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2tar -xvf busybox-1.36.1.tar.bz2cd busybox-1.36.1

配置和编译BusyBox

make defconfigmake menuconfig  # 根据需要进行配置make -j$(nproc)make install

构建根文件系统

# 创建根文件系统目录mkdir -p rootfs/{dev,proc,sys,etc,lib,mnt,root,tmp,var}mkdir -p rootfs/etc/init.d# 复制BusyBox文件cp -r _install/* rootfs/# 配置文件系统# 创建fstab、rcS、inittab等文件(参考前面的内容)# 配置动态设备管理(mdev)# 或创建静态设备节点

打包根文件系统

根据需要选择合适的格式打包:

# 生成ext2文件系统mkfs.ext2 -F -L rootfs rootfs.img 10Mmount -o loop rootfs.img /mntcp -a rootfs/* /mnt/umount /mnt# 或生成cpio归档tar -czvf rootfs.tar.gz -C rootfs .# 或生成initramfscd rootfsecho . | cpio -o -H newc > ../initramfs.cpiocd ..gzip initramfs.cpio

总结

无论是资源受限的IoT设备还是功能复杂的嵌入式系统,选择合适的根文件系统构建方法能为项目带来更好的性能和可靠性。

本站文章均为手工撰写未经允许谢绝转载:夜雨聆风 » 嵌入式开发必备:打造最小根文件系统

评论 抢沙发

4 + 1 =
  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
×
订阅图标按钮