跟踪块设备上的脏块
收藏

我正在寻找一种方法来跟踪块设备上的哪些块在一个时间点之后被修改。我最终想使用它的方式是保持两个2TB的磁盘同步,其中一个每月只联机一次(通过USB连接)。在不知道哪些块已经被修改的情况下,我每次都要经历整个2TB。
我使用的是最新的gnu/linux操作系统,有c和python的经验。我希望避免编写内核级代码,因为我在这方面没有任何经验。我目前的理论是,在执行磁盘刷新时,应该有一些钩子可以调用我的代码。
有什么想法吗?


最佳答案:

如果您小心避免a bug in the block layer,那么应该可以使用linux md。每个月左右,您都会将USB磁盘添加为一个双磁盘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的速度从磁盘读取比在100位网络上无条件地以10 MB/s的速度推送要快。)
对于md写意图位图,扫描阶段是不必要的,因为它已经通过这个位图知道自上次同步磁盘以来哪些块已经更改。

    公众号
    关注公众号订阅更多技术干货!