给定一个硬盘(旧的磁性硬盘驱动器),具有新同步的数据(其他源的备份/副本),许多文件未受影响(读取但不写入)。随着时间的推移,任何硬盘驱动器都会丢失数据(您会看到位翻转,这就是为什么您应该在不同的硬件上至少拥有 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 将使一切保持良好和安全。