山高疑日近,海阔觉天低

busybox构建rootfs

一,rootfs根目录
详细
1、/bin 目录busybox生成
此目录下存放着系统需要的可执行文件,一般都是一些命令,比如 ls、mv 等命令。此目录下的命令所有的客户都可以使用
2、/sbin 目录busybox生成
只有管理员才能使用的可执行文件
3、/usr 目录busybox生成
usr 是 Unix Software Resource 的缩写,busybox会在下面生成2个文件夹/bin,/sbin/usr 类似program file个人理解他们与根目录的区别是根目录是系统命令,而usr是用户命令
4、/etc 目录busybox(初始为空)
此目录下存放着各种配置文件
5、/lib 目录
注意LD_LIBRARY_PATH和PATH类似,是库文件路径集合,此目录下存放着库文件。命令和用户编写的应用程序要使用这些库文件。
6、/mnt 目录(初始为空)
临时挂载目录,可以在此目录下创建空的子目录,比如/mnt/sd、/mnt/usb,可以将 SD 卡或者 U 盘挂载到/mnt/sd 或者/mnt/usb 目录中。
7、/opt(初始为空)
可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。
8、/var 目录(初始为空)
此目录存放一些可以改变的数据。
9、/dev 目录
mdev挂载点,dev 是 device 的缩写,在 Linux 下一切皆文件,即使是硬件设备,也是以文件的形式存在的,比如/dev/ttymxc0。注意mount -t devpts devpts /dev/pts,这是将devpts文件系统挂载到/dev/pts,这个跟ssh会话相关。mount -t tmpfs tmpfs /dev/shm,这个是虚拟内存挂载,一般用于挂载swap,mount -t tmpfs mdev /dev 注意执行这个挂载前,必须保证sysfs已经挂载。还要注意一点,需先挂载子目录,然后才能挂载父目录
10、/proc 目录
 proc 文件系统的挂载点,proc是个虚拟文件系统,没有实际的存储设备。proc 里面的文件都是临时存在的,一般用来存储系统运行信息文件。mount -t tmpfs tmpfs /var/run
11、/sys 目录
 sysfs 文件系统的挂载点,sysfs 是一个类似于 proc 文件系统的特殊文件系统,此目录通过一定的组织结构向用户提供详细的内核数据结构信息。

二,BusyBox
busybox 获取wget https://busybox.net/downloads/busybox-1.36.0.tar.bz2
1、Make脚本

#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- defconfig  //allyesconfig,allnoconfig
if [ "$1" == "m" ]; then
   make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
fi
make -j 8
make install CONFIG_PREFIX=../rootfs

①、defconfig,缺省配置,也就是默认配置选项
②、allyesconfig,全选配置,也就是选中 busybox 的所有功能
③、allnoconfig,最小配置

2、BusyBox中文支持
①修改libbb/printable_string.c,注释掉”if (c >= 0x7f) break;” ;修改”if (c < ‘ ‘ || c >= 0x7f)”为”if (c < ‘ ‘ )”
②修改/libbb/unicode.c,在1000多行有unicode_conv_to_printable2函数”*d++ = (c >= ‘ ‘ && c < 0x7f) ? c : ‘?’;”为”*d++ = c >= ‘ ‘  ? c : ‘?’;”;”if (c < ‘ ‘ || c >= 0x7f)”为”if (c < ‘ ‘)”

3、BusyBox配置功能
有两种方式可以对Busy进行增删:1 make menuconfig 2 直接修改.config
Settings-> Build static binary (no shared libs) 取消勾选 默认未勾选
Settings-> vi-style line editing commands 勾选 默认未勾选
Settings-> Support Unicode -> Check $LC_ALL, $LC_CTYPE and $LANG environment variables 勾选 支持中文
Linux Module Utilities-> Simplified modutils取消勾选 默认勾选
Linux System Utilities-> mdev (16 kb) 勾选全部 默认勾选
①/lib 增加库文件
cd gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linuxgnueabihf/libc/lib
cp -d *so* *.a   $SYSROOT/rootfs/lib/
cd gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/lib
cp -d *so* *.a   $SYSROOT/rootfs/lib/
②usr/lib 增加库文件
cd gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/libc/usr/lib
cp -d *so* *.a   $SYSROOT/rootfs/usr/lib/
注意拷贝完成后要进入/lib,/usr/lib 这个2个文件夹看看软连接是否是红色,如果是红色需要处理
③其它目录创建
mkdir dev proc mnt sys tmp  root
④创建/etc/inittab 文件
inittab是内核init调用用户空间/sbin/init,/sbin/init会载入/etc/inittab,进行初始化,具体请阅读busybox源码examples/inittab,init不愧是一个守护进程,载入inittab后他时刻监视着那些触发条件,如果满足就调用之后的process

# Format  <id>:<runlevels>:<action>:<process>
# : The runlevels field is completely ignored.
# : Valid actions include: sysinit, wait, once, respawn, askfirst, shutdown, restart and ctrlaltdel
#	sysinit actions are started first, and init waits for them to complete.
#	wait actions are started next, and init waits for them to complete.
#	once actions are started next (and not waited for)
#
#	askfirst and respawn are started next.	For askfirst, before running the specified process, init displays and then waits 
#	shutdown actions are run on halt/reboot/poweroff, or on SIGQUIT.
#	restart action is exec'ed (init process is replaced by that process).
#	ctrlaltdel actions are run when SIGINT is received
# : Specifies the process to be executed and it's command line.
#例子
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::restart:/sbin/init
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::shutdown:/sbin/swapoff -a

⑤创建/etc/fstab 文件
rcS的第一行代码一般是mount -a,他的意思是载入fstab的挂载信息,注意必须载入fstab后才能启动mdev,换句话说必须线挂载sysfs才能挂载mdev,注意下面devpts挂载到子目录,因此,必须保证rootfs.tar.gz 包含这个目录

# <file system> <mount pt>      <type>   <options>     <dump>   <pass>
/dev/root	/		ext2	rw,noauto	0	1
proc		/proc		proc	defaults	0	0
devpts		/dev/pts	devpts	defaults,gid=5,mode=620,ptmxmode=0666	0	0
tmpfs		/dev/shm	tmpfs	mode=0777	0	0
tmpfs		/tmp		tmpfs	mode=1777	0	0
tmpfs		/run		tmpfs	mode=0755,nosuid,nodev	0	0
sysfs		/sys		sysfs	defaults	0	0

<file system>:要挂载的特殊的设备,也可以是块设备,比如/dev/sda 等等。
<mount point>:挂载点。
<type>:文件系统类型,比如 ext2、ext3、proc、romfs、tmpfs 等等。
<options>:挂载选项,在 Ubuntu 中输入“man mount”命令可以查看具体的选项。一般使用 defaults,也就是默认选项,defaults 包含了 rw、suid、 dev、 exec、 auto、 nouser 和 async。
<dump>:为 1 的话表示允许备份,为 0 不备份,一般不备份,因此设置为 0。
⑥mount命令
内核第一mount的是rootfs,如何理解挂载,Linux的任何路径都可以认为是一个节点(mount pt),节点口可以挂载到一个file system,常见file system真实的:/dev/sda1,/dev/root 虚拟的:tmpfs,devpts,sysfs.同一个节点可以反复被挂载,最有一次挂载才是最终的,注意要查看所有的挂载信息,使用cat /proc/mounts

NXPMinhope

赞(0) 打赏
未经允许不得转载:Mr.Zhang » busybox构建rootfs

你的打赏是我的动力

登录

找回密码

注册