我意识到已经遇到启动问题的人提出了几个问题,但我认为我的情况比较特殊,因此我又发布了一个问题,希望能解决一些新问题。
我一直在修复虚拟机的启动过程,该虚拟机具有来自不再安装的内核的initramfs
(initrd.img
和vmlinuz
中的文件),并且仍尝试从它们启动。/boot
我快完成了,但是它一直重新启动到systemd
(emergency 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 -a
当fstab
包含不正确的语法时收到的错误消息非常有用。比以下信息有用得多:
[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
文件所在的位置)。
我原以为只需使用当前安装的内核重新创建initramfs
,update-initramfs -c -k all
但后来我得知,我无法单独重新创建config
或System.map
文件depmod
。这比我预想的要麻烦一些。
我发现重新生成或获取所有这些文件的最简单方法是:
- 删除所有内容
/boot
, - 卸载我无意使用的任何文件
linux-image
,linux-header
linux-modules
- 删除所有残留目录
/usr/lib/modules
,然后 - 重新安装
linux-image
,linux-modules
以及linux-headers
我打算使用的文件(最新的通用两个版本)
注意:重新安装这 3 类文件同时是我设法找回/boot/System.map
和/boot/config
文件的方法——之前只重新安装文件linux-image
是行不通的。它们可能包含在modules
(模块会有意义)或headers
包中,但这对我来说是有效的。
- 然后我
update-grub
重新安装这些文件并确认/boot
填充正确后再运行。 - 我也运行了
bootctl install
和/etc/kernel/postinst.d/zz-udpate-systemd-boot
,所以我会systemd-boot
安装作为后备。
在重新启动后,我不得不重新配置system.target
为multi-user.target
而不是graphical.target
,可能是因为几天前我chroot
在图形实时 CD 中使用了所有这些安装来运行该程序,而这需要图形(我相信并且需要开始工作):boot-repair
/dev/pts
/tmp
/run
display :0.0
systemctl set-default multi-user.target
好的,就是这样。希望这对某些人有帮助。