位置:海鸟网 > IT > linux/Unix >

Linux系统启动过程

1.BIOS:基本输入输出系统,记录主板芯片集和相关设置,比如cpu与接口的通信频率,启动设备的搜索顺序,中断信息等。
当机器上电后,系统开始读取BIOS,当获取到BIOS的相关设置值,系统进行开机自检。当获取到硬件信息的完后,主机开始尝试由存储媒体加载操作系统,然后由BIOS引导读取硬盘的MBR读取,MBR上记录的是引导加载操作系统的grub加载程序,为什么不直接引导加载操作系统呢?因为MBR的存储是有限的,最多只有512KB的空间。之后由grub或者LILO引导程序加载操作系统。要想引导程序能够加载操作系统,引导程序必须要能够具有识别核心的功能。
引导程序除了可以直接指定核心文件夹来启动外,也可以指定某个超级块的引导加载程序接管启动的核心加载流程,这同时说明引导程序可以存在在MBR与超级块中,这也就多重系统能够存在的原因。Window的引导程序强制安装在MBR与超级块中,linux可以选择安装在MBR或者超级块中,因此要装window与linux两个系统的时候,需要先装好Window然后再装Linux,或者window的引导程序无法识别到linux的核心文件。
引导程序引导开始读取核心文件(/boot/vmlinuz)后,Linux将核心解压到主存储器中,利用核心的功能以及相应的驱动程序,开始测试与驱动相应的硬件设备。在加载核心时,系统只会载入根目录,而且是以只读的方式载入,此外,为了某些功能可以用文件的方式读取,系统在启动的时候,会建立虚拟盘(RAM DISK),这就需要使用initrd以及linuxrc,协同启动的过程。
核心加载完毕后,系统就绪,程序开始执行。运行第一个程序/sbin/init(PID=1),该程序从/etc/inittab中获取到运行等级(runlevel)之后,执行/etc/rc.d/rc.sysinit脚本来设置系统的环境,在执行sysinit脚本中,默认调用/etc/sysconfig中的文件来进行设置系统的环境,若想看系统加载的信息可以利用dmesg来查看。若想要加载自定的模块,则将整个模块写入到etc/sysconfig/modules/*.modules中,该目录下,只要文件以.modules结尾即可。若新加了硬件,但是系统不支持需要做的事情:1.重新编译核心,并加入最新的硬件驱动程序源码。
2.将该硬件的驱动程序编译为模块,在启动时加载该模块。
当上述步骤完成后,系统顺利运行,需要启动系统相关的服务与网络服务了,这时利用由/etc/inittab获取到的运行等级来加载相应的系统与网络服务,每个等级都对应一个启动目录,对应于/etc/rc.d/rc.n中,这些启动目录存放的是一些链接文件,链接到init.d的脚本文件中去。该目录下的文件都以K、S字母开头的,S表示启动时需要的文件,K则表示关闭时需要的文件。
/etc/init.d目录放的是服务的启动脚本,而/etc/sysconfig则是系统设置的启动脚本,用来设置系统环境的。
因此当要切换不同的运行等级的时候,用init runlevel就可以切换,不同的运行等级加载的服务是不一样的。若你随系统的启动执行自定义的命令,可以利用/etc/rc.d/rc.local这个文件来执行,该文件相当于window下的autoexec.bat文件。
开机启动过程:
BIOS-àMBR---àKernel code-à/sbin/init--àsysinit(期间用到/etc/sysconfig)-à/etc/rc.d/rc.n(用到/etc/initd.d)--à/etc/rc.d/rc.local 其中服务的启动在/etc/rc.d/rc.n以及/etc/rc.d/rc.local这两个过程中。
 
核心模块:
核心:/boot/vmlinuz
核心解压缩所需的RAM DISK:/boot/initrd
核心模块:/lib/modules/version/kernel
核心源码:/usr/src/linux
核心被加载到系统中,记录的信息。
核心版本:/proc/version
系统核心功能:/proc/sys/kernel
 
要想处理核心模块,自然要了解核心提供的模块之间的关联性,linux提供了一些模块依赖性的解决方案,/lib/modules/modules.dep文件记录着模块之间的关联性,利用depmod命令可以用来更新模块之间的依赖关系。利用lsmod可以查看所核心所加载的模块,modinfo可以查看模块的相应的信息,模块的手工加载与删除用insmod与rmmod,但是不解决依赖性关系,而才用modprobe可以加载依赖关系。