Linux开机启动过程

1. 加载BIOS
2. 读取MBR
3. Boot Loader
4. 加载内核
5. init根据inittab文件来设定运行级别
6. init进程执行rc.sysinit
7. 启动内核模块
8. 执行不同运行级别的脚本程序
9. 执行/etc/rc.d/rc.local
10. 执行/bin/login程序进行登录

1. 加载BIOS
按下开机电源,计算机会首先加载BIOS并在执行开机自检,之后BIOS将控制权交给磁盘第一个扇区。

2. 读取MBR
磁盘上第0磁道第一个扇区被称为MBR,也就是Master Boot Record,即主引导记录,它的大小是512字节,里面存放了预启动信息和分区表信息。
系统找到BIOS指定的MBR后,会将其加载到内存中,由BIOS从第一扇区加载的代码称为第一阶段启动加载程序。

3. Boot Loader
Boot Loader就是在操作系统内核运行之前运行的一段小程序,通常是GRUB。
Ubuntu 12中GRUB的配置文件为/boot/grub/grub.cfg。
Fedora 17中GRUB的配置文件为/boot/grub2/grub.cfg。
系统读取内存中的GRUB配置信息,并依照此配置信息来启动操作系统。

4. 加载内核
根据GRUB设定的内核映像路径,系统读取内存映像,并进行解压缩操作。
Ubuntu 12内核:/boot/vmlinuz-3.2.0-29-generic-pae
Ubuntu 12内核映像:/boot/initrd.img-3.2.0-29-generic-pae
Fedora 17内核:/boot/vmlinuz-3.3.4-5.fc17.i686.PAE
Fedora 17内核映像:/boot/initramfs-3.3.4-5.fc17.i686.PAE.img
系统将解压后的内核加载到内存中,然后调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。
在start_kernel()的结尾,内核通过调用kernel_thread()函数创建出第一个系统内核进程(即1号进程,init进程),该进程执行的是内核的init()函数,负责下一阶段的启动任务。

5. init根据inittab文件来设定运行级别
内核被加载后,第一个运行的程序便是/sbin/init,该文件会读取/etc/inittab文件,并依据此文件来进行初始化工作。
/etc/inittab文件最主要的作用就是设定Linux的运行级别,其设定形式是“:id:5:initdefault:”。
Linux的运行级别设定如下:
0:关机
1:单用户模式
2:无网络支持的多用户模式
3:有网络支持的多用户模式
4:保留,未使用
5:有网络支持有X-Window支持的多用户模式
6:重新引导系统,即重启

6. init进程执行rc.sysinit
设定了运行级别后,Linux系统执行的第一个用户层文件就是/etc/rc.d/rc.sysinit脚本程序。
线程init的最终完成状态是能够使得一般的用户程序可以正常地被执行,从而真正完成可供应用程序运行的系统环境。

7. 启动内核模块
依据/etc/modules.conf文件或/etc/modules.d目录下的文件来装载内核模块。
Ubuntu下该文件为/etc/modules。

8. 执行不同运行级别的脚本程序
根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
Ubuntu下脚本路径:/etc/rcN.d。

9. 执行/etc/rc.d/rc.local
rc.local就是在一切初始化工作完成后,Linux留给用户进行个性化设置的地方。你可以把你想设置和启动的东西放到这里。

10. 执行/bin/login程序进行登录
进入登录界面,等待用户输入用户名和密码。

猜你喜欢

转载自txazo.iteye.com/blog/1680628