梁老虎

人无远虑,必有近忧

导航

linux启动流程

[摘至鸟哥的linux私房菜] 今天看了linux启动相关的内容,把主要的部分记录如下。
linux的基础启动流程
1. 加载BIOS的硬件信息,并获取第一个启动设备的代号。
2. 读取第一个启动设备的MBR的引导加载程序(即lilo、grub、spfdisk等)的启动信息。
3. 加载操作系统的核心信息,核心开始解压,并尝试驱动所有的硬件设备。
4. 核心执行init程序并获得运行信息。
5. init执行/etc/rc.d/rc.sysinit文件。
6. 启动核心的外挂模块(/etc/modprobe.conf)。
7. init执行运行的各个批处理文件(Script)
8. init执行/etc/rc.d/rc.local文件。
9. 执行/bin/login程序,等待用户登录。
10. 登录之后开始以shell控制主机。

1. linux核心的引导
操作系统的核心是放在文件系统中的,要想正确加载核心就必须提前识别文件系统。系统刚启动的时候,就需要通过引导加载程序(即lilo、grub、spfdisk等)来识别文件系统,引导核心。要想加载linux的核心就必须能识别linux的文件系统,要加载windows核心就必须能识别windows文件系统。而grub是同时支持linux和windows的。但windows的加载程序并不支持linux文件系统,所以在多重启动设置的时候,总是要先装windows而后装Linux。

核心文件在哪里呢?一般来说,它会放在/boot里,并且取名为/boot/vmlinuz。

在加载核心的过程中,必须知道,系统只会“载入根目录”,并且是以只读方式载入的。有时为了让某些功能可以用文件的方法来读取,有的系统在启动的时,会建立虚拟盘(ramdisk),这就需要使用initrd以及linuxrc了。在加载核心的时候,一起加载initrd的映像文件(boot/initrd-xxxx.img),并利用linuxrc(在initrd的映像文件内)程序来加载模块。在核心驱动外部硬件的工作完成之后,initrd所建立的虚拟盘就会被删除。

2. 第一个程序init的加载和runlevel设置
在核心加载完成之后,系统就准备好了,等待程序的执行。整个linux系统中,第一个执行的程序就是“/sbin/init”。init程序做的工作相当多,除了利用设置文件“/etc/inittab”来获取运行等级之外,还会通过运行等级的设置值启动不同的服务项目。运行等级是指linux通过设置不同等级来规定系统用不同的服务来启动,让linux的使用环境不同。

"/etc/inittab"中有这么一句"si::sysinit:/etc/rc.d/rc.sysinit",表明系统需要主动使用"rc.sysinit"这个shell脚本来设置系统环境。但这个文件的文件名在各个版本中是不一样的,需要自行查看确认。
Code

3. init处理系统的初始化流程(/etc/rc.d/rc.sysinit)
(1)获取网络环境与主机类型。首先会读取网络环境设置文件"/etc/sysconfig/network",获取主机名称与默认网关等网络环境。
(2)测试与载入内存设备/proc及usb设备/sys。除了/proc外,系统会主动检测是否有usb设备,并主动加载usb驱动,尝试载入usb文件系统。
(3)决定是否启动SELinux。
(4)接口设备的检测与即插即用(pnp)参数的测试。
(5)用户自定义模块的加载。用户可以再"/etc/sysconfig/modules/*.modules"加入自定义的模块,此时会加载到系统中。
(6)加载核心的相关设置。又一个文件"/etc/sysctl.conf",按这个文件的设置值配置功能。
(7)设置系统时间(clock)。
(8)设置终端的控制台的字形。
(9)设置raid及LVM等硬盘功能。
(10)以方式查看检验磁盘文件系统。
(11)进行磁盘配额quota的转换。
(12)重新以读取模式载入系统磁盘。
(13)启动quota功能。
(14)启动系统随机数设备(产生随机数功能)。
(15)清楚启动过程中的临时文件。
(16)将启动信息加载到"/var/log/dmesg"文件中。
如果想知道启动过程中发生了什么事可以查看dmesg文件。

4. 启动系统服务"/etc/rc.d/rc*.d"与启动设置文件"/etc/sysconfig"
之前结束了inittab中的rc.sysinit之后,系统可以顺利工作了,只是还需要启动系统所需要的各种服务,这样主机才可以提供相关的网络和主机功能。因此根据之前设置的运行等级,会启动不同的服务项目。如果当时我们在inittab中选择了等级3,系统则会在"/etc/rc.d/rc3.d"目录中运行相应的服务内容,选择等级5,就在"/etc/rc.d/rc5.d"目录内。

该目录下的内容全部都是以 S 或 K 开头的链接文件,都链接到"/etc/rc.d/init.d"目录下的各种shell脚本。S表示的是启动时需要start的服务内容,K表示关机时需要关闭的服务内容。如果我们需要自己增加启动的内容,可以再init.d目录中增加相关的shell脚本,然后在rc*.d目录中建立链接文件指向该shell脚本。这些shell脚本的启动或结束顺序是由S或K字母后面的数字决定,例如S01sysstat表示第一个执行sysstat脚本,S99local表示排在第99位执行rc.local脚本。

5. 用户自定义引导程序(/etc/rc.d/rc.local)
一般来说,自定义的程序不需要执行上面所说的繁琐的建立shell增加链接文件的步骤,只需要将命令放在rc.local里面就可以了,这个shell脚本就是保留给用户自定义启动内容的。

6. 启动终端和X-Window界面
完成了系统所有的启动任务后,linux会启动终端或X-Window来等待用户登录。
tty1,tty2,tty3...这表示在运行等级1,2,3,4的时候,都会执行"/sbin/mingetty",而且执行了6个,所以linux会有6个纯文本终端,mingetty就是启动终端的命令。
除了这6个之外还会执行"/etc/X11/prefdm -nodaemon"这个主要启动X-Window

7. 有关变换运行等级
当linux已经登录之后,有时候还希望更换运行等级,一种方法是改变"/etc/inittab"内的设置内容,将"id:3:initdefault:"中的数字改成相应等级,然后重启即可。

如果只是想暂时地改变运行等级,下次启动还是按原等级登录,可以直接使用init [0-6]命令来改变运行等级。一般来说,运行等级的不同只是相关的启动服务内容的不同而已,因此使用命令改变等级会比较两个改变等级之间的服务内容,关闭一些新等级中不需要的服务项目,启动新等级需要的服务,而保量新等级和原等级中共有的服务内容。查询目前等级的命令也很简单,只需要输入runlevel即可。如:[root@linux ~]# runlevel  结果显示:N 3

posted on 2009-09-30 10:55  梁老虎  阅读(29159)  评论(2编辑  收藏  举报