利用busybox制作跟文件系统 准备一个busybox包 我这里用的是busybox-1.21.1.tar.bz2 这个包可以在官方网站上下载,这里我就用百度网盘链接https://pan.baidu.com/s/10Fnc-UbcNWPLaiAnaXKTug 解压安装包 tar xf busybox-1.21.1.tar.bz2 . 根文件系统的制作 1、什么是文件系统 文件的索引信息 文件的具体数据 操作索引信息的具体代码 kernel/fs/ 操作索引信息的代码 ext4 fat jffs2: norflash yaffs2: nandflash nfs ... 为什么会有很多中类型的文件? 1)对应硬件特性不同 2)软件的处理策略不同 断电保护的策略 ... linux启动时加载使用的第一个文件系统称作根文件系统 根文件系统中存储的文件是有特定需求的 2、准备根文件系统所需要具备的目录(文件) 2.1 生成arm处理器能够使用命令工具 使用开源软件busybox去生成需要的命令 cd /home/tarena/porting cp /home/tarena/workdir/rootfs/busybox-1.23.2.tar.bz2 ./ cd busybox-1.23.2/ make menuconfig Busybox Settings ---> Build Options ---> [*] Build shared libbusybox //共享库 Installation Options ("make install" behavior) ---> What kind of applet links to install (as soft-links) ---> //软链接 (./_install) BusyBox installation prefix (NEW) //安装路径 vi Makefile 164 CROSS_COMPILE ?= arm-cortex_a9-linux-gnueabi- 190 ARCH ?= arm make make install cd _install 2.2 准备busybox可执行程序需要的库文件 mkdir lib cp /opt/arm-cortex_a9-eabi-4.7-eglibc-2.18/arm-cortex_a9-linux-gnueabi/sysroot/lib/libm.so.6 lib/ -a cp /opt/arm-cortex_a9-eabi-4.7-eglibc-2.18/arm-cortex_a9-linux-gnueabi/sysroot/lib/libm-2.18-2013.10.so lib/ -a cp /opt/arm-cortex_a9-eabi-4.7-eglibc-2.18/arm-cortex_a9-linux-gnueabi/sysroot/lib/libc.so.6 lib/ -a cp /opt/arm-cortex_a9-eabi-4.7-eglibc-2.18/arm-cortex_a9-linux-gnueabi/sysroot/lib/libc-2.18-2013.10.so lib/ -a cp /opt/arm-cortex_a9-eabi-4.7-eglibc-2.18/arm-cortex_a9-linux-gnueabi/sysroot/lib/ld*.so* lib/ -a 2.3 配置文件的准备 mkdir etc 2.3.1 vi etc/inittab ::sysinit:/etc/init.d/rcS ::respawn:-/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r mkdir etc/init.d 2.3.2 vi etc/init.d/rcS //系统开机自启动的程序可以放入该文件 #!/bin/sh #自动挂载/etc/fstab文件中指定的分区 mount -a #热插拔事件发生时执行的命令 echo /sbin/mdev >/proc/sys/kernel/hotplug mdev -s 手工执行:chmod +x etc/init.d/rcS 2.3.3 vi etc/fstab 格式要求: 设备 挂载点 文件系统类型 挂载参数 是否备份 格式检查 device mount_point type options dump fsck proc /proc proc defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0 2.4 创建必要的目录 mkdir proc tmp sys dev var opt mnt 2.5 创建必要的设备文件 linux内核在启动时需要使用两个设备文件 /dev/console : 控制台 /dev/null:黑洞文件 sudo mknod dev/console c 5 1 sudo mknod dev/null c 1 3 sudo chown tarena:tarena dev/console sudo chown tarena:tarena dev/null 3、通过nfs方式验证以上根文件数据的有效性 服务器端: sudo vi /etc/exports /home/tarena/porting/busybox-1.23.2/_install *(rw,sync,no_root_squash) sudo /etc/init.d/nfs-kernel-server restart 客户端: setenv bootargs root=/dev/nfs nfsroot=192.168.1.8:/home/tarena/porting/busybox-1.23.2/_install init=/linuxrc ip=192.168.1.6:192.168.1.8:192.168.1.1:255.255.255.0 lcd=vs070cxn tp=gslx680-linux console=ttySAC0,115200 maxcpus=1 saveenv ------------------------------------------------------------ 1、使用软链接的好处 所有的命令都是指向busybox可执行的软链接 _install/bin 远小于 ubuntu 系统 /bin,原因在于: 1) 使用了软链接的方式 2) _install/bin命令是对应PC版本命令的简化版 2、bin/busybox可执行程序的分析 arm-cortex_a9-linux-gnueabi-readelf -d bin/busybox libm.so.6 libc.so.6 加载器ld arm版本的库在交叉编译工具包有 which arm-cortex_a9-linux-gnueabi-gcc 令开一个窗口 cd /opt/arm-cortex_a9-eabi-4.7-eglibc-2.18 find ./ -name "libm.so.6" cp -a -a: 等价于-dR -d: 保持软链接属性 3、linux自举完成后会去运行1号进程 1号进程如果指定为linxurc linuxrc对应的实现代码busybox/init/init.c init_main(...) { 打开,解析/etc/inittab ... } inittab文件的格式 <id>:<runlevel>:<action>:<process> 前两项在嵌入式经常忽略 -/bin/sh: -, 一个会话shell 4、设备节点文件的创建 mknod dev/xxx c major minor c: 字符设备文件 major: 主设备号 minor: 次设备号 ls /dev/console -l |
|