假设有一个硬盘驱动器/dev/sda
,并且两者都有:
/dev/sda1
是一个占用整个磁盘的 ext4分区,而且它几乎没有数据。dumpe2fs -b /dev/sda1
输出坏块列表,在这种情况下输出单个高数字b表示靠近末尾的坏块/dev/sda
;b幸运的是不是任何文件的一部分。
现在需要在 的开头添加一个交换分区/dev/sda1
,并且gparted
( v0.30.0-3ubuntu1 ) 用于:
- 调整(缩小)sda1的大小,使其在几 GB 之后开始,但在同一位置结束。
- 在缩小sda1留下的间隙中添加一个交换分区。
所以gparted
完成了工作,我们dumpe2fs -b /dev/sda1
再次运行。怎么了?可以...?
- 什么都不输出,意味着调整大小忘记了坏块。
- 输出b不变。
- 输出b + o其中o是对应于刚刚
/dev/sda1
开始收缩的位置的偏移量。
注意: 为简化问题,假设有问题的硬盘没有SMART固件。(关于固件的评论是题外话。)
GParted 不考虑任何 ext2/3/4 坏块列表;我通过创建一个带有强制坏块的 ext4 文件系统来检查这一点,然后使用 GParted 移动它。在移动的分区上运行
dumpe2fs -b
会显示相同偏移处的坏块。结果为 2,因此文件系统忽略的坏块不再对应于介质上的真正坏块。这意味着文件系统会忽略它可以安全使用的块,并且可能会使用它应该避免的坏块。
在某种程度上,这确实是有道理的。当 GParted(或任何其他工具)移动分区时,它不使用特定于文件系统的工具,而是移动容器。这通常是有效的,因为文件系统数据是相对于它的容器的;通常文件系统数据结构不需要因为移动而更新。然而,坏块列表描述了不随其容器移动的特性......让 GParted 处理这将非常复杂:它不仅必须更新坏块列表本身,还必须将数据移开这样坏块在移动文件系统中的新位置就不会被使用。
坏块不会被删除,因为我看到磁盘的克隆在写入新磁盘时会读取坏块。坏块本身被标记。
fsck
然后必须通过修复工具(例如,ntfsfix
或其他工具)重新检查这些坏块并将其标记为干净。然而,那些是幻影坏块,而不是真正的坏块。然而,这证明了它们必须被固定才能被移除的想法。调整大小不应清除标记,该分区的完整格式应为它们创建新的位置标记。至于手术后它会指向哪里我不记得了。然而,正如 agc 所说,这可以进行测试。