今天需要对Debian中的默认启动程序做配置,就顺便重新认识一下Linux下的启动过程,并总结对比Debian和Gentoo。
Init创世纪!
再来回顾一下Linux PC的启动过程
- BIOS检测硬件,并查找硬盘MBR(Master Boor Record)上的指令
- MBR指向GRUB,LILO之类的boot loader
- Grub查询载入操作系统内核的位置,并载入指定的内核
- 内核载入之后启动init进程。
- init启动脚本/etc/rc.d/rc.sysinit, 接着根据运行级别不同,启动指定的进程。
init是系统中所有进程的父进程,它确保所有的文件系统(/etc/fstab中指定的)都已经正确挂在,接着就执行/etc/init.d下的一系列脚本来启动服务。接着init就会激活终端,并将进程agetty和他绑定。agetty确保用户能在终端登录。
实际上init会根据不同的运行级别来启动不同的进程。这个运行级别的控制在/etc/inittab中。
Debian
Debian通过执行init程序启动,配置文件为/etc/inittab,这个文件会指定init执行/etc/init.d/rcS脚本,该脚本又通过子进程执行/etc/rcS.d/目录下的脚本,如检测挂载文件系统,转载内核模块,启动网络服务,设置时钟还有其他初始化工作。接着,为了兼容性,会执行/etc/rc.boot/目录下,所有文件名不含”.”的文件。
启动过程之后,init程序执行默认运行级别中的起动机脚本,运行级别会在/etc/inittab文件中指定。Linux有7个运行级别.分别是
- 0 系统挂起
- 1 单用户模式
- 2-5 各种多用户模式
- 6 系统重启
Debian系统默认运行级别的id=2,也就说/etc/rc2.d下的脚本会在多用户状态下运行。事实上,在任一个/etc/rcN.d/目录下的文件都是一个到/etc/init.d/的符号链接。rcN.d/目录下文件命名方式决定了哪个脚本将会运行,”K”开头的在进入该运行级别时默认在执行,执行相应的脚本,会杀掉该服务。而所有S开头的,则在进入运行级别时,会被执行。字母之后的两位数字指定启动的顺序,较小的数字将先被执行。
Gentoo
Gentoo的init配置文件也是/etc/inittab,在该文件中前三行:
id:3:initdefault:
si::sysinit:/sbin/rc sysinit
rc::bootwait:/sbin/rc boot
第一行:指定gentoo的默认运行级别是3,接下来两行表明gentoo的runlevel首先开始于sysinit,接着是boot。Gentoo使用字符串,而非简单的数字标记运行级,有sysinit, boot, default, nonetwork, single, shutdown六个runlevel,简单明了。
这些runlevel对应于/etc/runlevels/下的文件夹,每个文件夹中都是一些符号链接,指向/etc/init.d/下的脚本。系统启动的时候就是通过执行这些软连接启动相应的进程。
如果想在开机时启动哪个进程,只需要将该进程的软连接添加到对应的/etc/runlevels/文件夹下即可。
Gentoo提供了一个程序rc-update,可以很方便的管理启动项:
#rc-update add xxx default
#rc-update del xxx default
#rc-update show
第一行将xxx启动项添加到default运行级,第二行从default runlevel中删除xxx,第三行查看现在的启动项。
参考:
http://www.gentoo.org/doc/en/handbook/handbook-x86.xml?part=2&chap=4
http://www.yolinux.com/TUTORIALS/LinuxTutorialInitProcess.html
http://en.wikipedia.org/wiki/Linux_startup_process
http://www.debian-administration.org/article/An_introduction_to_run-levels

近期评论