我有一个安装了 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 $prefix
error: 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
。