如何避免引导分区和内核分区不同步?

如何避免引导分区和内核分区不同步?

显然,我无意中更新了内核,但没有更新引导分区,搞砸了我的 Arch Linux 系统。因此,例如:

pacman -Q linux  -> results in 4.20.arch1-1
uname -a -> results in 4.19.4-arch1-1-ARCH 

我不确定这是怎么回事。如果我查看 /boot 目录,它包含三个文件 initramfs-linux-fallback.img、initramfs-linux.img 和 vmlinuz-linux,其中前两个文件是最近更新的,最后一个文件的日期是我安装系统时的日期几周前。那么,到底什么是不同步呢?我的 vmlinuz-linux 与根分区中的内核不同步?

这样做的结果是内核由于某种原因不再找到我的网络设备。我不确定这是如何发生的,我执行的唯一相关命令是:

sudo pacman -Syu

我认为这个命令只是应该更新软件包数据库,而不是更改内核。

无论如何,我现在的问题是如何重新同步启动分区,以便它与内核匹配,或者至少进行一些操作,以便找到并加载网络设备模块,显然它不再是了。

我的系统设置为直接从主板启动(没有中间启动加载程序)。但是,当我发出这个命令时:

# efibootmgr --verbose

我得到的结果是“找不到命令”。我需要在实时启动环境中才能使用此命令吗?如何解决这个混乱并让我的系统再次同步?另外,以后怎样才能避免这种情况发生呢?我的意思是我计划添加很多软件包,如果每次添加新软件包时系统都在更新内核并弄乱我的系统,那将会出现问题。

答案1

该问题的解决方法如下:

  1. 将 EFI 分区(在我的例子中是用于 EFI 存根类型引导的 VFAT 分区)挂载到一个方便的目录:

    #挂载/dev/nvme0n1p1/efi

请注意,在我的例子中,设备的名称类似于“nvme0n1因为它是 M2 驱动器”,但如果您使用的是 SATA 驱动器,则设备名称可能类似于“sda1”。

  1. 记下启动映像文件的大小,以便您可以区分旧的和新的。

  2. 将更新的启动文件从 ext4 分区复制到 EFI 分区(这将覆盖旧的启动映像):

    # cp /boot/* /efi

  3. 通过检查文件大小来验证 /efi 目录(VFAT 分区)是否包含新文件。

  4. 将一个空文件添加到 EFI 分区,以便您可以区分该目录与常规 (ext4) 文件树中的 /boot 目录:

    # cd /efi
    # touch EFI 启动目录

  5. 在 fstab 文件中添加一行,将 VFAT 分区挂载到 /boot 目录。这将隐藏主 Arch 根目录中的 /boot 目录。这不会覆盖 ext4 驱动器上 /boot 目录的版本,但会使其无法访问。 fstab 中的典型行如下所示:

    UUID=4AF7-CA4B /boot vfat 默认 0 0

要查找驱动器的 UUID,请使用以下lsblk -f命令。

  1. 重新启动系统以查看其是否正常工作,然后检查启动目录:

    $ ls /启动

它应该显示标记文件(“EFI-boot-directory”或您选择的任何名称)。如果该目录不包含该文件,则意味着您的 EFI 分区未挂载,您需要重新检查 fstab 文件。

如果 EFI 分区自动安装到 /boot,那么每当您进行系统更新时,它都应该得到正确更新,并且您的启动映像应该与您安装的模块保持同步。

答案2

这里有太多问题需要解决,但这不适合评论,所以我将其发布在这里,直到问题被删除。

  1. /boot在升级过程中未安装,因此您正在运行的内核无法访问它所需的模块。

  2. efibootmgr 显示“未找到命令”,因为您尚未安装它。

  3. 您的升级未安装,因为您的系统中/boot没有安装(或者如果安装了,也是不正确的)。/boot/etc/fstab

相关内容