跟踪块设备上的脏块

时间:2011-01-03 03:52:54

标签: linux backup block sync

我正在寻找一种方法来跟踪块设备上的哪些块在某个时间点之后被修改。我最终想要使用它的方法是保持两个2TB磁盘同步,一个只能每月上线一次(通过USB连接)。在不知道哪些块被修改的情况下,我每次都必须经历整个2TB。

我正在使用最近的GNU / Linux操作系统,并且拥有C和Python经验。我希望避免编写内核级代码,因为我在该领域没有任何经验。我目前的理论是,在执行磁盘刷新时,我的代码可能会被调用。[/ p>

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

如果你小心避免a bug in the block layer,应该可以使用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

另见a longer description of this setup,更多讨论选项/潜在陷阱。

附录:

rsync旨在通过(相对较慢的)网络传输文件。这意味着双方将在本地扫描其设备,计算滚动校验和,然后传输更改的块。更改列表当然取决于计算校验和。 (从磁盘读取30 + MB / s比在100mbit网络上无条件推送,比如10MB / s更快。)

使用MD写意图位图时,扫描阶段不是必需的,因为它已经通过此位图知道自磁盘上次同步以来哪些块已更改。

答案 1 :(得分:2)

你可以使用drbd。它看起来像一个bigga开销,但你可以在一台机器上使用两个设备。应该在大多数时间删除第二个设备(在usb上)并设置为“secondary”状态。插入后它应该非常快速地同步。这是因为drbd会跟踪当地的变化。

是的,有一个缺点:您必须使用特殊格式,而不仅仅是原始设备,设备会更小,因为它需要位图用于本地更改的扇区。

答案 2 :(得分:1)

不使用任何包含的文件系统元数据,我认为确定更改的唯一方法是比较块设备。您可以将rsync的delta-transfer算法应用于rsync --inplace -B 4K /dev/sdX /dev/sdY。根据块设备调整块大小。这应该需要4TB的读取,但不要求块设备在同一系统上。您可以在众多其他options之间的转移中启用压缩。

相关问题