最后更新时间:2008-06-18 关键字: linux gentoo init
首先推广一下javaeye的 gentoo圈子
以下步骤,是基于已安装版本(非livecd)分析的。
按序号从小到大执行:
- linux 内核加载完硬件驱动后,启动 init 用户根进程(最后的引导步骤)。
- 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的其他服务