Пингвинья резервация Alexander S. Salieff Спецвыпуск: Хакер, номер #062, стр. 062-066-4 Первый хэш называется «быстрым», он рассчитывается очень быстро и неточно, его задача — быстро сигнализировать о сильных отличиях блоков. Если быстрые хэши на источнике и в хранилище отличаются, значит, блок однозначно требует пересылки, и тогда тратить ресурсы на расчет второго хэша не нужно. Если же быстрые хэши совпадают, есть вероятность (да, только вероятность: они неточные, могут совпадать и при различных блоках) идентичности блоков и требуется расчет второго, «точного» хэша. Точный хэш рассчитывается дольше и намного точнее, вероятность его коллизии стремится к нулю. Если расчет точных хэшей все-таки выявил различие, блок требует пересылки, иначе оставить его в покое. Rsync поддерживает локальное копирование (в этом случае один процесс обсчитывает обе копии): $> rsync -azv srcdir/* dstdir Здесь a — это комбинированная опция, заменяющая набор -rlptgoD (то есть рекурсивно, сохраняя симлинки, права доступа, таймстемпы, группы, владельцев и специальные файлы девайсов); z — gzip компрессия; v — вывод дополнительной информации. Также можно синхронизироваться по сети. В этом случае rsync подключается к удаленной системе с помощью произвольного remote shell'а, запускает там свой аналог (на удаленной системе тоже должен присутствовать rsync), и они устанавливают взаимодействие между собой. По умолчанию используется все тот же ssh: $> rsync -avz srcdir/* dstuser@dsthost.ru:~/dstdir Rdiff-backup как комплексное решение Опираясь на изложенные концепции, плавно перейдем к пакету rdiff-backup — к комплекту скриптов, написанных на языке python и использующих библиотеку librsync. К сожалению, ни сам пакет, ни librsync обычно не входят в стандартные дистрибутивы, посему придется скачать и поставить их самостоятельно. С другой стороны, эти действия достаточно тривиальны и нет смысла заострять внимание на них. Этот пакет умеет бэкапить и локально, и поверх ssh-транспорта: $> rdiff-backup srcdir dstdir $> rdiff-backup srcdir dstuser@dsthost.ru::dstdir Однако все это не ново. Изюминка реализации заключается в схеме хранения бэкапов. В первый раз сохраняется базовая полная копия, но при последующих бэкапах не она перезаписывается поверх, а сохраняются инкрементальные диффы — только отличия сохраняемой копии от предыдущей. В итоге мы получаем значительную экономию дискового пространства и откат на произвольное время назад, а не только восстановление последней копии. Так выглядит стандартное восстановление данных: $> rdiff-backup -r now dstdir srcdir |