我正在对嵌入式系统的一些磁盘问题进行故障排除,并且大约有一半的时间在我重新启动时 SATA 驱动器丢失。该设备使用 ZFS 镜像作为根分区,并具有 1 个 SATA 驱动器和 1 个 NVME 驱动器。显然,当我重新启动并且 SATA 驱动器存在时,它需要重新同步镜像以使用新的根内容更新驱动器。
ZFS 如何选择要复制的块/文件?它是基于时间戳,还是有某种内部计数器用于确保新数据不会被旧数据覆盖?
答案1
我认为ZFS主要依靠校验和。当一个块被写入时,它也会存储它的 SHA256 校验和。通常它会检测位损坏或逻辑问题,从具有正确校验和的块恢复原始块。
在你的情况下,我敢打赌它更简单,因为一半的时间数据看起来根本丢失(或者至少没有检测到)
编辑:如果在未检测到磁盘时修改了数据,从 C 源来看,它看起来vdev_uberblock_compare
会直接检查时间戳,以便确定最新的超级块并重新同步。