用busybox构建最小根文件系统详解
创始人
2024-04-10 20:48:14

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 promptsLinux Module Utilities--->[ ]Simplified modutils[*]insmod[*]rmmod[*]lsmod[*]modprobe[*]depmodLinux 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

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-

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

4、busybox构建根文件系统

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

在这里插入图片描述

(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)在未添加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 		0sysfs 			/sys 			sysfs 	defaults 	0 		0tmpfs 			/var 			tmpfs 	defaults 	0 		0tmpfs 			/tmp 			tmpfs 	defaults 	0 		0tmpfs 			/dev 			tmpfs 	defaults 	0 		0

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

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>&1USER="`id -un`"
LOGNAME=$USER
PS1='[\u@\h \W]\# '
PATH=$PATHHOSTNAME=`/bin/hostname`export USER LOGNAME PS1 PATH

在这里插入图片描述

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

5.6、增加用户登录

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

5.7、动态链接库的拷贝

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

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

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

推荐

再难的项目都是基础知识的复杂运用,基础是最重要的。给大家推荐一个学校嵌入式知识的网站,博主在大学时候学习嵌入式知识、找工作的时候都在用这个网站,网站里有C语言、Linux等等的笔试题、面试常问问题等等知识,无论是学习基础知识、面试刷题、交流工作经验都是不错的选择。大家一起进步,欢迎留言交流。
链接:学习神器跳转
在这里插入图片描述
在这里插入图片描述

相关内容

热门资讯

怡球资源:2025年净利同比预... 格隆汇1月27日|怡球资源(601388.SH)公告称,预计2025年年度归属于上市公司股东的净利润...
嘉美包装:董秘回应并提醒信息仅... 投资者提问:我是长线价值投资者,坚决坚定看好追觅科技入驻嘉美后的美好未来!董秘回答(嘉美包装SZ00...
“小海豚”用专业护航盛会,十五... 中国青年报客户端讯(罗政 中青报·中青网记者 林洁)近日,十五运会和残特奥会广东赛区志愿服务总结交流...
武商集团:多超市品牌系差异化布... 投资者提问:武商超市、江豚会员店、超级生活馆、江豚生活家。请问公司开这个多超市品牌有何意义跟价值吗?...
新柴股份:董秘回应业绩预告问题... 投资者提问:公司去年1月27就出了业绩预告,今年会出吗?我看仇总的公司杭叉,中策,巨星都已经出了业绩...