第一步---加载BIOS
打开电源,系统会首先加载BIOS,BIOS会运行上电自检程序,对电脑的硬件设施进行完全彻底的检验和测试,检测完成后通过BIOS获取到与CPU、内存、硬盘、设备启动顺序等相关的信息。
第二步---读取MBR记录
硬盘上的0磁道的第一个扇区既是MBR,大小为512字节,存放着预启动信息、分区表信息,当系统读取到MBR记录,就会把MBR记录复制到0x7c00地址所在的物理内存之中,成为boot loader(在centos中就是grub)。
第三步---加载boot loader
在操作系统加载内核之前,会先加载boot loader,通过boot loader初始化硬件设备、建立内存映射图,从而把系统的硬件和软件环境调试到一个合适的状态,为系统加载内核做好准备。
第四步---加载内核
通过上一步,系统的硬件和软件环境已经做好准备,可以加载内核。系统首先读取内存映像,并解压内存映像,把解压之后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成linux内核的建立。
第五步---定义运行级别
内核加载成功之后,/sbin/init会首先运行,该程序会去读取/etc/inittab文件,依据文件的配置进行初始化工作,设定系统的运行级别。
第六步---执行rc.sysinit
运行级别定义之后,系统会执行/etc/rc.d/rc.sysinit脚本,这个脚本会设定网络配置、启动swap分区、设定/proc等等内容,有关rc.sysinit脚本的具体功能,可以查看/etc/rc.d/rc.sysinit里面的内容。
第七步---加载内核模块
依据/etc/modules.conf文件或/etc/modules.d目录下的文件来加载内核模块,这个功能的实现与sys_init_module()函数和load_module()函数有关,但是我本人不是很了解这两个函数,社区中对于linux开机如何加载内核模块也没有一个很明确规范的文章,如果有些朋友对这一方面有所兴趣,可以私信我,互相学习讨论。
第八步---运行不同运行级别的脚本程序
根据运行级别的不同,系统会运行rc0.d到rc6.d中的相应的脚本程序,来完成相应的初始化工作和启动相应的服务。
第九步---执行/etc/rc.d/rc.local
在系统启动的最后阶段,系统会执行rc.local里面的命令,这是自定义开机启动程序,可以根据自己的需求把需要开机自动运行的程序写在这个脚本里
第十步---执行/bin/login程序
login程序会提示用户输入账号及密码,如果用户名与密码输入正确,则为用户初始化环境,并将控制权交给shell,login程序成功后,系统开始设置各种环境变量。对于bash来说,系统首先寻找/etc/profile脚本文件并执行它;然后如果用户的主目录中存在.bash_profile文件,就执行它,在这些文件中又可能调用了其他配置文件,所有的配置文件执行后,各种环境变量也就设好了,至此整个启动过程就结束了。
本文只是对Centos启动过程做一次大概的解析,其中还有很多内容未涉及,深究起来,可以写几万字呢,如果此文有勘误,欢迎大家在下面留言。