主要的启动流程
初始化bios→执行启动加载器→载入内核→启动init服务
BIOS
1.1检测所有外设
检测有那些外设,以及外设的错误
1.2寻找启动设备
依据BIOS里面设置的启动顺序来寻找可以启动的设备(CD-ROM、IDE-HDD、Floppy….)
启动加载器
BIOS找到启动设备后,接下来就是启动该设备中的操作系统。BIOS会试着依照下列的顺序找出启动扇区,也就是主引导记录(MBR)的磁区。
2.1寻找硬盘的第一个扇区,也就是主引导记录。
2.2如果主引导记录中没有存储操作系统,则寻找磁盘中标注为启动分区(BootPartition)的第一个扇区中的操作系统。
不管是主引导记录扇区还是启动分区中的第一个扇区,存储操作系统的空间都只有446个字节。目前的操作系统没法挤在这么小的空间内。如果没有办法在上面提到的扇区中存储操作系统的内核,那么,就会使BIOS无法继续启动的工作。为了避免重新定制BIOS的规则,又能让BIOS可以顺利启动存储于其他位置的操作系统内核,人们想出来的办法就是写一个小小的程序,存储到启动扇区的前446个字节空间内。然后再由这个小程序来加载存储到其他位置的操作系统。
这个小程序就是“启动加载器”(linux默认是GRUB)
启动内核
当BIOS顺利的执行启动加载器后,启动加载器会寻找存储在其他扇区的操作系统,然后启动它。Linux内核启动后会执行下列几项工作
3.1检测所有的硬件设备
内核向BIOS查询计算机的所有硬件信息,然后自己接管这些硬件设备,以便提供给系统使用。
3.2驱动硬件设备
接着linux驱动硬件
要驱动硬件设备,就必须加载它的驱动。linux的驱动程序分为编译在内核的静态驱动程序与内核模块的动态驱动程序两种。其中动态驱动程序存储在文件系统中。
由于此时还没有挂载任何文件系统,所以只能使用静态驱动程序,驱动一些其能驱动的程序。其他的硬件要等到挂载完根文件系统后才能驱动。
以只读的方式挂载根文件系统
接着linux内核会尝试着去挂载根文件系统,挂载根文件系统有两个目地。
安装适当的内核模块,以便驱动某些硬件设备或启动某些功能。
启动存储于根文件的init服务,以便让init服务接管后续的启动工作。
启动init服务
启动内核后的最后一个动作就是启动init服务。linux内核会按照如下顺
序来寻找init服务。
找/sbin/是否有init服务
找/etc/init
找/bin/init
如果都找不到,最后执行/bin/sh
初始化系统环境
启动init服务时,init服务会读取/etc/inittab文件,根据该文件的设置进行初始化系统环境的工作。该文件定义init服务在linux启动过程中必须依序执行以下几个Script。
/etc/init.d/rc.sysinit
/etc/init.d/rc
/etc/init.d/rc.local
下面介绍一下这几个RCScript都做了什么事情
/etc/init.d/rc.sysinit
启动udev与SELinux子系统
设置内核参数
设置系统时间
加载键盘对应表
启用虚拟内存空间
设置主机名
检测并挂载所有文件系统
初始化硬件
启用软件磁盘阵列与LVM
初始化串行端口
清除过期的锁定文件与IPC文件
重新设置硬盘参数
/etc/rc.d/rc
这个用来建立RunLevel环境
/etc/rc.d/rc.local
存放用户启动的脚本