显然,我无意中更新了内核,但没有更新引导分区,搞砸了我的 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
该问题的解决方法如下:
将 EFI 分区(在我的例子中是用于 EFI 存根类型引导的 VFAT 分区)挂载到一个方便的目录:
#挂载/dev/nvme0n1p1/efi
请注意,在我的例子中,设备的名称类似于“nvme0n1
因为它是 M2 驱动器”,但如果您使用的是 SATA 驱动器,则设备名称可能类似于“sda1”。
记下启动映像文件的大小,以便您可以区分旧的和新的。
将更新的启动文件从 ext4 分区复制到 EFI 分区(这将覆盖旧的启动映像):
# cp /boot/* /efi
通过检查文件大小来验证 /efi 目录(VFAT 分区)是否包含新文件。
将一个空文件添加到 EFI 分区,以便您可以区分该目录与常规 (ext4) 文件树中的 /boot 目录:
# cd /efi
# touch EFI 启动目录在 fstab 文件中添加一行,将 VFAT 分区挂载到 /boot 目录。这将隐藏主 Arch 根目录中的 /boot 目录。这不会覆盖 ext4 驱动器上 /boot 目录的版本,但会使其无法访问。 fstab 中的典型行如下所示:
UUID=4AF7-CA4B /boot vfat 默认 0 0
要查找驱动器的 UUID,请使用以下lsblk -f
命令。
重新启动系统以查看其是否正常工作,然后检查启动目录:
$ ls /启动
它应该显示标记文件(“EFI-boot-directory”或您选择的任何名称)。如果该目录不包含该文件,则意味着您的 EFI 分区未挂载,您需要重新检查 fstab 文件。
如果 EFI 分区自动安装到 /boot,那么每当您进行系统更新时,它都应该得到正确更新,并且您的启动映像应该与您安装的模块保持同步。
答案2
这里有太多问题需要解决,但这不适合评论,所以我将其发布在这里,直到问题被删除。
您
/boot
在升级过程中未安装,因此您正在运行的内核无法访问它所需的模块。efibootmgr 显示“未找到命令”,因为您尚未安装它。
您的升级未安装,因为您的系统中
/boot
没有安装(或者如果安装了,也是不正确的)。/boot
/etc/fstab