我有一个SATA驱动器,总共有8个坏块识别的badblocks程序。据推测,驱动器固件应该能够重新映射他们和替代备件。我在badblocks模式下运行了-n,以重写所讨论的分区,并多次运行e2fsck。没有什么改变,总是相同的8个坏块。
当我运行smartctl时,它在0上显示了Reallocated_Sector_Ct。
我如何才能让固件真正地重新映射这8个坏块?
发布于 2022-06-04 18:14:02
如果在完整扇区的写入请求中提供了新数据,则驱动器只能尝试重写或重新分配不可读扇区。badblocks没有这样做,因此,没有任何改变。
“非破坏性”读写模式的工作原理如下:
如果这在第一步已经失败,即不能读取数据,那么也不能为该扇区执行任何写入,因为之后无法恢复原始数据。这将是一个破坏性的写入,但您特别要求非破坏性的变体,所以它没有完成。
由于其他原因,“非破坏性”方法仍然无法恢复原始数据,因此无论如何,您都不应该在要保存数据的驱动器上运行坏块。
如果您无论如何都想用badblocks来完成这个任务,那么您就必须使用它的-w写模式--默认情况下,它会覆盖所有数据,因此您希望将范围缩小到应该使用badblocks -w device [last_block [first_block]]可选参数表单覆盖的特定扇区范围。您可以通过先运行只读坏块测试来确定这些扇区。
只读测试:
# badblocks /dev/foobar
1000块1000有缺陷,因此请具体覆盖此块:
# badblocks -w /dev/foobar 1000 1000然而,这仍将失败。为什么?因为badblocks使用1024字节的默认块大小。
对于512字节扇区大小的设备来说,这是错误的--坏块将覆盖两个扇区而不是一个扇区,从而造成额外的损害--对于4096字节扇区的设备也是错误的--坏块只写一个部分扇区,这不适用于重新分配扇区,因为您必须编写完整的数据块。
因此,对于上面这两个命令,您必须指定驱动器的正确块大小(物理扇区大小) (512或4096或其他东西)。
随着块大小的更改,报告的块号相应地发生变化:
# badblocks -b 512 /dev/foobar
2000
# badblocks -b 4096 /dev/foobar
250您可以相应地修改写命令:
# badblocks -b 512 -w /dev/foobar 2000 2000
# badblocks -b 4096 -w /dev/foobar 250 250这应该给驱动器一个重新分配违规部门的机会。
如果它仍然失败,还有另一种可能性:如果给定的设备是一个分区或其他逻辑驱动器,并且它没有对齐物理驱动器,那么所有的写操作最终都将是非对齐的,因此您最终会将4096字节写入两个部分4096字节扇区。
它不会重新安置目标部门,而是部分破坏邻近部门的数据。
因此,这种方法有可能造成进一步的数据丢失。
发布于 2022-06-04 22:34:42
最简单的方法是完全和有意地忽略这个问题。
固件将在下一次编写时重新映射每个扇区,在此之前没有什么需要担心的。
注意其他智能属性。确保你有好的备份。考虑投资更换磁盘。
https://unix.stackexchange.com/questions/704994
复制相似问题