# 系统引导过程是指 Linux 操作系统从开机到进入登录界面的完整启动流程,主要包括 BIOS 加电自检、引导加载程序(GRUB2)加载内核和 initramfs、内核初始化硬件、systemd 启动第一个进程并逐层启动系统服务。当引导出现故障时,可通过进入救援模式或单用户模式修复 GRUB 配置、修复文件系统、重装内核、重置 root 密码等常见问题,保障系统可正常启动运行。
一、系统引导过程

1. 通电
# 如果通电有问题,检查插头或者硬件
2. bios 设备初始化
# 对硬件进行检测,设定系统时钟(bios 里的时钟叫硬件时钟)
3. 磁盘引导阶段
(1)磁盘引导过程
# 磁头对磁盘读取数据;找到系统启动分区
(2)引导记录MBR
# 引导记录 MBR 引导磁头下一步读取哪里
# MBR大小:446字节
# 512-446=66-64=2
# 446——MBR引导记录,64——MBT主分区表,2——标识此设备是硬盘
# 如果 MBR 丢失或损坏,则磁头不工作
4.文件引导阶段
(1)系统自动引导文件
# 加载内核和内核启动参数
# 加载系统初始化镜像
(2)引导文件位置
# 主引导文件:/boot/grub2/grub.cfg
# 子引导文件存放目录:/boot/loader/entries/
# 如果主引导文件丢失则读不到子引导文件
5.启动内核
# 加载内核文件
# 只读挂载跟设备
# 加载内核启动参数
6.系统初始化程序启动
# 按"/etc/fstab"中的信息改在设备
# 加载系统时钟
# 根据设定设置 selinux
# 根据系统设置启动服务
# 读取"/etc/rc.d/rc.local"
# 开启图形;如果没有图形,则直接进入登录界面
二、磁盘引导修复
1. BIOS 和 UEFI 固件
# 引导记录 MBR:446字节
# 注意高级固件类型中的 BIOS 和 UEFI 的修复过程是不一样的
# 如果固件类型是 UEFI 的,无法转换成 BIOS;转成功了也启动不了虚拟机,需要重新做一台固件类型为 BIOS 的虚拟机(即 UEFI 虚拟机出问题了也修复不了;所以避免出现问题,而不是出问题去修复)
# 重装 BIOS 虚拟机:https://blog.youkuaiyun.com/Forget_8/article/details/157298700?spm=1001.2014.3001.5502#t4
# BIOS 的虚拟机比 UEFI 的虚拟机启动更快

2. 查找启动分区的硬盘
# 查看磁盘列表
[root@node1 ~]# fdisk -l
Disk /dev/nvme0n1: 100 GiB, 107374182400 bytes, 209715200 sectors
Disk model: VMware Virtual NVMe Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xadc7beb4
Device Boot Start End Sectors Size Id Type
/dev/nvme0n1p1 * 2048 2099199 2097152 1G 83 Linux
/dev/nvme0n1p2 2099200 10487807 8388608 4G 82 Linux swap / Solaris
/dev/nvme0n1p3 10487808 209715199 199227392 95G 83 Linu
# /dev/nvme0n1p1中的"name0"——nr口的标识,"n1"——硬盘1,"p1"——分区1
# 看 Boot(启动)下列带"*"的那行的硬盘分区就是启动硬盘即引导硬盘;所以引导记录 MBR 就在"/dev/nvme0n1"中
Disk /dev/nvme0n1: 100 GiB, 107374182400 bytes, 209715200 sectors
Device Boot Start End Sectors Size Id Type
/dev/nvme0n1p1 * 2048 2099199 2097152 1G 83 Linux
3. 磁盘引导出问题
# 用"/dev/zero"(空格)来覆盖"/dev/nvme0n1"下的446(即MBR)文件,使其出现引导问题即磁盘引导坏了
# 如果446字节写错一点,比如写错447,则整个系统就没了
[root@node1 ~]# dd if=/dev/zero of=/dev/nvme0n1 bs=446 count=1
1+0 records in
1+0 records out
446 bytes copied, 0.000194586 s, 2.3 MB/s
[root@node1 ~]# reboot
4. 无启动光盘
# 正常情况下虚拟机启动时是没有启动光盘的,即“启动时连接”是没有勾选的

# 如果勾选了“启动时连接”,启动虚拟机时,会直接进入安装系统界面;勾选“启动时链接”启动虚拟机如下

# 所以在修复磁盘引导文件时需要取消勾选“启动时连接”;取消勾选“启动时连接”启动虚拟机如下

# 然后因为有网卡的原因,所以现在是网络启动——Network boot from VMwara VMXNET3,然后光标会一直闪(一直闪则表示硬盘硬件没有出现问题)
# 但是没有磁盘引导读取不到数据,所以跳不到启动分区
# 如果出现这种情况,一是没有装系统,二是装了系统没有引导程序

5. 解决磁盘引导问题
# 关闭虚拟机;插入可安装系统的设备(如 U 盘、光盘);从此设备启动
# 比如从光盘启动,勾选“启动时连接”

# 开启虚拟机后,选择 Troubleshooting——Rescue a Red Hat···——进入到光盘里的系统



# 然后选择“1”(继续,即更新挂载之前的 Linux 环境),然后回车,在输入"chroot /mnt/sysroot/"(从光盘系统进入到原 Linux 系统),输入"fdisk -l | less"查看分区设备(找到启动硬盘)
1
chroot /mnt/sysroot/
fdisk -l | less


# 输入"grub2-install /dev/nvme0n1"来安装引导程序(一定要注意是安装在自己的启动硬盘上),然后输入两次"exit",磁盘引导就修复成功了
grub2-install /dev/nvme0n1
exit
exit


三、主引导文件修复
1. 主引导文件位置及配置信息
[root@node1 ~]# ll /boot/grub2/grub.cfg
-rw-------. 1 root root 6939 Jan 27 19:17 /boot/grub2/grub.cfg
[root@node1 ~]# vim /boot/grub2/grub.cfg
63 if [ x$feature_timeout_style = xy ] ; then
64 set timeout_style=menu
65 set timeout=5 #启动时长
108 ### BEGIN /etc/grub.d/10_linux ###
109 insmod part_msdos
110 insmod xfs
111 set root='hd0,msdos1' #指定的硬盘和分区
### 比如硬盘分区"/dev/nvme0n1p1"中的"n1"——"hd0"(硬盘1),"p1"——"msdos1"(分区1);再比如硬盘分区"/dev/nvme0n3p4"中的"n3"——"hd2"(硬盘3),"p4"——"msdos4"(分区4)

# 查看磁盘信息,记住自己的根设备在那个硬盘分区
[root@node1 ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 4096 0 4096 0% /dev
tmpfs 1855072 0 1855072 0% /dev/shm
tmpfs 742032 9244 732788 2% /run
/dev/nvme0n1p3 99548160 2788656 96759504 3% /
/dev/nvme0n1p1 983040 326224 656816 34% /boot
/dev/sr0 12462174 12462174 0 100% /rhel9_cd
tmpfs 371012 0 371012 0% /run/user/0
### "/"对应那行的就是根设备的硬盘分区,"boot"——boot 硬盘分区
2. 主引导文件出问题
# 误删主引导文件
[root@node1 ~]# rm -rf /boot/grub2/grub.cfg
[root@node1 ~]# ls /boot/grub2/
device.map fonts grubenv i386-pc locale
### 主引导文件被误删后的两种情况,一是虚拟机未重启,二是虚拟机重启后启动不了
3.修复主引导文件
(1)虚拟机未重启
# "grub2-mkconfig"就是原来的主引导文件里的内容,所以将"grub2-mkconfig"里的内容写到"/boot/grub2/grub.cfg"中,主引导文件就修复成功了
[root@node1 ~]# grub2-mkconfig > /boot/grub2/grub.cfg
Generating grub configuration file ...
Adding boot menu entry for UEFI Firmware Settings ...
done
(2)虚拟机已重启
# 删除主引导文件后重启页面

### 现在表示系统已经找到启动分区,但是缺少主引导文件,系统不知道下一步需要加载什么文件
# 系统不能自动引导文件,所以我们就手动引导文件;回看上面(1. 主引导文件位置及配置信息)的硬盘分区
set root=(hd0,msdos1)
linux16 /vmlinuz-5.14.0-570.12.1.e19_6.x86_64 ro root=/dev/nvme0n1p3
initrd16 /initramfs-5.14.0.570.12.1.e19_6.x86_64.img
boot

# 因为进入系统是通过手动引导进入的,系统任然没有自动引导文件及主引导文件
# 若进入系统后用 reboot(重启),还会再次需要通过手动引导再能进入系统
# 所以需要将"grub2-mkconfig"里的内容写到"/boot/grub2/grub.cfg"中(和虚拟机未重启方法一致),主引导文件就修复成功了
[root@node1 ~]# grub2-mkconfig > /boot/grub2/grub.cfg
Generating grub configuration file ...
Adding boot menu entry for UEFI Firmware Settings ...
done

(3)修复网络
# 注意:虽然主引导文件修复成功了,但是因为我们的母盘设置了"net.ifnames=0"(禁用可预测的网络接口命名)参数,在手动引导加载内核命令时没有写这个参数,所以修复完后的虚拟机网卡是原来的初始网卡。
# 方法一:通过网络脚本重新配置 ip
ip a
ip link show
nmcli connection show
ip.sh eth0 192.168.153.10 node10
reboot


# 方法二:同手动引导过程中,其它操作不变,在配置加载内核时,加入"net.ifnames=0"参数,然后同样的启动虚拟机方式,网络会和主引导文件一起修复好了
set root=(hd0,msdos1)
linux16 /vmlinuz-5.14.0-570.12.1.e19_6.x86_64 ro root=/dev/nvme0n1p3 net.ifnames=0
initrd16 /initramfs-5.14.0.570.12.1.e19_6.x86_64.img
boot
ip a
grub2-mkconfig > /boot/grub2/grub.cfg

四、子引导文件修复
1. 子引导文件位置
[root@node1 ~]# ll /boot/loader/entries/
total 8
-rw-r--r--. 1 root root 484 Jan 27 19:17 9a9d16bcedd84606bed6fa15ea7cb8aa-0-rescue.conf
-rw-r--r--. 1 root root 459 Jan 27 22:56 9a9d16bcedd84606bed6fa15ea7cb8aa-5.14.0-570.12.1.el9_6.x86_64.conf
### 每台主机的子引导文件名称都不一样;有两个子引导文件是因为系统装有两个内核
### 系统默认使用的是"xxx-5.14.0-xxx.x86_64.conf"子引导文件,如果正常的子引导文件出了问题,则会使用"xxx-0-rescue.conf"子引导文件(排错子引导文件)
# 两个子引导文件中标红的两行就是虚拟机启动时的两行标题
[root@node1 ~]# cat /boot/loader/entries/9a9d16bcedd84606bed6fa15ea7cb8aa-0-rescue.conf
title Red Hat Enterprise Linux (0-rescue-9a9d16bcedd84606bed6fa15ea7cb8aa) 9.6 (Plow)
version 0-rescue-9a9d16bcedd84606bed6fa15ea7cb8aa
linux /vmlinuz-0-rescue-9a9d16bcedd84606bed6fa15ea7cb8aa
initrd /initramfs-0-rescue-9a9d16bcedd84606bed6fa15ea7cb8aa.img
options root=UUID=4baff1b0-686a-40da-8c13-a652cfc3cbee ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=a12dbb66-2097-47f8-8a29-b13342bb195b rhgb quiet
grub_users $grub_users
grub_arg --unrestricted
grub_class rhel
[root@node1 ~]# cat /boot/loader/entries/9a9d16bcedd84606bed6fa15ea7cb8aa-5.14.0-570.12.1.el9_6.x86_64.conf
title Red Hat Enterprise Linux (5.14.0-570.12.1.el9_6.x86_64) 9.6 (Plow)
version 5.14.0-570.12.1.el9_6.x86_64
linux /vmlinuz-5.14.0-570.12.1.el9_6.x86_64
initrd /initramfs-5.14.0-570.12.1.el9_6.x86_64.img $tuned_initrd
options root=UUID=4baff1b0-686a-40da-8c13-a652cfc3cbee ro crashkernel=1G-4G:192M,4G-64G:256M,64G-:512M resume=UUID=a12dbb66-2097-47f8-8a29-b13342bb195b rhgb quiet net.ifnames=0
grub_users $grub_users
grub_arg --unrestricted
grub_class rhel


2. 子引导文件出问题
(1)正常子引导文件被误删
# 如果正常子引导文件被误删,子引导文件目录里只剩下排错子引导文件,则重启后会以排错子引导文件进入系统,并且一些数据会丢失(比如 ip)
[root@node10 ~]# rm -rf /boot/loader/entries/9a9d16bcedd84606bed6fa15ea7cb8aa-5.14.0-570.12.1.el9_6.x86_64.conf
[root@node10 ~]# ls /boot/loader/entries/
9a9d16bcedd84606bed6fa15ea7cb8aa-0-rescue.conf


(2)整个子引导文件目录下的文件被误删
# 如果目录下的所有文件都被删除了,那么重启时会和主引导文件被删除一样进入到如下页面
[root@node10 ~]# rm -rf /boot/loader/entries/*
[root@node10 ~]# ls /boot/loader/entries/
[root@node10 ~]# reboot

3. 修复子引导文件
(1)与修复主引导文件一样,先手动引导进入系统
set root=(hd0,msdos1)
linux16 /vmlinuz-5.14.0-570.12.1.e19_6.x86_64 ro root=/dev/nvme0n1p3 net.ifnames=0
initrd16 /initramfs-5.14.0.570.12.1.e19_6.x86_64.img
boot
ip a


(2)修复子引导文件需要通过 kernel-install 命令来修复
[root@node10 ~]# kernel-install --help
Usage:
kernel-install [OPTIONS...] add KERNEL-VERSION KERNEL-IMAGE [INITRD-FILE...]
kernel-install [OPTIONS...] remove KERNEL-VERSION
kernel-install [OPTIONS...] inspect
Options:
-h, --help Print this help and exit
--version Print version string and exit
-v, --verbose Increase verbosity
### OPTIONS——参数,KERNEL-VERSION——内核版本,KERNEL-IMAGE——内核镜像
# 通过"uname -r"来传内核版本号,修复子引导文件
[root@node10 ~]# uname -r
5.14.0-570.12.1.el9_6.x86_64
[root@node10 ~]# kernel-install add $(uname -r) /boot/vmlinuz-5.14.0-570.12.1.el9_6.x86_64
[root@node10 ~]# ls /boot/loader/entries/
9a9d16bcedd84606bed6fa15ea7cb8aa-0-rescue.conf
9a9d16bcedd84606bed6fa15ea7cb8aa-5.14.0-570.12.1.el9_6.x86_64.conf
[root@node10 ~]# reboot

(3)修复网络
# 注意:因为我们的母盘是在子引导文件里配置有"net.ifnames=0"这个参数;这和主引导修复网络过程不一样
# 主引导文件被误删,则读不到子引导文件;但是主引导文件修复后,子引导文件还是原来的子引导文件,没有删改数据
# 而子引导文件被误删后,修复回来的子引导文件是系统初始化的子引导文件,没有我们配置的"net.ifnames=0"这个参数
# 即通过手动引导是添加的"net.ifnames=0"这个参数是临时的,重启虚拟机后,还会出现网络问题
# 方法一:通过编辑子引导文件重新添加参数"net.ifnames=0"
[root@node10 ~]# vim /boot/loader/entries/9a9d16bcedd84606bed6fa15ea7cb8aa-5.14.0-570.12.1.el9_6.x86_64.conf
1 title Red Hat Enterprise Linux (5.14.0-570.12.1.el9_6.x86_64) 9.6 (Plow)
2 version 5.14.0-570.12.1.el9_6.x86_64
3 linux /vmlinuz-5.14.0-570.12.1.el9_6.x86_64
4 initrd /initramfs-5.14.0-570.12.1.el9_6.x86_64.img $tuned_initrd
5 options root=UUID=4baff1b0-686a-40da-8c13-a652cfc3cbee ro crashkernel=1G-4G:192M,4G-64G:256M,6 4G-:512M resume=UUID=a12dbb66-2097-47f8-8a29-b13342bb195b rhgb quiet $tuned_params net.ifnames=0
6 grub_users $grub_users
7 grub_arg --unrestricted
8 grub_class rhel
[root@node10 ~]# reboot


# 方法二:直接更新内核配置(--update-kernel)添加参数
[root@node10 ~]# grubby --update-kernel ALL --args net.ifnames=0
[root@node10 ~]# reboot
五、内核文件修复
1.内核文件位置
# 内核文件存放在"/boot"目录下,“vmlinuz”的就是内核文件
[root@node10 ~]# ls /boot/
config-5.14.0-570.12.1.el9_6.x86_64
efi
grub2
initramfs-0-rescue-9a9d16bcedd84606bed6fa15ea7cb8aa.img
initramfs-5.14.0-570.12.1.el9_6.x86_64.img
initramfs-5.14.0-570.12.1.el9_6.x86_64kdump.img
loader
symvers-5.14.0-570.12.1.el9_6.x86_64.gz
System.map-5.14.0-570.12.1.el9_6.x86_64
vmlinuz-0-rescue-9a9d16bcedd84606bed6fa15ea7cb8aa
vmlinuz-5.14.0-570.12.1.el9_6.x86_64
2.内核文件出问题
# 误删内核文件
[root@node10 ~]# rm -rf /boot/vmlinuz-*
[root@node10 ~]# ls /boot/
config-5.14.0-570.12.1.el9_6.x86_64
efi
grub2
initramfs-0-rescue-9a9d16bcedd84606bed6fa15ea7cb8aa.img
initramfs-5.14.0-570.12.1.el9_6.x86_64.img
initramfs-5.14.0-570.12.1.el9_6.x86_64kdump.img
loader
symvers-5.14.0-570.12.1.el9_6.x86_64.gz
System.map-5.14.0-570.12.1.el9_6.x86_64
[root@node10 ~]# reboot

### 内核文件丢失,我们也无法进入系统进行手动引导
3. 修复内核文件
(1)进入光盘系统
# 关闭虚拟机,通过导航栏的绿色开启图形——打开电源时进入固件——Boot——选择 CD-ROM Drive 移到第一行——Exit——Exit Saving Changes——yes



(2)查找并安装内核核心安装包
# 通过光盘启动进入挽救模式(参考磁盘引导修复),选择 Troubleshooting——Rescue a Red···
# 内核文件来源于系统安装即光盘安装,所以先找到光盘所在位置
# 进入到光盘系统中,先查看磁盘分区
1
df

# 在光盘系统下,将光盘挂载到原 Linux 系统下的"/media"(自己命名)
mount --bind /run/install/repo /mnt/sysroot/media
ls /mnt/sysroot/media

# 进入原 Linux 系统,kernel(内核)安装包在"/BaseOS/Packages"目录下,找到核心安装包;然后因为原 Linux 系统原本就有 kernel 的部分文件,需要强制(--force)安装才能成功
chroot /mnt/sysroot
ls /media/
rpm -qa | grep kernel
rpm -ivh /media/BaseOS/Packages/kernel-core-5.14.0-570.12.1.e19_6.x86_64.rpm --force
ls /boot/
exit
exit

(3)调回启动顺序
# 内核文件修复完成后,因为之前我们修复时调过系统启动顺序,所以需要把启动顺序再调回来
# 关闭虚拟机,通过导航栏的绿色开启图形——打开电源时进入固件——Boot——选择 CD-ROM Drive 移到第三行——Exit——Exit Saving Changes——yes

### 注意:如果系统初始化文件丢失,修复内核文件方法同样适用于系统初始化文件修复
1万+



被折叠的 条评论
为什么被折叠?



