利用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文件的格式
:::
前两项在嵌入式经常忽略
-/bin/sh:
-, 一个会话shell
4、设备节点文件的创建
mknod dev/xxx c major minor
c: 字符设备文件
major: 主设备号
minor: 次设备号
ls /dev/console -l