gentoo & linux 系统启动步骤分析
以下步骤,是基于已安装版本(非livecd)分析的。
按序号从小到大执行:
grub 初始化 initramfs(如果kernel支持的话),把initramfs当介质做前置处理,根据grub.conf读取 linux 内核镜像,加载硬件驱动到内存,启动 init 用户根进程(第一个守护进程, super parent process)。
init 用户进程读取 /etc/inittab 配置文件,进行系统环境初始化。
inittab配置文件:

按照 inittab 文件中的配置,首先会执行 “id:3:initdefault:”,作用是定义默认的启动级别(runlevel)
按照 inittab 文件中的配置,执行 “si::sysinit:/sbin/rc sysinit”。作用是执行 /sbin/rc sysinit 指令,进行本地文件系统的mount和初始化。
rc 脚本是由 /sbin/runscript 指令来执行的,从截屏中最上部分的 “#!/sbin/runscript” 可以看出。
在 rc 脚本里,首先会 source 一下 /sbin/functions.sh,这里主要是做一些环境变量,公用函数的预定义 。
下面的 RC_INTERACTIVE if判断,可以设定,是否以交互方式,来启动。默认是不交互的。

接下来,跳过一些函数定义,能够看到如下截屏的代码,作用是 只在传递了 sysinit 参数时设置好 PATH环境变量,启用字符设备,设置系统消息的级别。

检查 /proc 目录是否存在,如果不存在这个目录,那么提示错误信息,并 unmount 所有的文件系统,重启。如果存在,那么提示成功信息,并尝试mount proc,有异常就提示。

如果当前内核版本是2.6.0的,那么看一下 /sys 目录是否存在,不存在提示错误,存在的话,尝试mount sys文件系统。

检查 /dev 目录是否存在, 如果不存在这个目录,那么提示错误信息,并 unmount 文件系统,重启。如果存在,则 fix 掉一个官方称之为比较神奇的关于devfs 的 bug。

尝试弄清楚用户希望如何运用 /dev 设备,以及看内核是否支持 /dev,依赖文件是否缺少,启动参数是否正确等。

如果内核版本为 2.5.68 ,那么还需要 mount pts设备(/dev/pts)

开始记录启动日志

设置默认的启动级别。逻辑:
内 核命令行参数(在引导配置中,跟在内核后面的bootlevel和softlevel,比如grub.conf里 kernel /boot/vmlinuz root=/dev/hda3 bootlevel=another1 softlevel=another2)
有设置 bootlevel = xx,则以xx为启动级别。默认 boot
设置 softlevel = xx,则以xx为默认级别,默认 default

获得关键服务列表, 这里的关键服务指的是 boot 级别的服务,默认为 checkroot modules checkfs localmount clock bootmisc

将 checkroot 和 modules 两个启动服务先启来。
然后启动一些磁盘扩展设备程序
启动在boot级别里,除checkroot和modules的其他服务

转载请注明原文链接:http://kenwublog.com/gentoo-linux-startup-analysis