busybox 配置根文件系统总结

简述

网上有很多基于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()

  1. 打开/dev/console, 对应console_init()
  2. 解析/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
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
禁止转载,如需转载请通过简信或评论联系作者。

相关阅读更多精彩内容

友情链接更多精彩内容