可启动但 SSD 有点损坏 -> 克隆的 SSD 不可启动

可启动但 SSD 有点损坏 -> 克隆的 SSD 不可启动

我有一个安装了 Ubuntu 的 120GB SSD,它似乎正在慢慢出现故障。每隔一段时间,根文件系统就会以只读方式挂载,我需要在某种恢复控制台中运行 fsck。因此,我使用 CloneZilla 2.7.2-39 将整个 SSD 克隆到更大的 SSD(500GB)。我使用了默认的“专家”选项,但我取消选中-r(“调整文件系统大小以适合目标系统的分区大小”),并选中-rescue(“当磁盘块读取错误时继续读取下一个”),因为有些块无法读取。

克隆一开始总是能顺利进行,不会出错,在某个时刻,克隆过程结束前无法读取其他块。每次重启时停止工作的点似乎都不同,但它总是在第二个分区的中间某个地方。

克隆后,我在 Windows 上检查了克隆的 SSD:

  • 磁盘管理:
    检测驱动器并报告预期的分区(512MB EFI 分区、~120GB 分区,其余为未分区空间)。当然,它无法对分区执行任何操作,因为它不理解 ext4,但这是意料之中的。
  • wmic:wmic:root\cli>partition
区块大小 可启动 描述 设备ID 磁盘索引 指数 区块数量 主分区 尺寸 起始偏移量 类型
512 真的 GPT:系统 磁盘 #2,分区 #0 2 0 1048576 真的 536870912 1048576 GPT:系统
512 错误的 GPT:不知道 磁盘 #2,分区 #1 2 1 233402368 错误的 119502012416 537919488 GPT:未知

基本上确认了磁盘管理所显示的内容,但它还列出了确切的大小,而且它们似乎很有意义。

...并使用 CloneZilla shell:

  • lsblk

NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 465.8G 0 disk ├─sda1 8:1 0 512M 0 part └─sda2 8:2 0 111.3G 0 part

到目前为止似乎是合法的。

克隆的 SSD 不可启动。它未被识别为可启动介质。(参见更新 1)

  • fsck /dev/sda1没有显示错误。
  • fsck /dev/sda2显示大量错误(正如预期的那样,因为很多块无法读取)。我尝试保留错误并修复它们(这似乎有效,因为第二次运行没有显示任何错误)。
  • fsck /dev/sda显示“ext2fs_open2:超级块中的错误魔数[etc...]”,没有选项可以修复它,并且建议的 e2fsck 命令也无法修复它。

我的问题:
为什么原始 SSD 可以正常启动,而克隆的却不行?如果启动时可以读取数据,为什么克隆时不能读取数据?
我怎样才能克隆 SSD 以使克隆也可以启动?(如果损坏的文件最终保持损坏状态或被 fsck 等删除,那就没问题。)

在你问“为什么?”之前:它是 Ubuntu 20.04 18.04.1 LTS,已经完成了大量配置。当时我没有写下配置的具体步骤,因为让一切正常工作是一个非常混乱的过程。与其设置一个全新的操作系统(我试过,简而言之“什么都行不通”),我宁愿保留这个略有损坏但可以正常工作的操作系统的备份。

更新 1:

克隆的 SSD 上的 EFI 分区与原始 SSD 上的 UUID 相同。以下是克隆的 SSD 的一些数据的屏幕截图: 在此处输入图片描述

克隆的 SSD 实际上被识别为启动选项。但是当我从它启动时,我最终进入 grub shell。

更新 2:

在 grub shell 中原装固态硬盘:
ls: (hd0) (hd0,gpt2) (hd0,gpt1)
echo $prefix: (hd0,gpt2)/boot/grub
ls $prefix: gfxblacklist.txt unicode.pf2 x86_64-efi/ locale/ fonts/ grubenv grub.cfg
configfile $prefix/grub.cfg: 屏幕变黑,据我所知,至少 2 分钟内没有发生任何其他事情。按 Ctrl+C 或 Esc 没有任何效果。我切断电源,不想再等了。
set:
在此处输入图片描述

从 CloneZilla,我可以挂载第一个分区(到“/foo”)并访问文件。我找到了 grub.cfg,但路径似乎不同:“/foo/EFI/ubuntu/grub.cfg”
内容:
search.fs_uuid 64702138-591a-4535-8e60-2e2348477870 root hd2,gpt2 set prefix=($root)'/boot/grub' configfile $prefix/grub.cfg
不确定这是否有帮助。顺便说一下,引用的 UUID 不是第二个分区的 UUID!那应该是 bf07a56c-4d8d-9952-2bd16756d2b7。

在 grub shell 中克隆::::::
ls(hd0) (hd0,gpt2) (hd0,gpt1)
echo $prefix(hd0,gpt2)/boot/grub
ls $prefixerror: directory is encrypted.
set
在此处输入图片描述
顶部还有几行内容无法在屏幕上显示。但我找不到向上滚动的方法。“Page Up”和“Page Down”不起作用。

答案1

UEFI 启动依赖于将 EFI 可执行文件注册为启动项到其非易失性内存中,以确定要启动的内容(除非文件放在“后备”路径下,这不是 的默认情况grub-install)。注册/启动项又依赖于分割(不是文件系统)UUID 来确定应该查看哪个分区/文件系统来找到具有指定路径的可执行文件。

假设 CloneZila 足够“智能”(或者它只是无意中这样做了,因为它执行的是分区克隆而不是磁盘克隆)更改分区表中的分区 UUID 以避免 UUID 冲突,则 UEFI 将无法再找到注册到它的 EFI 可执行文件(即引导加载程序;可能是 grub;或者 shim)。

因此,要么搜索如何通过使用 将启动项重新注册到 UEFI 来更新启动项efibootmgr,要么再次执行grub-install适当的操作(这可能很棘手,因为存在相当多的变量),或者也许是最简单的方法,移除源驱动器(并避免将其再次与克隆插入在一起),使用 检查启动项中的分区 UUID efibootmgr -v,然后使用例如 更改克隆分区表中的分区 UUID gdisk

相关内容