Linux: 系统启动过程分析
以前经常觉得环境管理是运维的事,对于Linux觉得能用就行,后来实际工作中发现,当你不理解Linux内部怎么工作的,就无法在遇到问题的时候进行排查。
我们先看一个开机的流程图:
1.加载 BIOS 的硬件信息并进行自我测试,并依据设定取得第一个开机装置的代号;
2.读取并执行第一个开机装置的 MBR 的 boot Loader(lilo, grub, spfdisk 等等);
3.依据 boot loader 的设定载入 Kernel ,Kernel 开始检测硬体并载入驱动程式;
4.在硬件驱动成功后,Kernel 会主动呼叫 systemd(初始化) 程序。
大概的流程就是如此,但是每一步都是干嘛的,我们来详细说一下。
1:加载BIOS硬件信息并自检
BIOS(Basic Input Output System),基本输入输出系统,是一个永久地记录在ROM中的一个软件,是操作系统输入输出管理系统的一部分。早期的BIOS芯片确实是"只读"的,里面的内容是用一种烧录器写入的,一旦写入就不能更改,除非更换芯片。现在的主机板都使用一种叫Flash EPROM的芯片来存储系统BIOS,里面的内容可通过使用主板厂商提供的擦写程序擦除后重新写入,这样就给用户升级BIOS提供了极大的方便。
BIOS的功能由三部分组成,分别是POST,初始化和Runtime服务。POST阶段完成后它将从存储器中被清除,而Runtime服务会被一直保留,用于目标操作系统的启动。
步骤1:上电自检POST(Power-on self test),主要负责检测系统外围关键设备(如:CPU、内存、显卡、I/O、键盘鼠标等)是否正常。例如,最常见的是内存松动的情况,BIOS自检阶段会报错,系统就无法启动起来;
步骤2:初始化,包括创建中断向量、设置寄存器、对一些外部设备进行初始化和检测等,其中很重要的一部分是BIOS设置,主要是对硬件设置的一些参数,当电脑启动时会读取这些参数,并和实际硬件设置进行比较,如果不符合,会影响系统的启动。
步骤3:引导程序,会执行一段小程序用来枚举本地设备并对其初始化。这一步主要是根据我们在BIOS中设置的系统启动顺序来搜索用于启动系统的驱动器,如硬盘、光盘、U盘、软盘和网络等。我们以硬盘启动为例,BIOS此时去读取硬盘驱动器的第一个扇区(MBR,512字节),