正如标题所述,Gparted 在将 NTFS 分区向左移动并增加其大小以填充其右侧的磁盘空间时冻结了。
它执行的最后一项操作是移动块大小为 16Mb 的扇区。
有什么方法可以让它恢复移动或手动完成其余操作?有关我的意思的示例,请参阅此帖子:http://gparted-forum.surf4.info/viewtopic.php?pid=25907#p25907
编辑:我现在发现了以下信息:
- 复制操作中断的确切扇区号为 2,529,216,511。
- 根据磁盘的 MBR,该分区的第一个扇区距离磁盘起始位置 202,390 MiB,长度为 1,705,337 MiB - 这正是我应该得到的。
- NTFS 分区中的扩展 BPB 声称分区大小为 1,293,319 MiB。这是错误的,应该在复制完成时进行更新。
答案1
好的,我终于解决了这个问题!
如果 GParted 执行相同的“直接复制”,此解决方案也适用于其他文件系统。显然,您需要使用除chkdsk
末尾之外的其他方法。
无论如何,为了帮助那些和我一样不幸/愚蠢的人,下面是解决问题的程序:
在你开始之前,放松- 去给自己倒点咖啡或者一杯热巧克力吧!
您的数据仍在磁盘上,您只需查找它即可。花时间冷静地检查不会对您造成伤害。匆忙和冲动可能会造成伤害。
仔细阅读并确保您理解每个步骤。如果您决定遵循这些说明,最好使用 在单独的磁盘上进行备份
dd
。很容易犯错误,备份可以为您提供安全保障。确保记下 GParted 执行的最后一项操作的所有信息。您将需要知道复制操作进行到了什么程度(尽可能精确)以及它向前/向后复制了多少内容。
找出复制完成的确切位置。我编写了两个 Python 脚本来帮助解决这个问题,但它们只在 ubuntu 上进行了测试(在 Windows 上肯定行不通),需要针对您的具体情况进行修改。
首先使用它在磁盘上找到一个匹配的扇区:查找重复扇区.py
然后使用它来找到最后匹配的扇区(即操作被中断的地方):查找复制中断位置.py
阅读代码并确保你理解它。我对其进行了简要测试,但可能存在错误。给出的所有数字都是从分区/文件开头的绝对偏移量,即偏移量 0 是分区中的第一个扇区,偏移量 n 是第 n+1 个扇区。
使用
dd
或类似的东西来完成复制操作,注意不要混淆输入和输出偏移量。以下是 的语法dd
:sudo dd bs=512 skip=<input_offset> if=<partition> seek=<output_offset> of=<partition> count=<num_sectors_to_copy>
此步骤将需要长的时间(我花了 8 个小时)。如果你想查看它的进度,请在单独的终端中运行它,它
dd
会在自己的终端窗口中为你提供进度更新:sudo kill -s USR1 <PID_of_dd>
检查以下内容并根据需要更正:
主引导记录 (MBR) 的分区表条目应该与您告诉 GParted 执行的操作相匹配(请参阅维基百科文章,它非常有用)。具体检查分区第一个扇区的 LBA 值及其扇区总数。
您正在修改的分区的分区引导记录应与 MBR 匹配(在我的情况下不匹配)。对于 NTFS,扇区中的总分区大小应位于距分区开头偏移 40 的位置。我不认为 NTFS 记录了分区相对于磁盘开头的偏移量。
跑步
chkdsk
处于只读模式,即除了驱动器名称之外没有其他命令行参数来检查它是否可以找到分区中的所有文件。如果无法验证文件索引,则不要继续如果它抱怨 $Bitmap 文件包含错误,请不要担心。如果,且仅当步骤 5 成功后,运行
chkdsk /f
以修复例如 $Bitmap 文件。如果在文件索引仍然错误的情况下运行此操作,则最终可能会删除它们,这会使事情变得更加困难。您可能需要
chkdsk
再次以只读模式运行以确保它正常工作,只是为了安心。
*其实我太自大了——我们并不傻。但说真的——进行备份!
答案2
在 GParted 论坛用户报告了同样的 GParted 调整大小/移动失败问题后,我写了这篇文章find-overlap.py
。它读取分区,报告重叠区域以及如何将两部分重新组合在一起。
它的工作原理是计算每个块的 MD5 哈希值并查找具有重复副本的块以确定重叠的大小和位置。运行时间与读取命名设备的时间一样长。
# find-overlap.py --dump-hashes /tmp/hashes.txt -- /dev/sdb1
Block size: 1048576 bytes
Overlap of size 4096 blocks found.
Range [4321:8417) overlaps [8417:12513).
Original file system size was 16384 blocks.
Restore original file system with:
dd if=INPUT bs=1048576 count=6369 of=OUTPUT
dd if=INPUT bs=1048576 skip=10465 seek=6369 of=OUTPUT