Linux 系统的启动,从计算机开机通电自检开始,一直到登陆系统,需要经历多个过程。学习 Linux 的启动过程,有助于了解 Linux 系统的结构,也对系统的排错有很大的帮助。
系统引导过程:通电 -> BIOS自检 -> 磁盘引导 -> grub2文件引导 -> 内核加载 -> 系统初始化镜像。
下面依次介绍这些引导过程。
2. BIOS自检
BIOS(Basic Input Output System,基本输出输入系统),完整地说应该是ROM-BIOS,是只读存储器基本输入/输出系统的简写,它实际上是被固化到计算机中的一组程序,为计算机提供最低级的、最直接的硬件控制。准确地说,BIOS是硬件与软件程序之间的一个"转换器",或者说是接口(虽然它本身也只是一个程序),负责解决硬件的即时需求,并按软件对硬件的操作要求具体执行。
BIOS的主要功能
- 第一次检查计算机硬件和外围设备(第二次自检由内核完后,后续会讲),例如 CPU、内存、风扇灯。当 BIOS 一启动,就会做一个自我检测的工作,整个自检过程也被称为 POST(Power On Self Test)自检。
- 如果自检没有问题,BIOS 开始对硬件进行初始化,并规定当前可启动设备的先后顺序,选择由那个设备来开机。
- 选择好开启设备后,就会从该设备的 MBR(主引导目录)中读取 Boot Loader(启动引导程序)并执行。启动引导程序用于引导操作系统启动,Linux 系统中默认使用的启动引导程序是 GRUB。
3. 磁盘引导
为什么需要磁盘引导程序
为什么需要磁盘引导程序而不是直接载入操作系统?或许是因为历史原因,BIOS最初是为最原始的8位PC所创,8位的PC磁盘很小,所以BIOS只能先载入磁盘引导程序然后通过磁盘引导程序导入操作系统。
MBR(Main Boot Record,主引导记录区) 共占用了一个扇区,也就是 512 Byte。其中 446 Byte 安装了启动引导程序,其后 64 Byte 描述分区表,最后的 2 Byte 是结束标记。
位置:0磁道1扇区的前446个字节
作用:记录grub2引导文件的位置
查看MBR所在的位置
Boot参数下有*号,说明MBR位于该设备。
模拟系统丢失MBR时的启动情况
若MBR数据丢失,系统会因为找不到启动分区而停止启动,因此模拟此情况。
- 删除MBR
命令:dd if=/dev/zero of=/dev/nvme0n1 bs=446 count=1
含义:清空/dev/nvme0n1上的MBR数据
- 重启系统
命令:reboot
此时系统无法重启。
接下来对该系统进行修复。
系统丢失MBR时的修复
清空MBR后,系统无法重启,若要修复,需将系统的启动方式调整为从光盘(CD-ROM)启动,将光盘中的MBR重新写入磁盘中即可修复此问题。
- 此时,重启系统自动进入安装界面。在安装界面的排错选项上按下
回车键Enter
- 选择进入rescue系统
- 在此模式下选择1,将正确的系统挂载到当前设备上。
- 根据提示,执行
chroot /mnt/sysimage
命令
- 将MBR重新写入磁盘
命令:grub2-install /dev/nvme0n1
- 退出shell,重启系统。
命令:exit
(注意:需输入两次)
4. grub2文件引导
作用:指定启动分区/boot目录的位置,指定系统启动过程中需要加载的文件,加载操作系统的内核。
文件的位置:
Linux7中:/boot/grub2/grub.cfg
Linux8中:/boot/grub2/grub.cfg
和/boot/loader/entries/xxxxxxxxx.conf
在Linux7中,grub.cfg文件的内容:
第一个标题的功能:
- 设置启动分区
hd0,msdos1
指第一块硬盘的第一个分区,即/boot
分区 - 在启动分区中读取内核镜像
- 在启动分区中读取系统初始化程序镜像
查看一下/boot
目录中是否有这两个文件:
正确读取这两个文件后才能启动系统,完成系统的初始化过程。
此功能在Linux8与Linux7中不同。Linux8中需通过两个文件实现文件引导。
grub.cfg仅设置启动分区的位置,内核镜像与初始化镜像的读取需其它文件完成。
编辑上图中框起来的配置文件:
模拟系统丢失grub2引导文件时的启动情况
在Linux7中仅需执行命令:rm -fr /boot/grub2/grub.cfg
在Linux8中需执行命令:rm -fr /boot/loader/entries/xxxxxxxxx.conf
删除正常启动模式下的配置文件后,文件引导自动进入rescue模式,此时仍可以正常启动系统。
因此,为了模拟系统无法启动的情况,需删除/boot/loader/entries
目录下的全部配置文件。
此时,系统无法进行自动文件引导。
系统修复
在Linux7中需执行命令:grub2-mkconifg > /boot/grub2/grub.cfg
在Linux8中需执行命令:
kerne-install add 内核版本号 内核镜像
kernel-install add $(uname -r) /lib/modules/$(uname -r)/vmlinuz
以上修复方法均为不小心删除文件且系统未重启时使用,若删除文件后将系统重启了,则要执行手动修复,以Linux8的系统为例进行说明。
删除引导文件后,系统无法正常启动,会进入以下界面:
手动配置引导文件的位置后启动系统。
其中各个命令的含义如下:
set root='hd0,msdos1'
设置启动分区的位置
linux /vmlinuz-4.18.0-80.el8.x86_64 ro root=/dev/nvme0n1p3
读取内核镜像,并将镜像以只读方式挂载在nvme0n1p3上。注意:具体挂载在哪个盘上要看之前根目录在哪个盘上,系统不同,挂载的位置也不尽相同。
initrd /initramfs-4.18.0-80.el8.x86_64.img
读取初始化镜像
boot
启动系统(若之前的配置均正确无误,执行此命令后系统能正常启动)
Linux7与Linux8系统的手动引导过程相同。
此时虽然能正确完成启动,但无法永久记录此次引导过程,查看/boot/loader/entries/
目录,其下并无配置文件。
因此开机前进行的配置仅是一个临时配置,永久解决此问题仍需使用kernel-install add
命令进行引导过程的修复。
不同的系统内核版本号不相同,可将上述命令中的内核版本具体信息修改为$(uname -r)
使用kernel-install add
命令增加配置文件后,系统开机时可以自动引导文件。
5. 内核加载
内核加载需要读取的文件:/boot/vmlinuz-$(uname -r)
我们可以看到在文件引导的过程中系统就读取了/boot/vmlinuz-$(uname -r)
文件加载内核。
内核加载的作用:根据grub设定的内核映像所在路径,系统读取内存映像。
模拟系统丢失/boot/vmlinuz-$(uname -r)
文件
命令:rm -fr /boot/vmlinuz-$(uname -r)
删除镜像文件后重启系统,启动失败。
系统修复
系统丢失/boot/vmlinuz-$(uname -r)
文件后若重新启动系统,可以从rescue模式启动。但是这样系统永远无法在正常模式下成功启动,并不算真正的修复。
此时的系统要想真正修复就需要重装内核。
- 从CD-ROM启动系统
- 进入排错模式
- 将镜像挂载在mnt目录下
命令:mount /dev/cdrom /mnt
- 重装内核
- 退出shell,关闭系统。
- 将系统的启动方式修改为—从硬件启动系统
此时,系统成功启动。
6. 系统初始化镜像
系统初始化镜像的文件位置:/boot/initramfs-$(uname -r).img
作用:加载系统时钟、加载SELinux、加载系统的主机信息、加载/etc/fstab文件中的磁盘挂载策略、加载磁盘配额、初始化系统程序、开启开机启动服务、开启虚拟控制台、开启图形。
以初始化系统程序为例进行说明。
- 进入
/etc/systemd/system
目录,该目录中均为与初始化系统程序相关的文件
- 查看控制系统模式的文件–
default.target
default.target
是一个软连接,它指向graphical.target
文件,说明现在的系统为图形化模式。当系统不是图形化模式时,default.target
指向其它文件(如下图)。
- 查看开机启动的服务
这个目录中包含系统所有开机启动的程序,它们均以软连接的方式指向程序的真实位置。
模拟系统丢失/boot/initramfs-$(uname -r).img
文件
命令:rm -fr /boot/initramfs-(系统版本号).img
丢失此文件后重启系统,启动失败。
系统修复
命令:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
- 从CD-ROM启动系统
- 进入排错模式
- 修复系统
命令:mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
- 退出shell,关闭系统。
- 将系统的启动方式修改为—从硬件启动系统
此时,系统成功启动。
模拟default.target
指向reboot.target
导致系统无法启动的情况
- 将系统的默认模式该为reboot模式
命令:systemctl set-default reboot.target
- 执行
reboot
命令,系统无法正常启动(无限重启)。
系统修复
- 在开机选择界面按e编辑进入到引导文件编辑模式
- 手动更改系统启动模式
- 按
Ctrl-x
开启系统 - 查看系统的默认启动模式,发现它并未修改,因此需手动将其修改为
graphical.target
参考文献: