rootfs是内核启动时所挂载的第一个文件系统,系统引导程序会在其挂载之后将一些初始化脚本和服务加载到内存中去运行。
一些常用目录:
1)修改顶层Makefile,设置ARCH和CROSS_COMPILE。
2)修改libbb/printable_string.c和unicode.c,取消对中文显示的限制。
3)配置busybox。一般使用默认配置defconfig。然后进行图形化配置对DNS和中文的支持。
4)编译busybox。
5)最后在rootfs文件夹下会有linuxrc文件,Linux内核init进程最后会查找用户态init进程,如果bootargs设置init=/linuxrc,就可以作为用户态init程序。
将/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/lib和…arm-linux-gnueabihf/lib拷贝到rootfs/lib。然后删除rootfs/lib下的ld-linux-armhf.so.3(复制过来是快捷方式,软连接),重新从usr下复制过来即可。
将/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/arm-linux-gnueabihf/libc/usr/lib拷贝到rootfs/usr/lib。
使用NFS挂载测试rootfs,在uboot启动后输入以下命令:
setenv bootargs 'console=ttymxc0,115200 root=/dev/nfs nfsroot=192.168.222.132:/home/finches/linux/nfs/rootfs,proto=tcp rw ip=192.168.222.51:192.168.222.132:192.168.222.1:255.255.255.0::eth0:off'
saveenv
启动内核,测试结果如下,进入了根文件系统。不过上面一行cant run说明还有文件缺失,根文件系统不够完善。
上面可以看到缺失rcS脚本,该脚本作用是规定内核启动之后需要启动哪些服务。
1)创建rcS脚本。
#!/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH /*PATH:保存可执行文件可能存在的目录*/
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib /*保存库文件所在目录*/
export PATH LD_LIBRARY_PATH /*导出环境变量*/
mount -a /*挂载所有文件系统(/etc/fstab指定)*/
mkdir /dev/pts
mount -t devpts devpts /dev/pts /*将devpts挂载到目录*/
echo /sbin/mdev > /proc/sys/kernel/hotplug /*管理热插拔设备,内核可以在/dev下自动创建设备节点*/
mdev -s
2)rcS脚本中调用到了/etc/fstab文件,创建。
file system:要挂载的设备比如块设备/dev/sdb。
mount point:挂载点。
type:文件系统类型。
options:默认defaults。
dump:为1允许备份,一般为0.
pass:磁盘检查设置,为0不检查,根目录’/'设置为1,其它从2开始。
3)创建/etc/inittab
init程序会读取该文件,该文件指令格式如下:
<id>:<runlevels>:<action>:<process>
/*
id:每个指令的标识符,对于busybox的init,id还用来指定启动进程的控制tty。
runlevels:咩用,空着。
action:指定process可能用到的动作。
process:具体的动作比如程序脚本或者命令。
*/
Busybox支持action如下:
/etc/inittab如下:
#etc/inittab
::sysinit:/etc/init.d/rcS /*系统启动后运行rcS*/
console::askfirst:-/bin/sh /*将console作为控制台终端,ttymxc0*/
::restart:/sbin/init /*重启运行/sbin/init*/
::ctrlaltdel:/sbin/reboot /*按下ctrl+alt+del:运行/sbin/reboot*/
::shutdown:/bin/umount -a -r /*关机的时候卸载各个文件系统*/
::shutdown:/sbin/swapoff -a /*关机关闭交换分区*/
①软件运行测试:在rootfs/drivers中创建一个hello.c,交叉编译为hello可执行文件,运行正常说明成功。
hello可执行文件运行时控制台无法使用,所以可以后台运行:
./hello & /*&表示后台运行*/
ps /*查看进行PID*/
kill -9 PID /*关闭对应PID的后台进程*/
②中文字符测试:
③开机自启动测试:由于进入rootfs会运行rcS脚本,在里面添加自启动项即可。
④连接外部网络测试:直接ping某个网址会导致bad adress提示,需要在rootfs/etc/resolc.conf中输入以下内容以配置域名解析服务器,一般为所处网络网关地址,也可以是114这个。还是ping不通百度,估计是要和路由直连。