这段时间在学校Linux系统内核的相关知识,本来想要学一点写一点日记,但是后来发现这段知识对我来说比较抽象,所以花了两三天的时间才搞明白,又反复裁剪实验了数十次,现在终于可以在半小时之内完成系统裁剪,与模块的装载卸载等操作。现在就总结一下如何只使用Linux内核来制作一个小型的操作系统,当然在此之前我需要先总结一下Linux系统的启动流程。
1.Linux系统启动流程
POST(加电自检)——>BIOS(Boot Sequence)——>MBR(BootLoader(前446字节):一般分阶段1,阶段1.5以及阶段2,其中阶段1,即stage1是存放在MBR中,stage1.5和stage2都是存储在/boot中的,这个分区是在跟文件系统没有挂载时的另一个独立小分区)——>Kernel(加载vmlinuz和initrd或者initramfs)——>/sbin/init(其配置文件是 /etc/inittab)
过程大概就是,先加电自检,然后CPU会到指定的区域上读取代码,一般是ROM中,自检完成后根据BIOS上的Boot Sequence选择启动设备,然后到该设备上第一个扇区上的446字节中去获取系统需要加载的内核vmlinuz,以及设备的基础驱动文件initrd或者initramfs,这样就可以挂载根文件系统,挂载完成以后就开始初始化系统,即启动第一个用户进程/sbin/init(这也是为什么init的PID永远为1的原因),根据init的配置文件/etc/inittab来进行系统的初始化流程,启动用户空间,定义系统启动级别等等。
如下图(图片选自网络):
2.init配置文件的主要作用
init的配置文件是/etc/inittab,主要作用有
a.设置默认运行级别
b.定义运行的初始化脚本(rhel5中是/etc/rc.d/rc.sysinit)
c.启动指定级别下的S开头的服务,关闭以K开头的服务
d.定义CrtlAltDel组合键功能,默认是3分钟后重启系统,一般需要注释掉或者修改掉
e.启动字符终端
f.启动图形终端
3.CentOS5.X的init配置文件
#
# inittab This file describes how the INIT process should set up
# the system in a certain run-level.
#
# Author: Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
# Modified for RHS Linux by Marc Ewing and Donnie Barnes
#
# Default runlevel. The runlevels used by RHS are:
# 0 - halt (Do NOT set initdefault to this)
# 1 - Single user mode
# 2 - Multiuser, without NFS (The same as 3, if you do not have networking)
# 3 - Full multiuser mode
# 4 - unused
# 5 - X11
# 6 - reboot (Do NOT set initdefault to this)
#
<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">id:5:initdefault:<span style="white-space: pre;"> </span>//设置系统默认运行级别</span></span>
# System initialization.
<span style="color:#ff0000;">si::sysinit:/etc/rc.d/rc.sysinit<span style="white-space:pre"> </span>//指定系统初始化使用脚本</span>
<span style="color:#ff0000;">l0:0:wait:/etc/rc.d/rc 0</span>
<span style="color:#ff0000;">l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6<span style="white-space:pre"> </span>//这7行中都有一个关键字wait,表示一旦切换或者启动至该级别,就会让相应目录下所有以S开头的服务启动,并结束所有以K开头的服务</span>
# Trap CTRL-ALT-DELETE
<span style="background-color: rgb(204, 204, 204);"><span style="color:#ff0000;">ca::ctrlaltdel:/sbin/shutdown -t3 -r now<span style="white-space: pre;"> </span>//定义同时按下ctrl+alt+del组合键的操作为3分钟之后重启系统</span></span>
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
<span style="color:#ff0000;">pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"<span style="white-space:pre"> </span>//定义UPS电源相关选项,一般不需要设置</span>
# If power was restored before the shutdown kicked in, cancel it.
<span style="color:#ff0000;">pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"<span style="white-space:pre"> </span>//定义电源选项,一般不需要设置</span>
# Run gettys in standard runlevels
<span style="color:#ff0000;">1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6<span style="white-space:pre"> </span>//以上6行定义了是一种虚拟登录接口,关键字respawn表示一旦该服务别关闭,马上重启。这也是为什么我们一旦登录出来系统,马上又可以登录进去,因为这个登录服务又被启动了</span>
# Run xdm in runlevel 5
<span style="background-color: rgb(255, 255, 255);"><span style="color:#ff0000;">x:5:respawn:/etc/X11/prefdm -nodaemon<span style="white-space: pre;"> </span>//我现在还不太清楚该项代表的含义,有知道的朋友麻烦跟我说一下,非常感谢。</span></span>
该脚本位于/etc/rc.d/rc.sysinit,该脚本的主要功能有:
a.设定主机名
b.激活selinux和udev
c.挂载文件系统
d.激活swap
e.以读写方式重新挂载文件系统
f.设置内核参数
g.读取系统时钟
h.键盘映射
i.加载额外的驱动程序
5.于是整个系统的启动流程图就如下图所示(图片选自网络)