• 用busybox构建最小根文件系统详解


    1、busybox源码获取

    (1)busybox官网下载地址:https://busybox.net/
    (2)建议下载busybox的版本:尽量和你使用的编译环境(比如:Ubuntu)的版本相近,版本差太多可能需要解决一些编译时候的兼容问题;

    2、busybox原理分析

    参考博客:《busybox的实现原理分析(C语言实现简易版的busybox)》

    3、busybox编译

    3.1、配置busybox

    Busybox Settings--->
    	Build Options--->
    		[*]Build BusyBox as a static binary(no shared libs)
    
    		
    Busybox Library Tuning--->
    	[*]vi-style line editing commands
    	[*]Fancy shell prompts
    	
    	
    Linux Module Utilities--->
    	[ ]Simplified modutils
    	[*]insmod
    	[*]rmmod
    	[*]lsmod
    	[*]modprobe
    	[*]depmod
    
    	
    Linux System Utilities--->[*]mdev
    	[*]Support /etc/mdev.conf
    	[*]Support subdirs/symlinks
    	[*]Support regular expressions substitutions when renaming dev
    	[*]Support command execution at device addition/removal
    	[*]Support loading of firmwares
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    3.2、编译

    root@Ubuntu:~$ ls
    busybox-1.24.1  busybox-1.24.1.tar.bz2
    root@Ubuntu:~$
    root@Ubuntu:~$ cd busybox-1.24.1/
    root@Ubuntu:~$ make ARCH=arm CROSS_COMPILE=arm-linux-
    
    • 1
    • 2
    • 3
    • 4
    • 5

    解压开busybox源码后,在编译时指定CPU架构和交叉编译工具链

    4、busybox构建根文件系统

    Busybox Settings--->
    	Installation Options ("make install" behavior)--->
    
    • 1
    • 2

    在这里插入图片描述

    (1)配置安装目录:"make menuconfig"里可以按照上面的选项去选择busybox安装目录;
    (2)配置好安装目录,执行"make install"就会将busybox、链接文件、linuxrc等拷贝到指定目录,构成文件夹形式的最小文件系统;

    5、完善根文件系统

    5.1、添加inittab文件

    #first:run the system script file
    ::sysinit:/etc/init.d/rcS
    ::askfirst:-/bin/sh
    ::ctrlaltdel:-/sbin/reboot
    #umount all filesystem
    ::shutdown:/bin/umount -a -r
    #restart init process
    ::restart:/sbin/init
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    在这里插入图片描述
    在这里插入图片描述

    (1)在未添加inittab文件前,系统可以起来,可以进入命令行,但是系统起来后会不停的刷报错的打印;
    (2)在添加上面的inittab文件后,系统不会再刷"can’t open /dev/tty3: No such file or directory";
    (3)inittab文件的内容解读可以参考博客:《嵌入式系统开发——文件系统中inittab文件、rcS文件、fstab文件、profile文件详解》

    5.2、添加fstab文件

    # /etc/fstab: static file system information.
    #
    # Use 'vol_id --uuid' to print the universally unique identifier for a
    # device; this may be used with UUID= as a more robust way to name devices
    # that works even if disks are added and removed. See fstab(5).
    #
    # 	 	 	 	 	 	
    	proc 			/proc 			proc 	defaults 	0 		0
    	sysfs 			/sys 			sysfs 	defaults 	0 		0
    	tmpfs 			/var 			tmpfs 	defaults 	0 		0
    	tmpfs 			/tmp 			tmpfs 	defaults 	0 		0
    	tmpfs 			/dev 			tmpfs 	defaults 	0 		0
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    fstab是开启自动挂载文件系统的,需要在文件系统中手动创建好根目录下的"sys、proc、dev等"挂载点;

    5.3、添加rcS文件

    #!/bin/sh
    # 设置PATH变量
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    
    # 将系统设置为单用户模式
    runlevel=S
    prevlevel=N
    
    # 设置umask的值,和创建文件的默认权限相关
    umask 022
    
    # 到处为环境变量
    export PATH runlevel prevlevel
    
    #解析/etc/fstab文件并挂载分区;
    mount -a
    
    # 开启mdev,和驱动在/dev目录下生成设备节点有关
    echo /sbin/mdev > /proc/sys/kernel/hotplug
    mdev -s
    
    #指定主机名保存在/etc/sysconfig/HOSTNAME文件中
    /bin/hostname -F /etc/sysconfig/HOSTNAME
    
    #设置eth0的ip为192.168.1.10
    ifconfig eth0 192.168.1.10
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26

    5.4、设置主机名

    在这里插入图片描述

    (1)创建/etc/sysconfig/HOSTNAME 文件,里面保存主机名,可以用hostname命令查看;
    (2)这个文件名和路径是与rcS文件中的设置相对应的;

    5.5、添加profile文件

    # Ash profile
    # vim: syntax=sh
    
    # No core files by default
    ulimit -S -c 0 > /dev/null 2>&1
    
    USER="`id -un`"
    LOGNAME=$USER
    PS1='[\u@\h \W]\# '
    PATH=$PATH
    
    HOSTNAME=`/bin/hostname`
    
    export USER LOGNAME PS1 PATH
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    添加上面的profile文件后,可以在终端的命令行看到设置的主机名和登录的账户名;

    5.6、增加用户登录

    参考博客:《嵌入式设备文件系统构建——增加用户登录功能》

    5.7、动态链接库的拷贝

    (1)将程序运行需要依赖的动态库拷贝到/lib或者/usr/lib目录下;
    (2)最少是需要将交叉编译工具链的动态库拷贝到/lib目录下,不然编译的程序都没法在板子上运行;

    6、用NFS挂载构建的根文件系统

    参考博客:《用NFS挂载根文件系统详解(带nfs版本不兼容问题的解决方法)》

  • 相关阅读:
    git删除分支命令
    C/C++内存管理
    赋予水稻营养新功能 国稻种芯-杨少校:何登骥谋定生物育种
    从内部失衡到外部失衡-中国视角下的宏观经济
    2、xss-labs之level2
    什么是SAN网络?SAN网络上的存储备份和恢复怎么操作?SAN 测试网络存储与服务器架构架构优化
    基于Echarts实现可视化数据大屏科技业务数据统计
    R语言生物群落(生态)数据统计分析与绘图
    听GPT 讲Rust源代码--src/librustdoc
    一文搞懂│php 中的 DI 依赖注入
  • 原文地址:https://blog.csdn.net/weixin_42031299/article/details/127943600