Я написал скрипт, который восстанавливает раздел из предыдущего сделанного дампа dd . В основном это вызывает эту строку:

dd if=stored_image.img of=/dev/sdb1 bs=1M

Восстановление для этого занимает около 5 минут (20 ГБ данных), и было бы здорово восстановить изображение, только если не было внесено никаких изменений. Конечно, теперь я могу проверить весь раздел с помощью хэша и сравнить его с предыдущим, но генерация хэша выполняется так же быстро, как я могу читать с устройства, поэтому md5sum /dev/sdb1 также требуется около 5 минут для вычисления ...

Теперь возникает вопрос: есть ли способ очень быстро обнаружить изменения на диске? (Примерно через полминуты) Нет необходимости быть уверенным на 100%, но точность должна быть не менее 90%.

1 ответ1

1

Это может звучать как "тяжелое" решение, но я бы порекомендовал 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

Надеюсь, это поможет.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .