刷新硬盘上的所有数据以提高数据保留率

刷新硬盘上的所有数据以提高数据保留率

给定一个硬盘(旧的磁性硬盘驱动器),具有新同步的数据(其他源的备份/副本),许多文件未受影响(读取但不写入)。随着时间的推移,任何硬盘驱动器都会丢失数据(您会看到位翻转,这就是为什么您应该在不同的硬件上至少拥有 3 个副本......)。

所以同步后,我知道所有数据都处于正确的状态。有没有一种方法可以使用标准 shell 命令* 来读取每个文件并重写(覆盖,这样文件系统就不会碎片化)?预期目的是刷新所有位的磁性状态。或者有任何 Linux 文件系统能够执行类似的操作 [目前我更喜欢 ext4]?

或者有什么理由认为这个想法是无效的?

*或任何其他聪明的工具

答案1

最简单、最快的方法可能是,

dd if=/dev/sda of=/dev/sda bs=256M

dd在写入之前读取(当然,否则就没有任何东西可写),并且设备位置独立于源和目标。

另外,这假设磁盘在刷新期间不会死机。

我会使用相同的数据总量运行速度测试,但bs等于三分之一,一半,确切地两次硬盘缓存的大小。根据硬盘控制器的缓存分配策略,您可能会遇到明显不同的重写时间。

因此,例如假设有256M缓存,

时间 dd ... bs=80M 计数=1638 时间 dd ... bs=128M 计数=1024 时间 dd ... bs=256M 计数=512 时间 dd ... bs=512M 计数=256

bs不应超过一整身体的柱面的数据量,否则硬盘的机制将被迫跳过一个磁道来读取第一个柱面以外的数据,然后跳回相同的数据。您将很容易识别出这种情况,因为硬盘将开始发出嘶嘶声。您希望它发出确定的“tic.tic.tic.”,每个气缸仅被寻址一次。由于 LBA 映射,确定物理大小很困难,而且在较新的硬盘上,由于各个分配区域中的柱面大小不同(距主轴的距离不同),确定物理大小甚至可能是不可能的。在这种情况下,“刷新”磁盘会给驱动器机械装置带来很大的压力。

答案2

ZFS 是大多数现实世界磁盘数据完整性问题的答案。它将检测并纠正位翻转以及任意数量的其他数据损坏事件。

它在 Linux 上相当稳定,在 Solaris 和 BSD 变体上也坚如磐石。如果您还不信任 Linux 上的它,请在某个文件服务器上实现它,并向需要数据的服务器提供 iSCSI、NFS 或 CIFS 卷。后端的 ZFS 将使一切保持良好和安全。

相关内容