为linux内核构建最小的根文件系统-一步一步精简之后续试验

时间:2022-05-26 15:50:39

本篇是 为linux内核构建最小的根文件系统-一步一步精简 的试验篇,上篇中我们得到了启动bin/sh情况下最小的根文件系统,如下:

1 root@root:/home/works/rootfs_least# ls
2 bin  dev  lib
3 root@root:/home/works/rootfs_least# ls bin
4 busybox  sh
5 root@root:/home/works/rootfs_least# ls dev
6 console
7 root@root:/home/works/rootfs_least# ls lib
8 ld-linux.so.2  libcrypt.so.1  libc.so.6  libm.so.6
9 root@root:/home/works/rootfs_least#

既然内核寻找的是bin/sh,那么我们想法是替换busybox的sh链接,而是自己建立sh应用程序,我们不知道sh必须做什么,但是我们可以保证sh不退出,马上动手,做个hello wolrd也好,替换之后,出现了一个问题,明明hello程序在bin目录下,但是sh说找不到,后来一比较,区别是两次编译hello用的交叉工具不相同,内核当时用的是gcc 4.0,刚刚hello用的是gcc4.1,马上跟换,可以运行hello,打印:hello world,之后死循环,我们的办法是重启,修改hello成sh,再重启,试验结果如下:

01 Failed to execute /linuxrc.  Attempting defaults...
02 Kernel panic - not syncing: No init found.  Try passing init = option to kernel.
03 Backtrace:
04 [ ] ( dump_backtrace+0x0/0x10c) from [ ] ( dump_stack+0x18/0x1c)
05
06 r6:00000000 r5:c0022e54 r4:c036a4fc
07 [ ] ( dump_stack+0x0/0x1c) from [ ] ( panic+0x48/0x11c)
08 [ ] ( panic+0x0/0x11c) from [ ] ( init_post+0xd4/0x104)
09 r3:c3805e38 r2:0000000f r1:0000000e r0:c02fa02c
10 r4:c036a4fc
11 [ ] ( init_post+0x0/0x104) from [ ] ( kernel_init+0xbc/0xe4)
12 r4:c036a4f8
13 [ ] ( kernel_init+0x0/0xe4) from [ ] ( do_exit+0x0/0x59c)
14 r5:00000000 r4:00000000

看来并不是我们想象的那么简单,要是前几天我还会怀疑是因为文件系统烧制的问题,要么是内核没找到文件系统的问题,现在想来不是的,文件系统正常挂载了,sh也存在(被我们用hello替换),所以问题出在sh上,执行的过程中出问题了,是不是没有打开console就打印造成的呢?所以,索性去掉printf语句,启动后直接进入死循环了,果然如此。但是,我们并满足,死循环了,我们要打印出东西,表明我们的存在,注意,可能我们的最小文件系统还可以精简,或许现在连console设备文件都不用,因为我们可以不输出,根据以上猜想测试,结果如下:

1 VFS: Mounted root ( jffs2 filesystem) on device 31:0.
2 Freeing init memory: 124K
3 Warning: unable to open an initial console.
4 Failed to execute /linuxrc.  Attempting defaults...

说明,我们的猜想正确,console设备文件用于输出,被真正的sh所使用,现在的最小根文件系统是如下:

1 root@root:/home/works/rootfs_least# ls
2 bin  lib
3 root@root:/home/works/rootfs_least# ls bin
4 sh 
5 root@root:/home/works/rootfs_least# ls lib 
6 ld-linux.so.2  libcrypt.so.1  libc.so.6  libm.so.6 
7 root@root:/home/works/rootfs_least#

其中的bin/sh是我们自己的hello改写的死循环,并且没有输出,只有while(1).现在猜想,sh重定向了输出到console,console正是我们现在看到的控制台了。

至此,试验结束,最小的跟文件系统,不错猜想还可以精简的,不过已经没有意义了,最小的跟文件系统已经探求成功。