2011-01-03 2 views
2

Я ищу способ отслеживать, какие блоки на блочном устройстве изменяются после определенного момента времени. Как я в конечном итоге хочу использовать это, так это сохранение двух двухдисковых дисков в синхронизации, один из которых поступает только через Интернет (подключается через USB) один раз в месяц. Не зная, какие блоки были изменены, я должен каждый раз проходить через все 2 ТБ.Отслеживание грязных блоков на блочном устройстве

Я использую новейшую ОС GNU/Linux и имею опыт работы на C и Python. Я надеюсь избежать написания кода уровня ядра, поскольку у меня нет никакого опыта в этой области. Моя нынешняя теория заключается в том, что где-то там, где мой код можно вызвать, когда выполняется флеш-диск, должны быть какие-то перехватчики.

Любые идеи?

+0

Можете ли вы просто использовать rsync? – George

ответ

2

Должно быть возможно использовать Linux MD для этого, при условии, что вы стараетесь избегать a bug in the block layer. Каждый месяц или около того вы добавляете 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 + Мбайт/с с диска происходит быстрее, чем безоговорочное нажатие, скажем, 10 Мбайт/с, по сети с сетью 100 мбит.)

С растровыми изображениями, предназначенными для записи писем MD, этап сканирования не требуется, поскольку он уже знает, с помощью этого растрового изображения, какие блоки были изменены с момента последнего синхронизации дисков.

+0

Я не уверен, как это будет отличаться от inplace rsync, за исключением того, что происходит в основном в пространстве ядра (и работает лениво). Есть ли дополнительные данные о RAID-устройствах, которые записывают изменения, о которых я не знаю? –

+0

Я редактировал вопрос сейчас в разделе Addendum :, поскольку функция комментария не имеет достаточно места. – user562374

+0

Если этот пишущий материал растрового размытия ориентирован, это будет самый эффективный способ сделать это на сегодняшний день, +1 –

1

Без использования каких-либо содержащихся метаданных файловой системы, я считаю, что единственный способ определить изменения - это сравнить блокирующие устройства. Вы можете применить алгоритм дельта-передачи rsync с rsync --inplace -B 4K /dev/sdX /dev/sdY. Отрегулируйте размер блока, подходящий для ваших блочных устройств. Это должно требовать 4 ТБ чтения, но не потребует, чтобы блочные устройства находились в одной и той же системе. Вы можете включить сжатие в передаче среди множества других options.

+0

Просто fyi, rsync пропускает нерегулярные файлы (так что/dev/sdX не работает), и по крайней мере моя версия '-B' не принимает' 4K', но требует фактического номера. – Wolph

2

Вы можете использовать drbd. Это похоже на накладные расходы, но вы можете использовать два устройства на одной машине. Второе устройство (что на usb) должно быть удалено большую часть времени и установить состояние «вторичное». После того, как вы подключите его, он должен синхронизироваться очень быстро. Это связано с тем, что drbd отслеживает локальные изменения.

Да, есть недостаток: вы должны использовать специальный формат, а не только необработанное устройство, а устройство будет меньше, потому что для этого требуется растровое изображение для локально измененных секторов.

Смежные вопросы