rsync — синхронизация файлов и каталогов с удаленной системой

В мире Unix-подобных систем для решения этой задачи широко используется инструмент rsync. Эта программа синхронизует локальные и удаленные каталоги, используя протокол rsync remote-update (протокол удаленного обновления rsync), который позволяет rsync быстро обнаруживать различия между двумя каталогами и копировать минимальный объем данных, необходимый для синхронизации. Это делает программу rsync быстрой и экономичной по сравнению с другими программами копирования.

Программа rsync имеет следующий синтаксис:

rsync параметры источник приемник

где роль источника и приемника могут играть:

• локальный файл или каталог;

• удаленный файл или каталог в форме [пользователь@]хост:путь;

• удаленный сервер rsync, определяемый идентификатором URI rsync://[пользователь@]хост[:порт]/путь.

Обратите внимание, что либо источник, либо приемник должен находиться в локальной системе. Копирование из удаленной системы в удаленную систему не поддерживается.

Давайте попробуем синхронизировать несколько локальных файлов. Сначала очистим наш каталог foo:

[me@linuxbox ~]$ rm -rf foo/*

Далее синхронизируем каталог playground с соответствующей копией в foo:

[me@linuxbox ~]$ rsync -av playground foo

Мы добавили два параметра: -a (для архивирования — обеспечивает рекурсивный обход и сохранение атрибутов файлов) и -v (подробный вывод), чтобы отразить каталог playground в каталог foo. В процессе выполнения команды можно просматривать список копируемых файлов и каталогов. В конце программа выведет итоговое сообщение, как показано ниже, включающее общий объем скопированных данных:

sent 135759 bytes received 57870 bytes 387258.00 bytes/sec

total size is 3230 speedup is 0.02

Если теперь запустить команду еще раз, результат будет другой:

[me@linuxbox ~]$ rsync -av playgound foo

building file list ... done

sent 22635 bytes received 20 bytes 45310.00 bytes/sec

total size is 3230 speedup is 0.14

Обратите внимание на отсутствие списка файлов. Это объясняется тем, что программа rsync не обнаружила различий между ~/playground и ~/foo/playground и поэтому ничего не скопировала. Если теперь изменить файл в playground и запустить rsync еще раз, она обнаружит изменившийся файл и скопирует только его.

[me@linuxbox ~]$ touch playground/dir-099/file-Z

[me@linuxbox ~]$ rsync -av playground foo

building file list ... done

playground/dir-099/file-Z

sent 22685 bytes received 42 bytes 45454.00 bytes/sec

total size is 3230 speedup is 0.14

В качестве примера представьте воображаемый внешний жесткий диск, использовавшийся выше с командой tar. Если после подключения такого диска к системе он снова будет смонтирован в каталог /media/BigDisk, выполним первое резервное копирование системы, для начала создав каталог /backup на внешнем устройстве, а затем вызвав rsync для копирования наиболее важных компонентов системы на внешнее устройство:

[me@linuxbox ~]$ mkdir /media/BigDisk/backup

[me@linuxbox ~]$ sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup

В этом примере мы скопировали каталоги /etc, /home и /usr/local из нашей системы на воображаемый внешний диск. Мы добавили параметр --delete, чтобы удалить файлы, которые могут присутствовать на устройстве с резервной копией, но отсутствовать на устройстве-источнике (этот параметр не нужен при создании резервной копии в первый раз, но является полезным дополнением в последующих операциях копирования). Периодическое повторение процедуры подключения внешнего диска и запуск этой команды rsync является неплохим (хотя и не идеальным) способом сохранения резервной копии небольшой системы. Конечно, здесь также могло бы пригодиться создание псевдонима. Определим псевдоним и добавим его в свой файл .bashrc, чтобы обеспечить возможность быстрого резервного копирования:

alias backup='sudo rsync -av --delete /etc /home /usr/local /media/BigDisk/backup'

Теперь, чтобы выполнить всю работу, достаточно просто подключить внешний диск и ввести команду backup.