真正重新映射磁盘上的坏块

kma*_*and 6 linux badblocks sata smartctl

我有一个 SATA 驱动器,程序总共识别出 8 个坏块badblocks。据说驱动器固件应该能够重新映射它们并替换备件。我已badblocks-n模式下运行以重写有问题的分区,并多次运行 e2fsck。没有任何变化,始终是相同的 8 个坏块。

当我运行时smartctl它显示Reallocated_Sector_Ctat 0

如何让固件真正重新映射 8 个坏块?

fro*_*utz 6

如果在整个扇区的写入请求中提供了新数据,则驱动器只能尝试重写或重新分配不可读扇区。badblocks不这样做,所以没有任何改变。

\n

“非破坏性”读写模式的工作原理如下:

\n
    \n
  1. 读取原始数据
  2. \n
  3. 编写测试模式
  4. \n
  5. 读取测试模式
  6. \n
  7. 写入原始数据
  8. \n
\n

如果第一步已经失败,即无法读取数据,则也无法对该扇区执行写入操作,因为之后无法恢复原始数据。这将是破坏性写入,但您特别要求非破坏性变体,因此尚未完成。

\n

“非破坏性”方法仍然可能因其他原因而无法恢复原始数据,因此无论如何,您都不应该在要保留数据的驱动器上运行坏块。

\n
\n

如果您想badblocks无论如何都执行此操作,那么您必须使用其-w写入模式 \xe2\x80\x94 ,默认情况下它会覆盖所有数据,因此您希望将范围缩小到应该是的特定扇区范围使用badblocks -w device [last_block [first_block]]可选参数形式覆盖。您可以通过首先运行只读坏块测试来确定这些扇区。

\n

只读测试:

\n
# badblocks /dev/foobar\n1000\n
Run Code Online (Sandbox Code Playgroud)\n

块 1000 有缺陷,因此专门覆盖该块:

\n
# badblocks -w /dev/foobar 1000 1000\n
Run Code Online (Sandbox Code Playgroud)\n

然而,这仍然会失败。为什么?因为badblocks使用默认的块大小 1024 字节。

\n

对于具有 512 字节扇区大小 \xe2\x80\x94 的设备来说这是错误的,坏块会覆盖两个扇区而不是一个扇区,从而造成额外的损坏 \xe2\x80\x94,对于具有 4096 字节扇区 \xe2\x80\ 的设备来说也是错误的x94 坏块只会写入一个部分扇区,这不适用于重新分配扇区,因为您必须写入完整的数据块。

\n
\n

因此,对于上面的两个命令,您必须指定驱动器的正确块大小(物理扇区大小)(512 或 4096 或其他)。

\n

随着块大小的改变,报告的块号也会相应改变:

\n
# badblocks -b 512 /dev/foobar\n2000\n# badblocks -b 4096 /dev/foobar\n250\n
Run Code Online (Sandbox Code Playgroud)\n

您可以相应地调整写入命令:

\n
# badblocks -b 512 -w /dev/foobar 2000 2000\n# badblocks -b 4096 -w /dev/foobar 250 250\n
Run Code Online (Sandbox Code Playgroud)\n

这应该使驱动器有机会重新分配有问题的扇区。

\n
\n

如果仍然失败,则还有另一种可能性:如果给定设备是分区或其他逻辑驱动器,并且它未与物理驱动器对齐,则所有写入都将是未对齐的,因此您最终会将 4096 字节写入两个部分 4096 字节扇区。

\n

它不会重新定位目标扇区,而是部分损坏相邻扇区中的数据。

\n

所以这种方法存在一定的导致数据进一步丢失的风险。

\n