经过漫长的启动修复过程后,进入 systemd 紧急提示。问题:fstab 文件中缺少 FS

经过漫长的启动修复过程后,进入 systemd 紧急提示。问题:fstab 文件中缺少 FS

我意识到已经遇到启动问题的人提出了几个问题,但我认为我的情况比较特殊,因此我又发布了一个问题,希望能解决一些新问题。

我一直在修复虚拟机的启动过程,该虚拟机具有来自不再安装的内核的initramfsinitrd.imgvmlinuz中的文件),并且仍尝试从它们启动。/boot

我快完成了,但是它一直重新启动到systemdemergency mode其中显示:)

You are in emergency mode. After logging in, type "journalctl -xb" to view system logs, "systemctl reboot" to reboot, "systemctl default" or "exit" to boot into default mode.
Give root password for maintenance
(or press Control-D to continue):

我从一张实时 CD 启动,将 3 个相关分区挂载到/mnt,然后 chroot 到/mnt

mount /dev/sda3 /mnt
mount /dev/sda2 /mnt/boot
mount /dev/sda1 /mnt/boot/efi
for i in proc dev dev/pts sys tmp run; do mount --bind /$i /mnt/$i; done
chroot /mnt

完成修复并重新启动。

现在我的fstab无法挂载我的分区。我以为它配置正确 - UUID 直接从 复制blkid | grep /dev/sda。我不认为它缺少任何东西。

以下是我在进入紧急模式提示之前看到的错误:

[FAILED] Failed to mount /boot
See 'systemctl status boot.mount' for details.
[DEPEND] Dependency failed for Local File Systems
[DEPEND] Dependency failed for Unattended Upgrades Shutdown
[DEPEND] Dependency failed for /boot/efi

因此,我当然查看了systemctl status boot.mount,但它处于活动状态(绿色)并显示已加载,尽管我的/boot文件夹是空的,除非我手动安装/dev/sda2

看起来很奇怪。为什么会boot.mount说它正在加载/boot分区,如果它显然没有加载呢?

答案1

所以我实际上是在写问题的时候就弄清楚了这个问题。从我一开始写的内容可以看出,这是一个非常漫长的过程(我已经研究了大约 2 天,然后才到了想要寻求帮助的地步)。

如果你看一下 Q 的最后,你会发现我dmesg在启动过程中收到了以下消息:

[FAILED] Failed to mount /boot
See 'systemctl status boot.mount' for details.

因此,我当然尝试systemctl status boot.mount查看它说了什么,但它说boot.mount处于活动状态(绿色),它已加载并正常运行,尽管除非/boot我手动安装/dev/sda2(这与我期望的完全相反),否则它是空的。

所以我开始怀疑这项服务可能出了问题。我禁用了它,boot.mount尽管它它工作正常:

systemctl disable --now boot.mount

我尝试重新启用它,但出现错误:

systemctl enable --now boot.mount
Failed to enable unit: Unit /run/systemd/generator/boot.mount is transient or generated

好的,这说得通,它是通过启动过程触发的,无法通过用户命令调用。因此,我尝试使用以下命令重新安装所有设备:

mount -a

发现/etc/fstab文件里有一个错误:

error: rw,relatime is not a valid file system

(或类似的东西)。

关键是,如果我没有尝试手动挂载文件系统,我永远不会收到该反馈。mount -afstab包含不正确的语法时收到的错误消息非常有用。比以下信息有用得多:

[FAILED] Failed to mount /boot
See 'systemctl status boot.mount' for details.

...然后看到一个“正在工作”的 systemd 单元,boot.mount/boot没有挂载时(即使它做过最终让我到达正确的地方)。

因此我编辑了fstab并输入了无法挂载的分区的文件系统信息/boot,然后我重新运行mount -a(本质上与执行相同的操作boot.mount)并得到了肯定的答复。

现在,重新启动后,两个分区都可以正确安装,一切正常。

如果这不能解决您的任何问题,这里有一些我在寻求帮助之前经历的过程的补充说明(遇到问题后可以停止阅读):

两天前我遇到的原始问题是系统尝试从不再在系统上的内核启动。因此,在使用 Live CD 启动后,我删除了/boot文件夹的内容(所有initrd文件所在的位置)。

我原以为只需使用当前安装的内核重新创建initramfsupdate-initramfs -c -k all但后来我得知,我无法单独重新创建configSystem.map文件depmod。这比我预想的要麻烦一些。

我发现重新生成或获取所有这些文件的最简单方法是:

  1. 删除所有内容/boot
  2. 卸载我无意使用的任何文件linux-imagelinux-headerlinux-modules
  3. 删除所有残留目录/usr/lib/modules,然后
  4. 重新安装linux-imagelinux-modules以及linux-headers我打算使用的文件(最新的通用两个版本)

注意:重新安装这 3 类文件同时是我设法找回/boot/System.map/boot/config文件的方法——之前只重新安装文件linux-image是行不通的。它们可能包含在modules(模块会有意义)或headers包中,但这对我来说是有效的。

  1. 然后我update-grub重新安装这些文件并确认/boot填充正确后再运行。
  2. 我也运行了bootctl install/etc/kernel/postinst.d/zz-udpate-systemd-boot,所以我会systemd-boot安装作为后备。

在重新启动后,我不得不重新配置system.targetmulti-user.target而不是graphical.target,可能是因为几天前我chroot在图形实时 CD 中使用了所有这些安装来运行该程序,而这需要图形(我相信并且需要开始工作):boot-repair/dev/pts /tmp/rundisplay :0.0

systemctl set-default multi-user.target

好的,就是这样。希望这对某些人有帮助。

相关内容