我正在寻找一种方法来跟踪块设备上的哪些块在某个时间点之后被修改。我最终想要使用它的方式是让两个 2TB 磁盘保持同步,其中一个每月只上线一次(通过 USB 连接)。在不知道修改了哪些块的情况下,我每次都必须通过整个 2TB。
我正在使用最近的 GNU/Linux 操作系统,并且有 C 和 Python 经验。我希望避免编写内核级代码,因为我在该领域没有任何经验。我目前的理论是,在执行磁盘刷新时,我的代码可以在某处被调用。
有任何想法吗?
应该可以为此使用 Linux MD,前提是您要小心避免块层中的错误。每个月左右,您将 USB 磁盘添加为默认缺少一个的 2 磁盘 RAID 集的新成员,并让它同步更改的块。写意图位图似乎对此很有用,所以不要忘记有一个。
# Creation
mdadm -C /dev/md0 -l 1 -n 2 -e 1.0 -b internal /dev/sda missing
# Addition of slave disk
mdadm /dev/md0 -a /dev/thatusbthing
另请参阅此设置的更长描述,以及对选项/潜在陷阱的更多讨论。
附录:
rsync 旨在通过(相对较慢的)网络传输文件。这意味着双方将在本地扫描他们的设备,计算滚动校验和,然后传输更改的块。更改列表当然取决于计算校验和。(在 100mbit 网络上,以 30+MB/s 的速度从磁盘读取比无条件地以 10MB/s 的速度推送要快。)
使用 MD 写入意图位图,扫描阶段不是必需的,因为它已经通过该位图知道自磁盘上次同步以来哪些块已更改。
你可以使用drbd。它看起来像一个很大的开销,但你可以在一台机器上使用两个设备。第二个设备(USB 上的那个)大部分时间应该被移除并设置为“次要”状态。插入后它应该会非常快地同步。这是因为 drbd 会跟踪本地更改。
是的,有一个缺点:您必须使用特殊格式,而不仅仅是原始设备,而且设备会更小,因为它需要用于本地更改扇区的位图。