Это может звучать как "тяжелое" решение, но я бы порекомендовал mdadm для этого. У mdadm есть функция, называемая "растровые изображения с записью". Для простоты вы можете думать об этом как о массиве единиц и нулей, где каждое число представляет определенный объем данных на вашем диске. Объем данных, которые он представляет, зависит от размера вашего растрового изображения.
Допустим, у вас есть 20 ГБ данных и 20-битное растровое изображение, каждый бит представляет один ГБ данных. Каждый раз, когда производится запись в ваш RAID-массив mdadm, соответствующий бит раздела размером 1 ГБ переключается на один.
Теперь я хотел бы предложить вам создать "поддельный RAID 1" с битовой картой с намерением записи, и время от времени вы хотите "синхронизировать" свой образ, просто "подключая" его к рейду mdadm. Затем mdadm удостоверится, что во всех разделах, где растровое изображение для записи равно 1, и что "этот раздел грязный", он автоматически синхронизирует данные с вашим изображением.
В качестве примера я создал небольшой скрипт bash:
# Create 2 images (loop1 could later be your /dev/sdb1)
fallocate -l 1G loop1.img
fallocate -l 1G loop2.img
# Create loop deveices for mdadm
losetup /dev/loop1 loop1.img #### you don't need this step for /dev/sdb1 of course
# Create a RAID 1 with only loop1 or sdb1, replace /dev/md/<bitmap> with a suiteable name
mdadm --create -l 1 -n 2 --bitmap=internal --bitmap-chunk=128 /dev/md/bitmap /dev/loop1 missing
поэтому вызов "cat /proc /mdstat" должен вернуть что-то вроде:
md121 : active raid1 loop1[0]
1047552 blocks super 1.2 [2/1] [U_]
bitmap: 4/4 pages [16KB], 128KB chunk
В меню [U_] первого устройства (loop1) указано "U" p, а второе отсутствует (_).
С помощью --bitmap-chunk = вы можете определить, насколько велики порции данных на бит. Меньшие значения дают лучшую скорость перестройки / детализацию, а большие значения дают меньшее влияние на скорость записи для синхронизации растрового изображения.
Если вы хотите синхронизировать ваше изображение, просто создайте из него устройство цикла и добавьте его в рейд:
losetup /dev/loop2 loop2.img
mdadm --add /dev/md/bitmap /dev/loop2
/proc/mdstat сообщит о восстановлении вашего образа, который в первый раз является полной копией:
md121 : active raid1 loop2[2] loop1[0]
1047552 blocks super 1.2 [2/1] [U_]
[===>.................] recovery = 18.7% (196608/1047552) finish=0.1min speed=98304K/sec
bitmap: 0/4 pages [0KB], 128KB chunk
Вы можете либо оставить свой образ в RAID1 все время, чтобы синхронизировать его, либо удалить его после завершения синхронизации. Если вы хотите написать скрипт, вы можете найти его полезным, чтобы проверить /sys /block /md121 /md /sync_action на "idle". Это означает, что восстановление завершено.
Теперь вы можете удалить изображение:
mdadm --fail /dev/md/bitmap /dev/loop2
mdadm --remove /dev/md/bitmap /dev/loop2
После изменения нескольких байтов:
dd if=/dev/urandom of=/dev/md/bitmap bs=4k count=1k seek=1000
Вы видите, что на битовой карте есть грязные биты:
md121 : active raid1 loop1[0]
1047552 blocks super 1.2 [2/1] [U_]
bitmap: **1/4 pages** [4KB], 128KB chunk
Повторное добавление изображения приведет к восстановлению изображения и синхронизации только грязных разделов - нет времени ...
mdadm --re-add /dev/md/bitmap /dev/loop2
sync
Выход должен быть:
md121 : active raid1 loop2[2] loop1[0]
1047552 blocks super 1.2 [2/2] [UU]
bitmap: **0/4 pages** [0KB], 128KB chunk
Надеюсь, это поможет.