背景
我有一个新系统,我花了很多时间配置软件来执行各种服务,然后发现驱动器可能存在问题。所以我决定更换磁盘,保留新磁盘的内容。
系统磁盘也存在无法正确启动的问题kernel
,我似乎无法修复(我按照所有grub
说明操作,但默认情况下无法正确启动,除非您手动选择正确的启动)。所以,我认为最好的方法是简单地在新磁盘上kernel
进行全新安装,这样就可以解决启动问题。Fedora Server
发生了什么
新磁盘大得多,因此我在安装过程中对其进行了稍微不同的分区。然后,我移除了驱动器,并将新旧系统磁盘都放入我附近的另一台服务器中。出于谨慎考虑,我保留了fstab
新系统磁盘中的,因为我知道它有分区UUIDs
。
移动文件的方法有很多,我决定在新系统磁盘上创建一个干净的根分区。我想dd
也许可以这样做,但我习惯于在分区大小相同的情况下使用它,而且有点不确定,所以我只是用 重新格式化了根分区(“/”)gparted
。然后我使用普通操作系统工具移动文件。然后我从新安装中剪切并粘贴内容,UUID
并将其插入到我正在修复的服务器上非常非库存的文件中fstab
。
一切顺利。
然后我尝试启动系统。它发布,然后进入grub
引导加载程序,它自动选择正确的内核,然后它就开始运行了!...直到它没有运行!
它显示“显示 Plymouth 启动屏幕”或类似内容,然后暂停,然后发出大量超时警告,警告来自某个自称的程序dracut
。从这里,我用手机截取了一张屏幕截图。它显示:
Warning: Could not boot.
Starting Dracut Emergency Shell...
Warning: /dev/disk/by-uuid/<a uuid> does not exist
Generating "/run/initramfs/rdsosreport.txt"
然后建议使用journalctl
并可能保存rdsosreport.txt
以用于错误报告。
确认!该怎么办?我到处寻找这个Warning [...] does not exist
和dracut emergency shell
上面提到的内容。什么也没有!
答案1
更新 fstab
需要/etc/fstab
使用分区的正确 UUID 来更新文件
更新 crypttab
如果你之前的分区被加密,你需要从中删除条目/etc/crypttab
如果你的新分区已加密,则需要在/etc/crypttab
重新生成 initramfs
更新/etc/fstab
和/etc/crypttab
文件后,您需要使用 dracut 更新 initramfs 映像。
您可以通过运行 dracut 紧急 shell 来更新 dracut 映像
# dracut --hostonly --regenerate-all --force
参考
答案2
信息:
Warning: /dev/disk/by-uuid/<uuid> does not exist
是一个重要线索。
事实证明,根分区UUID
存储在grub2
现代 Fedora Server 分区的两个位置/boot
。但在这种情况下,实际上存在三个UUID
问题。
根分区(“/”)的重新格式化实际上改变了UUID
。因此,UUID
必须先发现新内容,然后将其放入正确的位置。有很多方法可以找到新内容UUIDs
,但有一个命令行工具可以做到这一点blkid
- 如下例所示:
# blkid
/dev/sda1: UUID="64bbac09-1a12-4bea-8873-212ffb56f2a8" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="8a09913a-fdb2-42a0-98e3-6b89e16374d2"
请注意,对于每个分区,UUIDs
此工具会显示两个分区;您需要其中的第一个。还请注意,非特权用户无法运行blkid
。
以下是根分区UUID
需要放在的三个位置:
- 在
/etc/fstab
描述根分区挂载的行中; - 在
/boot/grub2.cfg
设置内核选项的行上。找到它的快速方法是查找前者(UUID
如果您还有的话)。或者查找"set kernelopts="root=UUID="
、 和; - 在
/boot/grub2/grubenv
与文件中引用的行类似的行中/boot/grub2.cfg
查找:kernelopts=root=UUID=
请记住只更改一个新的 UUID,其他内容保持不变。也许在编辑之前备份文件,以防万一!