十、Linux内核启动

wangzhaoyang 发布于 12 天前 23 次阅读 网络工程中的Linux系统 无~ 2473 字


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 修改

  1. 查看所有可用内核:
   [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"

这会列出所有的内核配置,注意每个内核的路径。

  1. 设置默认内核:
    选择你需要设置为默认的内核路径,并运行以下命令:
   grubby --set-default /boot/vmlinuz-<kernel_version>
  1. 修改完成后验证:
   grubby --default-kernel

方法 2:手动修改 GRUB 配置

如果你想更改 GRUB 的默认标题,可以编辑 /etc/default/grub 文件:

  1. 打开文件:
   vi /boot/loader/entries/959e1a855c36404eb3ed2bdddf13eeea-4.18.0-348.7.1.el8_5.x86_64.conf
  1. 找到 title 参数,设置为你需要的内核对应的菜单项序号或具体的菜单名。例如:
   title Hello Word
  1. 保存文件.

如果只是想更改默认启动的内核,建议直接使用 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 模式。

步骤:

  1. 重启系统,并在出现 GRUB 菜单时按 e 键进入编辑模式。
  2. 在出现的 GRUB 菜单中,将 linux 行结尾的 ro 改为 rw init=/sysroot/bin/sh
  3. Ctrl+X 启动进入 Rescue 模式。
  4. 进入 Rescue 模式后,你将直接进入命令行环境。使用以下命令切换到实际的根文件系统: chroot /sysroot
  5. 现在你可以修复内核,例如重新安装内核包或恢复其他系统文件。

2. 使用 yumdnf 重新安装内核

如果你可以进入系统或者 Rescue 模式,你可以使用 yumdnf 重新安装内核。

步骤:

  1. 首先,列出所有可用的内核版本: [root@linuxcool ~]# yum list kernel
  2. 安装(或重新安装)指定版本的内核: [root@linuxcool ~]# sudo dnf reinstall kernel 或者 [root@linuxcool ~]# sudo dnf install kernel-<version> 替换 <version> 为你想安装的内核版本号。
  3. 重新生成 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

3. 手动修复 GRUB 配置

如果问题是由于 GRUB 配置错误导致的,可能需要手动修复 GRUB 配置。

步骤:

  1. 进入 Rescue 模式并挂载文件系统: chroot /sysroot
  2. 重新安装 GRUB(适用于 BIOS 系统): grub2-install /dev/sda 对于 UEFI 系统,重新安装引导加载器: dnf reinstall grub2-efi grub2-efi-modules shim
  3. 重新生成 GRUB 配置文件: grub2-mkconfig -o /boot/grub2/grub.cfg
  4. 重启系统: sudo reboot

4. 使用 Live CD 或 USB 恢复系统

如果系统无法通过上述方法恢复,你可以使用 CentOS 8 的 Live CD 或 USB 引导系统,然后尝试修复。

步骤:

  1. 使用 CentOS 8 Live CD 或 USB 启动系统。
  2. 进入系统后,打开终端。
  3. 挂载系统分区: sudo mount /dev/sdXn /mnt/dev/sdXn 替换为你的系统分区。
  4. 进入系统的根目录: sudo chroot /mnt
  5. 重新安装内核或修复 GRUB。
  6. 退出 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 从磁盘加载:
    1. Linux 内核:如 vmlinuz-x.x.x
    2. initramfs/initrd:临时根文件系统。
  • 将内核和 initramfs 解压到内存,并将控制权交给内核。

6. 内核初始化

  • 硬件驱动加载:内核初始化硬件设备,并加载必要的驱动程序(如文件系统驱动)。
  • 启动 initramfs:临时文件系统包含启动阶段所需的工具和脚本。
    • initramfs 挂载到 /sysroot 作为假根文件系统。
  • 挂载真正的根文件系统:内核找到实际的根分区,将其挂载到 /sysroot

7. 切换到真正的根文件系统

  • 内核完成初始化后,将文件系统从 initramfs 的假根切换到真正的根。
  • 执行根文件系统中的 init 程序(现代系统中通常是 systemd)。

8. systemd 初始化

  • 初始化目标
    1. 根据目标(如 multi-user.targetgraphical.target)启动相应的服务。
    2. 并行化启动系统服务和设备。
  • 挂载文件系统、启动网络服务、日志服务等。

9. 启动完成

  • systemd 启动终端登录管理器(字符界面)或图形登录管理器(如 GDM、LightDM)。
  • 用户登录后进入用户环境(Shell 或桌面)。

关键知识点补充

  1. 文件系统驱动与根文件系统
    • 根文件系统的驱动程序(如 xfsext4)需要内核加载。
    • 这些驱动一般包含在 initramfs 中,以确保内核能够挂载根文件系统。
  2. initramfs 的作用
    • 提供一个临时文件系统,允许内核在挂载真正的根分区之前执行初始化。
    • 通常包括必要的工具和驱动模块。
  3. GRUB 的配置文件
    • 位于 /boot/grub2/grub.cfg/boot/efi/EFI/<distro>/grub.cfg