简述
网上有很多基于busybox制作根文件系统的博客,作为一个初学者,刚开始参照教程制作时,不明白其中的含义,比如
- 什么是根文件系统?
- 为什么需要根文件系统?
- busybox和根文件系统的关系是什么?
- 配置/etc/inittab的作用是什么?
- 配置/etc/rcS的作用是什么?
- 配置/etc/fstab的作用是什么?
什么是根文件系统?
linux内核启动之后,用户无法直接使用操作系统。根文件系统是内核启动之后挂载的第一个文件系统。文件系统挂载后,内核调用/sbin/init初始化用户配置。
为什么需要根文件系统?
linux内核启动之后,会提示end kernel panic ...VFS...,这是因为还没有根文件系统, 找不到/sbin/init。参考RedHat 1.2.3 The Kernel可知,为了设置用户环境,内核会首先执行 /sbin/init程序,它是第一个用户进程,进程ID=1。此进程会根据/etc/inittab创建其它子进程。
busybox和根文件系统的关系是什么?
busybox是一个简化版的linux命令集。它还提供了内核启动需要的/sbin/init。这个程序的作用是创建了一个console,然后基于这个console创建了其它的子进程。如下文所示,主要概括了busybox sbin/init的初始化过程。
busybox的sbin/Init初始化过程
init.c源码,参考init_main()
- 打开
/dev/console, 对应console_init() - 解析
/etc/inittab, 并根据inittab的执行顺序初始化。parse_inittab()。- 启动前:
run_actions(SYSINIT);默认会调用/etc/init.d/rcS - 启动前:
run_actions(WAIT); - 启动前:
run_actions(ONCE); - 启动运行过程:
run_actions(RESPAWN | ASKFIRST);
- 启动前:
#未提供 inittab的默认行为
# ::sysinit:/etc/init.d/rcS
# ::askfirst:/bin/sh
# ::ctrlaltdel:/sbin/reboot
# ::shutdown:/sbin/swapoff -a
# ::shutdown:/bin/umount -a -r
# ::restart:/sbin/init
# tty2::askfirst:/bin/sh
# tty3::askfirst:/bin/sh
# tty4::askfirst:/bin/sh
busybox的inittab说明
github 参考文档: busybox/example/inittab 格式, 直接参考example即可。
<id>:<runlevels>:<action>:<process>
- id : busybox 使用对应id的tty(控制台)执行当前程序(process)。id为空,表示和init使用同一个控制台。
- runlevels: busybox未使用
- action:init进程根据action执行程序。
| 类型 | 含义 |
|---|---|
| sysinit | 第一个执行 |
| once | 只执行一次 |
| respawn | 程序运行过程中执行,如果子进程退出,会重新启动 |
| askfirst | 和respawn类似,但是会等待用户回车后重新启动 |
| shutdown | 系统关机时执行 |
| restart: | 重新读取etc/inittab,再执行restart程序 |
| ctrlaltdel | 按下Ctrl+Alt+Del时执行程序 |
- process: 需要执行的程序。
配置/etc/inittab的作用是什么?
由上文可知,sbin/init根据/etc/inittab首先调用了/etc/init.d.rcS
::sysinit:/etc/init.d/rcS
配置/etc/rcS的作用是什么?
这是一个脚本文件,可以添加启动过程需要自动执行的命令,比如配置IP,挂载文件系统,设置系统环境变量等。
此脚本比较灵活,也可以为空。
举例:
#!/bin/sh
# 配置环境变量
PATH=/bin:/sbin:/usr/bin:/usr/sbin
export LD_LIBRARY_PATH=/lib:/usr/lib
#mount -a:将 /etc/fstab 中定义的所有档案系统挂上。参考下文/etc/fstab的格式
/bin/mount -a
#其它需要初始化的配置,比如网络。
echo "-----------------------------------"
echo "*****hello world*****"
echo "-----------------------------------"
/etc/fstab的格式
[Device] [Mount Point] [File System Type] [Options] [Dump] [Pass]
比如# device-spec mount-point fs-type options dump pass LABEL=/ / ext4 defaults 1 1 /dev/sda6 none swap defaults 0 0 none /dev/pts devpts gid=5,mode=620 0 0 none /proc proc defaults 0 0 none /dev/shm tmpfs defaults 0 0