1. 查询当前可用内核
要查看系统中已安装的所有内核版本,可以使用以下命令:
[root@linuxcool ~]# grub2-editenv list
或
[root@linuxcool ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
或
[root@localhost ~]# grubby --info=ALL
index=0
kernel="/boot/vmlinuz-4.18.0-348.7.1.el8_5.x86_64"
args="ro resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-348.7.1.el8_5.x86_64.img $tuned_initrd"
title="CentOS Linux (4.18.0-348.7.1.el8_5.x86_64) 8"
id="959e1a855c36404eb3ed2bdddf13eeea-4.18.0-348.7.1.el8_5.x86_64"
index=1
kernel="/boot/vmlinuz-4.18.0-348.el8.x86_64"
args="ro resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-348.el8.x86_64.img $tuned_initrd"
title="CentOS Stream (4.18.0-348.el8.x86_64) 8"
id="959e1a855c36404eb3ed2bdddf13eeea-4.18.0-348.el8.x86_64"
index=2
kernel="/boot/vmlinuz-0-rescue-959e1a855c36404eb3ed2bdddf13eeea"
args="ro resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-0-rescue-959e1a855c36404eb3ed2bdddf13eeea.img"
title="CentOS Stream (0-rescue-959e1a855c36404eb3ed2bdddf13eeea) 8"
id="959e1a855c36404eb3ed2bdddf13eeea-0-rescue"
2. 设置默认启动内核
要设置默认启动的内核,你需要找到你想要设置的内核对应的索引号,然后使用以下命令进行设置:
[root@linuxcool ~]# sudo grub2-set-default <index>
或者
[root@linuxcool ~]# grubby --set-default-index 1
其中,<index>
是你想要设置为默认的内核的索引号。
例如,如果你想要设置第二个内核作为默认启动内核,你可以使用:
[root@linuxcool ~]# sudo grub2-set-default 1
或绑定内核路径直接指定
[root@linuxcool ~]# grubby --set-default=/bootvmlinuz-4.18.0-348.7.1.el8_5.x86_64
3. 重新生成 GRUB 配置文件
在设置完默认内核后,需要重新生成 GRUB 配置文件:
对于 BIOS 系统:
[root@linuxcool ~]# sudo grub2-mkconfig -o /boot/grub2/grub.cfg
对于 UEFI 系统:
[root@linuxcool ~]# sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
4. 重启系统
最后,重启系统以使用新设置的内核:
[root@linuxcool ~]# sudo reboot
系统重启后将使用你设置的默认内核启动。
在 grubby
命令中,--default-title
参数是不接受值的,这就是报错的原因。如果想要更改 GRUB 的默认标题,需要采用正确的方法。
修改 GRUB 默认标题的方法:
方法 1:直接用 grubby
修改
- 查看所有可用内核:
[root@linuxcool ~]# grubby --info=ALL
index=0
kernel="/boot/vmlinuz-4.18.0-348.7.1.el8_5.x86_64"
args="ro resume=/dev/mapper/cl-swap rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet $tuned_params"
root="/dev/mapper/cl-root"
initrd="/boot/initramfs-4.18.0-348.7.1.el8_5.x86_64.img $tuned_initrd"
title="CentOS Linux (4.18.0-348.7.1.el8_5.x86_64) 8"
id="959e1a855c36404eb3ed2bdddf13eeea-4.18.0-348.7.1.el8_5.x86_64"
这会列出所有的内核配置,注意每个内核的路径。
- 设置默认内核:
选择你需要设置为默认的内核路径,并运行以下命令:
grubby --set-default /boot/vmlinuz-<kernel_version>
- 修改完成后验证:
grubby --default-kernel
方法 2:手动修改 GRUB 配置
如果你想更改 GRUB 的默认标题,可以编辑 /etc/default/grub
文件:
- 打开文件:
vi /boot/loader/entries/959e1a855c36404eb3ed2bdddf13eeea-4.18.0-348.7.1.el8_5.x86_64.conf
- 找到
title
参数,设置为你需要的内核对应的菜单项序号或具体的菜单名。例如:
title Hello Word
- 保存文件.
如果只是想更改默认启动的内核,建议直接使用 grubby --set-default
命令,这样更加简单和直观。
grubby
1. 查询当前默认启动的内核
要查看当前系统使用的默认启动内核,可以使用以下命令:
[root@linuxcool ~]# grubby --default-kernel
2. 列出所有可用内核
要查看系统中所有已安装的内核版本,可以使用以下命令:
[root@linuxcool ~]# grubby --info=ALL
3. 设置默认启动内核
要设置系统默认启动的内核版本,首先你需要知道内核的路径。假设你已经列出了所有可用内核(通过 grubby --info=ALL
),并且选择了某个内核,例如 /boot/vmlinuz-4.18.0-305.el8.x86_64
。
使用以下命令设置默认启动内核:
[root@linuxcool ~]# sudo grubby --set-default-index 1
或者
[root@linuxcool ~]# sudo grubby --set-default=/boot/vmlinuz-4.18.0-305.el8.x86_64
4. 验证设置
你可以再次运行 grubby --default-kernel
来确认是否正确设置了默认启动内核。
5. 重启系统
完成设置后,重启系统以应用新设置:
[root@linuxcool ~]# sudo reboot
使用 grubby
可以更轻松地管理内核版本,无需手动编辑 GRUB 配置文件,非常方便。
内核修复
1. 使用 Rescue 模式启动系统
如果系统无法正常启动,可以尝试进入 Rescue 模式。
步骤:
- 重启系统,并在出现 GRUB 菜单时按
e
键进入编辑模式。 - 在出现的 GRUB 菜单中,将
linux
行结尾的ro
改为rw init=/sysroot/bin/sh
。 - 按
Ctrl+X
启动进入 Rescue 模式。 - 进入 Rescue 模式后,你将直接进入命令行环境。使用以下命令切换到实际的根文件系统:
chroot /sysroot
- 现在你可以修复内核,例如重新安装内核包或恢复其他系统文件。
2. 使用 yum
或 dnf
重新安装内核
如果你可以进入系统或者 Rescue 模式,你可以使用 yum
或 dnf
重新安装内核。
步骤:
- 首先,列出所有可用的内核版本:
[root@linuxcool ~]# yum list kernel
- 安装(或重新安装)指定版本的内核:
[root@linuxcool ~]# sudo dnf reinstall kernel
或者[root@linuxcool ~]# sudo dnf install kernel-<version>
替换<version>
为你想安装的内核版本号。 - 重新生成 GRUB 配置文件: 对于 BIOS 系统:
[root@linuxcool ~]# sudo grub2-mkconfig -o /boot/grub2/grub.cfg
对于 UEFI 系统:[root@linuxcool ~]# sudo grub2-mkconfig -o /boot/efi/EFI/centos/grub.cfg
- 重启系统:
[root@linuxcool ~]# sudo reboot
3. 手动修复 GRUB 配置
如果问题是由于 GRUB 配置错误导致的,可能需要手动修复 GRUB 配置。
步骤:
- 进入 Rescue 模式并挂载文件系统:
chroot /sysroot
- 重新安装 GRUB(适用于 BIOS 系统):
grub2-install /dev/sda
对于 UEFI 系统,重新安装引导加载器:dnf reinstall grub2-efi grub2-efi-modules shim
- 重新生成 GRUB 配置文件:
grub2-mkconfig -o /boot/grub2/grub.cfg
- 重启系统:
sudo reboot
4. 使用 Live CD 或 USB 恢复系统
如果系统无法通过上述方法恢复,你可以使用 CentOS 8 的 Live CD 或 USB 引导系统,然后尝试修复。
步骤:
- 使用 CentOS 8 Live CD 或 USB 启动系统。
- 进入系统后,打开终端。
- 挂载系统分区:
sudo mount /dev/sdXn /mnt
将/dev/sdXn
替换为你的系统分区。 - 进入系统的根目录:
sudo chroot /mnt
- 重新安装内核或修复 GRUB。
- 退出
chroot
并重启系统。exit sudo reboot
这些步骤通常可以帮助你修复 CentOS 8 系统中的内核问题。如果问题依旧,可能需要进一步分析日志或尝试更多的修复方法。
详细的 Linux 启动流程
1. 上电
- 开机时电源供应稳定,主板启动时钟信号,CPU 开始执行代码。
2. BIOS/UEFI
- POST 自检:检查硬件设备(如内存、CPU、硬盘等)是否正常工作。
- 启动设备选择:根据 BIOS 设置的启动顺序,选择引导设备(如硬盘、U 盘或光驱)。
- 加载引导程序:从指定的设备读取引导程序(MBR 或 EFI 分区)。
3. 从硬盘加载引导代码(引导程序)
- 如果是传统 BIOS:
- 读取硬盘主引导记录(MBR,512 字节),加载并执行 GRUB。
- 如果是 UEFI:
- 从 EFI 系统分区加载 GRUB2 或其他引导程序。
4. 引导程序加载
- GRUB2 引导程序读取引导分区的配置文件
grub.cfg
。 - 提供启动菜单,支持多启动选项(如单用户模式、不同内核版本)。
5. GRUB2 加载内核和 initramfs
- GRUB2 从磁盘加载:
- Linux 内核:如
vmlinuz-x.x.x
。 - initramfs/initrd:临时根文件系统。
- Linux 内核:如
- 将内核和 initramfs 解压到内存,并将控制权交给内核。
6. 内核初始化
- 硬件驱动加载:内核初始化硬件设备,并加载必要的驱动程序(如文件系统驱动)。
- 启动 initramfs:临时文件系统包含启动阶段所需的工具和脚本。
- initramfs 挂载到
/sysroot
作为假根文件系统。
- initramfs 挂载到
- 挂载真正的根文件系统:内核找到实际的根分区,将其挂载到
/sysroot
。
7. 切换到真正的根文件系统
- 内核完成初始化后,将文件系统从 initramfs 的假根切换到真正的根。
- 执行根文件系统中的
init
程序(现代系统中通常是systemd
)。
8. systemd 初始化
- 初始化目标:
- 根据目标(如
multi-user.target
或graphical.target
)启动相应的服务。 - 并行化启动系统服务和设备。
- 根据目标(如
- 挂载文件系统、启动网络服务、日志服务等。
9. 启动完成
- systemd 启动终端登录管理器(字符界面)或图形登录管理器(如 GDM、LightDM)。
- 用户登录后进入用户环境(Shell 或桌面)。
关键知识点补充
- 文件系统驱动与根文件系统
- 根文件系统的驱动程序(如
xfs
、ext4
)需要内核加载。 - 这些驱动一般包含在
initramfs
中,以确保内核能够挂载根文件系统。
- 根文件系统的驱动程序(如
- initramfs 的作用
- 提供一个临时文件系统,允许内核在挂载真正的根分区之前执行初始化。
- 通常包括必要的工具和驱动模块。
- GRUB 的配置文件
- 位于
/boot/grub2/grub.cfg
或/boot/efi/EFI/<distro>/grub.cfg
。
- 位于
Comments NOTHING