Rsync примеры синхронизации windows. Копирование файлов с помощью rsync

Есть несколько идентичных серверов (4 ноды) на Amazon EC2 с Ubuntu. Каждый генерирует и хранит у себя на диске кэш, который хотелось бы синхронизировать. Но простой rsync тут не подойдет - файлов несколько миллиардов, nfs - слишком медлителен, и т. д. Полный список рассмотренных вариантов с пояснениями ниже.

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

После теста нескольких кластерных технологий и файловых систем, по совету старшего товарища, решили использовать тот же rsync, но в связке с inotify. Немного поискав в интернете готовое такое решение, дабы не изобретать велосипед, наткнулся на csyncd, inosync и lsyncd. На хабре уже была , но он тут не подходит, т.к. хранит список файлов в базе SQLite, которая вряд-ли сможет сносно работать даже с миллионом записей. Да и лишнее звено при таких объемах ни к чему. А вот lsyncd оказался именно тем, что нам и было нужно.

4. Стартуем демон на всех нодах:

/etc/init.d/lsyncd start

Если Вы оставили «nodaemon = true» в конфиге, то сможете видеть что происходит.

Скорость передачи данных достигает 300 Мбит/с и на загрузку сервера это мало влияет (по сравнению с тем же GlusterFS, например), да и задержка в данном случае сглаживает пики. Многое еще зависит от используемой ФС. Тут тоже пришлось провести маленькое исследование, с цифрами и графиками, так как ситуация довольно специфическая и результаты существующих опубликованных тестов не отражают того, что требуется в задаче.

Что еще было рассмотрено и почему не подходит в данном случае

Все исследование было нацелено на работу с Amazon EC2, с учетом ее ограничений и особенностей, поэтому полученные выводы в основном касаются только ее.
  • DRBD – репликация идет на блочном уровне. В случае деградации одного носителя убиваются оба. Ограничение в 2 ноды. (Больше можно, но 3 и 4-й можно подключить только как слейвы.)
  • Ocfs2 – используется либо поверх DRBD (о чем есть хорошая на хабре), либо нужно иметь возможность монтировать один раздел с нескольких нод. Невозможно на ec2.
  • Gfs2 – аналог ocfs2. Не пробовал, т. к. согласно тестам эта ФС медленней ocfs2, в остальном - ее аналог.
  • GlusterFS – вот тут все заработало практически сразу и как надо! Проста и логична в администрировании. Можно сделать кластер до 255 нод с произвольным значением реплик. Создал кластерный раздел из пары серверов и примонтировал его на них же но в другую директорию (то есть сервера были одновременно и клиентами). К сожалению на клиенте этот кластер монтируется через FUSE, и скорость записи оказалась ниже 3 МБ/сек. А так, впечатления от использования очень хорошие.
  • Lustre - чтобы запустить сие дело в krenel mode нужно патчить ядро. Как ни странно, в репозитории Ubuntu есть пакет с этими патчами, но вот самих патчей под нее или хотя-бы под Debian я не нашел. И судя по отзывам, понял, что завести это в deb-системе - шаманство.
  • Hadoop w/ HDFS, Cloudera - не пробовал, поскольку было найдено другое решение (см. ниже). Но первое что бросается в глаза - написано на Java, следовательно ресурсов кушать будет много, да и масштабы не как у Фесбука или Яху, всего 4 ноды пока.

UPD: Данное решение отлично себя показало на тестах (после чего и была написана статья), но в боевых условиях все оказалось совсем по другому. Минимальная продакшн-конфигурация - 584 тысячи вложенных директорий. А lsyncd навешивает inotify"и на каждую директорию. Сделать это сразу для всего дерева невозможно. Памяти, 584 тысячи нотифаев, съедают относительно немного, около 200 Мб (из 16 ГБ имеющихся), но вот процесс этот занимает 22 минуты. В принципе, не страшно: раз запустил и забыл. Но после этого, при стандартной конфигурации, lsyncd запускает синхронизацию всех файлов, которая в наших условиях либо глючила, либо занимала дни. В общем - не вариант. 100%-ная консистентность не требуется и без начальной синхронизации можно обойтись. Оставалось ее «выключить». Благо, демон написан так, что можно изменить практически все его функции прямо из конфига. Также, для увеличения производительности default.rsync был заменен на default.rsyncssh, а ядро натюнино на предмет лимитов inotify"а. То есть, для большинства задач подойдет конфиг выше, но в нашей конкретной ситуации работает следующее:

Settings = { logfile = "/var/log/lsyncd/lsyncd.log", statusFile = "/var/log/lsyncd/lsyncd.status", statusInterval = 5, --<== чтобы видеть что происходит без включения подробного лога } sync { default.rsyncssh, source = "/raid", host = "node02", targetdir = "/raid", rsyncOps = {"-ausS", "--temp-dir=/tmp"}, --<== описано выше delay = 3, --<== ставим по-меньше, чтобы очередь не забивать init = function(event) --<== перезагрузка функции инициализации. как она выглядела в оригинале можно посмотреть в документации или в исходниках log("Normal","Skipping startup synchronization...") --<== чтобы знать, что мы этот код вообще запускали и когда end } sync { default.rsyncssh, source = "/raid", host = "node03", targetdir = "/raid", rsyncOps = {"-ausS", "--temp-dir=/tmp"}, delay = 3, init = function(event) log("Normal","Skipping startup synchronization...") end }

Настройки ядра

У inotify есть три параметра (см. ls /proc/sys/fs/inotify/):
max_queued_events - максимальное число событий в очереди; default = 16384;
max_user_instances - сколько инстансов inotify может запустить один пользоваетль; default = 128;
max_user_watches - сколько файлов может отслеживать один пользоваль; default = 8192.

Рабочие значения:
echo " fs.inotify.max_user_watches = 16777216 # fs.inotify.max_queued_events = 65536 " >> /etc/sysctl.conf echo 16777216 > /proc/sys/fs/inotify/max_user_watches echo 65536 > /proc/sys/fs/inotify/max_queued_events

Так все заработало уже в продакшине.

Спасибо за внимание!

Программа Rsync (во FreeBSD есть в портах), используется для удаленного копирования () или синхронизации файлов и каталогов, с минимальными затратами трафика. Может практически целиком заменить cp и scp , умеет кодировать данные, поддерживает сжатие и рекурсию, кроме того, прерванные передачи можно с легкостью перезапустить. На страницах руководства, все описано довольно подробно.

Вот несколько примеров: Копировать директорию с контентом: # rsync -a /home/colin/ /backup/colin/ # rsync -a /var/ /var_bak/ # rsync -aR --delete-during /home/user/ /backup/ # Используется относительный путь (см. ниже) То-же что и выше, только по сети и с компрессией. По-умолчанию, Rsync использует для передачи протокол SSH в том числе и с ключами, если таковые имеются. Символ ": " используется как в SCP . Типичный пример удаленного копирования: # rsync -axSRzv /home/user/ user@server:/backup/user/ Исключить из процесса удаленного копирования, директорию tmp в /home/user/ и сохранить иерархию, удаленная директория будет иметь структуру /backup/home/user/ . Данный пример типичен для резервного копирования: # rsync -azR --exclude /tmp/ /home/user/ user@server:/backup/ Использовать 20022 порт для SSH : # rsync -az -e "ssh -p 20022" /home/colin/ user@server:/backup/colin/ Можно использовать демон rsync (с ":: "), это гораздо быстрее, но трафик не шифруется. Местонахождение папки папки для резервного копирования (например /backup ) можно настроить в файле /etc/rsyncd.conf . Переменная RSYNC_PASSWORD служит для того, что-бы избежать необходимости ввода пароля вручную. # rsync -axSRz /home/ ruser@hostname::rmodule/backup/ # rsync -axSRz ruser@hostname::rmodule/backup/ /home/ # Копировать обратно Некоторые важные опции:

  • -a, --archive режим архива; то-же что и -rlptgoD (без -H )
  • -r, --recursive обходить директории (рекурсия)
  • -R, --relative относительные пути
  • -H, --hard-links сохранять жесткие ссылки (hardlink )
  • -S, --sparse handle sparse files efficiently
  • -x, --one-file-system не пересекать границы файловой системы
  • --exclude=PATTERN исключить файлы заданного образца
  • --delete-during приемник удаляется ПРИ ПЕРЕДАЧЕ
  • --delete-after приемник удаляется ПОСЛЕ ПЕРЕДАЧИ

winrsync

Под Windows, rsync можно использовать через cygwin или отдельным приложением cwrsync. Очень удобно для автоматизации резервного копирования. Установите ОДИН из вариантов и добавьте путь в системные переменные Windows: Control Panel -> System -> tab Advanced, button Environment Variables . Отредактируйте переменную "Path ", добавив полный путь до rsync , например так: C:\Program Files\cwRsync\bin или C:\cygwin\bin . Это позволит использовать rsync и ssh из командной строки Windows.

Авторизация по ключу

Rsync автоматически туннелируется через SSH протокол, а тот использует SSH авторизацию на сервере. Автоматическое используется для минимизации участия пользователя в этом процессе, как раз для этого и нужна авторизация по публичному ключу, что-бы не запрашивать у пользователя ввод пароля. Все команды выполняются в командной оболочке Windows (Start -> Run -> cmd ). Создайте и загрузите ключи, как описано в материале , "user " и "server " установите соответствующие. # ssh-keygen -t dsa -N "" # Создаем ключи # rsync user@server:.ssh/authorized_keys2 # Копируем файл ssh/authorized_keys2 на локальную машину # cat id_dsa.pub >> authorized_keys2 # Или используйте редактор, что-бы добавить ключ # rsync authorized_keys2 user@server:.ssh/ # Копируем файл обратно на сервер # del authorized_keys2 # Удаляем локальную копию Теперь проверяем (одной строкой): rsync -rv "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" "user@server:My\ Documents/"

Автоматизация резервного копирования

Планировка и выполнение задания резервного копирования, можно вполне возложить на какой-нибудь планировщик или пакетные файлы (Programs -> Accessories -> System Tools -> Scheduled Tasks). Например, можно создать такой файл, заменив "user@server" на свои:
@ECHO OFF REM rsync the directory My Documents SETLOCAL SET CWRSYNCHOME=C:\PROGRAM FILES\CWRSYNC SET CYGWIN=nontsec SET CWOLDPATH=%PATH% REM uncomment the next line when using cygwin SET PATH=%CWRSYNCHOME%\BIN;%PATH% echo Press Control-C to abort rsync -av "/cygdrive/c/Documents and Settings/%USERNAME%/My Documents/" \ "user@server:My\ Documents/" pause

Мартин Стрейчер (Martin Streicher)
Опубликовано 11.02.2010

Серия контента:

За последние 20 лет применение компьютерных сетей стало чрезвычайно широким. Это произошло главным образом благодаря развитию Интернет, инвестициям в национальную и международную сетевую инфраструктуру и падению цен на сетевое и компьютерное оборудование. Сегодня сети являются повсеместными, и всё новые приложения увеличивают требования к масштабируемости и скорости сетей. Когда-то Интернет начинался с нескольких небольших рабочих станций , но сейчас он и его частные аналоги соединяют бесчисленное количество компьютеров.

Часто используемые сокращения
  • FTP : File Transfer Protocol (протокол передачи файлов)
  • WebDAV : Web-based Distributed Authoring and Versioning (основанный на Web, распределенный протокол с поддержкой авторства и версионности файлов)

На протяжении этого же периода UNIX® также рос и предлагал для использования все более мощное ПО. Протокол FTP был одним из первых инструментов для обмена файлами между системами, он широко распространен и в наши дни. Команда rcp (сокращение от "remote copy" – удаленное копирование) была шагом вперед по сравнению с FTP, так как она не только предоставляла возможности стандартной утилиты cp , но и копировала файлы с одной машины на другую. rdist , основанная на rcp , автоматически распространяла файлы с одной машины на множество систем.

Сегодня все эти инструменты устарели, например, rcp и rdist не обеспечивают безопасность при передаче файлов. Теперь их место занимает scp . Хотя FTP все так же широко распространен, но везде, по возможности, следует использовать SFTP (Secure FTP), безопасную версию FTP. Есть также и другие возможности для обмена файлами, например WebDAV и BitTorrent™. Конечно, чем больше машин у вас есть, тем сложнее поддерживать их в синхронизованном или хотя бы известном состоянии. При работе с scp и WebDAV для этого необходимо написать свой собственный сценарий, выполняющий синхронизацию.

Идеальным инструментом для распределения файлов является rsync . Он умеет возобновлять передачу файлов после разрыва соединения, передает только те куски файла, которые различаются в исходном файле и его копии назначения, а также может выполнять полное или инкрементное резервное копирование. Кроме того, он доступен на всех разновидностях UNIX, в том числе Mac OS X, благодаря чему с его помощью можно легко связать практически любые версии UNIX.

Для знакомства с rsync сначала рассмотрим типичные варианты его использования, а затем перейдем к более сложным возможностям его применения. Для демонстрации работы rsync я буду использовать Mac OS X версии 10.5, Leopard (разновидность FreeBSD) и Ubuntu Linux® версии 8. Если вы используете другую операционную систему, то есть возможность перенести большинство примеров и на нее; обращайтесь к странице руководства (man) rsync на вашей машине чтобы узнать, поддерживаются ли у вас используемые здесь операции, и при необходимости попытаться найти аналог.

Знакомимся с rsync

Так же как cp , rsync копирует файлы из одного места в другое. В отличие от cp , rsync может осуществлять как локальное, так и удаленное копирование. Например, команда, приведенная в , копирует директорию /tmp/photos со всем ее содержимым в домашнюю директорию.

Листинг 1. Копируем директорию и ее содержимое
$ rsync -n -av /tmp/photos ~ building file list ... done photos/ photos/Photo 2.jpg photos/Photo 3.jpg photos/Photo 6.jpg photos/Photo 9.jpg sent 218 bytes received 56 bytes 548.00 bytes/sec total size is 375409 speedup is 1370.11

Параметр -v включает вывод подробных сообщений. Параметр -a (здесь a обозначает архив), является краткой формой записи параметров -rlptgoD , обозначающих, что нужно выполнять рекурсивное (recurse) копирование, копируя символические ссылки как символические ссылки (links), сохраняя у всех файлов права доступа (permissions), время создания (times), группу(group) и владельца файла (owner), а также сохраняя файлы устройств и специальные файлы (devices). Обычно ключ -a создает зеркальную копию файлов за исключением случаев, когда система, на которую выполняется копирование, не поддерживает какие-либо атрибуты копируемых файлов. Например, при копировании директории с UNIX на Windows® не всегда удается идеально отобразить атрибуты. Ниже приводятся несколько предложений для работы в нестандартных ситуациях.

rsync имеет множество параметров. Если вы подозреваете, что параметры команды, описание источника или места назначения копирования неверны, то можно с помощью -n выполнить тестовый запуск. В ходе тестового запуска rsync покажет вам, что будет сделано с каждым файлом, не перемещая в действительности ни одного байта. После этого, убедившись в правильности всех параметров, -n можно убрать, и изменения будут выполнены.

Листинг 7. Копируем файлы на локальную машину
rsync --port=7777 mymachine.example.com::pickup/ Hello! Welcome to Martin"s rsync server. drwxr-xr-x 4096 2009/08/23 08:56:19 . -rw-r--r-- 0 2009/08/23 08:56:19 article21.html -rw-r--r-- 0 2009/08/23 08:56:19 design.txt -rw-r--r-- 0 2009/08/23 08:56:19 figure1.png

Поменяв местами адреса источника и назначения, можно записать в модуль файл(ы) с локальной машины, как показано в .

Листинг 8. Меняем местами директории источника и назначения
$ rsync -v --port=7777 application.js mymachine.example.com::dropbox Hello! Welcome to Martin"s rsync server. application.js sent 245 bytes received 38 bytes 113.20 bytes/sec total size is 164 speedup is 0.58

Это был беглый, но довольно полный обзор возможностей rsync . Теперь давайте посмотрим, как можно применять этот пакет для повседневных задач. rsync особенно полезен для резервного копирования. А поскольку он умеет синхронизировать локальные и удаленные файлы или даже файловые системы, то он является идеальным инструментом для управления большими кластерами машин, которые должны быть (по крайней мере, частично) идентичными.

Организуем резервное копирование своих данных с помощью rsync

Регулярное сохранение резервных копий является необычайно важной, но, как правило, игнорируемой рутинной работой. Ни длительность процедуры резервного копирования, ни потребность в наличии большого внешнего хранилища файлов, ни что-либо другое не могут являться оправданием; копирование данных для обеспечения их сохранности должно быть ежедневной процедурой.

Чтобы сделать эту задачу безболезненной, используйте для резервного копирования rsync и удаленный сервер, возможно, предоставляемый вашим провайдером. Каждая из ваших UNIX-машин может использовать этот механизм, который является идеальным решением для безопасного хранения ваших данных.

Установите на удаленной машине ключи SSH, демон rsync и создайте модуль для резервного копирования, разрешающий запись. После этого запустите rsync и, как показано в сценарии из , создавайте резервные копии, которые едва ли будут занимать много места.

Листинг 9. Создаем ежедневные резервные копии файлов
#!/bin/sh # This script based on work by Michael Jakl (jakl.michael AT gmail DOTCOM) and used # with express permission. HOST=mymachine.example.com SOURCE=$HOME PATHTOBACKUP=home-backup date=`date "+%Y-%m-%dT%H:%M:%S"` rsync -az --link-dest=$PATHTOBACKUP/current $SOURCE $HOST:PATHTOBACKUP/back-$date ssh $HOST "rm $PATHTOBACKUP/current && ln -s back-$date $PATHTOBACKUP/current"

Замените HOST именем вашего сервера резервного копирования, а SOURCE – директорией, которую вы хотите сохранять. Замените PATHTOBACKUP на имя модуля. (Также три последние строки сценария можно заключить в цикл и, изменяя переменную SOURCE , делать резервные копии множества директорий). Данный сценарий работает следующим образом.

  • Сначала в переменную date помещается строка вида 2009-08-23T12:32:18 , содержащая текущую дату и время; эта строка будет уникально идентифицировать каждую резервную копию.
  • Главную работу здесь выполняет команда rsync. Параметры -az сохраняют всю информацию о файлах и выполняют сжатие данных перед их передачей, а параметр --link-dest=$PATHTOBACKUP/current указывает, что если какой-либо файл не менялся, нужно не копировать его в новый экземпляр резервной копии, а создать жесткую ссылку, указывающую на этот файл в существующем архиве. Другими словами, новая резервная копия содержит только файлы, претерпевшие изменения , остальные файлы являются ссылками.

    Рассмотрим сценарий более подробно (и подставим вместо всех переменных их значения). Текущим архивом является mymachine.example.com::home-backup/current . Новый архив для каталога /home/strike будет находиться в каталоге mymachine.example.com::home-backup/back-2009-08-23T12:32:18 . Если файл в /home/strike не был изменен, то файл в новом архиве будет представлен жесткой ссылкой на соответствующий файл в текущем архиве. В противном случае новый файл копируется в новый архив.

    Если вы каждый день изменяете лишь небольшое количество файлов и директорий, то дополнительное место, необходимое для очередного экземпляра резервной копии, будет ничтожно мало. Более того, так как все резервные копии (за исключением самой первой) довольно малы, можно поддерживать в своем распоряжении длинную историю ваших файлов.

  • В последнем шаге мы изменяем организацию резервных копий на удаленной машине, чтобы сделать вновь созданный архив текущим архивом и таким образом минимизировать различия, которые нужно будет записать во время следующего выполнения сценария. В последней команде удаляется текущий архив, (который является просто жесткой ссылкой) и создается символическая ссылка с тем же именем, указывающая на новый архив.

Начав работать с удаленным rsync в повседневных задачах, вам, вероятно, понадобится, чтобы демон был всегда в рабочем состоянии. Для Linux- и UNIX-машин имеется загрузочный сценарий rsync , который обычно находится по адресу /etc/init.d/rsync . Воспользовавшись этим сценарием и утилитой вашей операционной системы, управляющей включением и выключением компонентов, можно организовать запуск rsync при загрузке системы. Если же вы запускаете демон rsync без привилегий суперпользователя или у вас нет доступа к загрузочным сценариям, то вы можете запускать rsync с помощью cron:

@reboot /usr/bin/rsync --daemon --port=7777 --config=/home/strike/rsyncd/rsyncd.conf

Эта команда запускает демон каждый раз при перезагрузке машины. Поместите эту строку в файл crontab и сохраните его.

Вы уже видели, как можно заранее обнаружить проблему, используя предварительный просмотр с помощью -n . Также можно отслеживать состояние задач rsync с помощью двух параметров: --progress и --stats . Первый из этих параметров отображает шкалу хода выполнения задания. Второй показывает статистику сжатия и передачи данных. С помощью --compress можно ускорить передачу данных между машинами. Вместо пересылки данных в изначальном виде отправитель выполняет сжатие перед отправкой, а получатель их распаковывает, и в результате меньшее количество байтов передается за меньшее время.

По умолчанию rsync копирует все файлы из источника данных в место назначения. Это называется дублированием. Если вы хотите организовать зеркалирование данных, т.е. чтобы локальные и удаленные данные в точности совпадали, следует использовать параметр --delete . Например, если в источнике имеются файлы A, B и C, то по умолчанию rsync создаст на удаленной машине копии всех трех файлов. Однако если удалить из источника, например, файл B и выполнить дублирование еще раз, то на удаленной машине файл B останется, т.е. удаленная копия перестанет быть точной копией локальных данных. Команда --delete обеспечивает зеркалирование данных, убирая из удаленной копии файлы, которые уже не существуют в исходных данных.

Зачастую имеются файлы, которые вы не хотели бы помещать в архив или резервную копию. Это могут быть вспомогательные файлы, создаваемые редакторами (их имена обычно заканчиваются тильдой [ ~ ]) и другими утилитами, а также множество не имеющих для вас ценности файлов в вашей домашней директории, таких как MP3-файлы, которые при необходимости можно будет восстановить. В таком случае можно указать rsync шаблоны, по которым он будет исключать файлы из обработки. Можно указать в командной строке шаблон или же текстовый файл, содержащий список шаблонов. Также шаблоны можно использовать совместно с командой --delete-excluded , чтобы удалить подобные файлы из удаленной копии.

Чтобы исключить файлы, соответствующие определенному шаблону, используйте команду --exclude . Помните, что если какие-либо символы в шаблоне имеют для оболочки особое значение, например * , то шаблон следует заключить в одиночные кавычки:

$ rsync -a --exclude="*~" /home/strike/data example.com::data

Допустим, что файл /home/strike/excludes содержит следующий список шаблонов:

*~ *.old *.mp3 tmp

Тогда скопировать все файлы за исключением тех, которые соответствуют какомy-либо из этих шаблонов, можно с помощью следующей команды:

$ rsync -a --exclude-from=/home/strike/excludes /home/strike/data example.com::data

Синхронизируй это

Теперь, когда вы знакомы с rsync , у вас не осталось никаких причин не выполнять регулярное резервное копирование. Что случилось? Ваша собака разгрызла жесткий диск? (Бывает и такое!) Примите меры заранее, и тогда ваши данные останутся в полном порядке. Ведь теперь все ваши ценные файлы хранятся в

Я нашел скрипт синхронизации каталогов через программу rsync . Я подумал, что синхронизация, что backup это одно и тоже, только называется по разному
Программа rsync входит в состав всех дистрибутивов и достаточно популярна, так что вы без труда найдете её в каждом дистрибутиве.
Сразу перейдем к примерам rsync синхронизации.
Мы хотим иметь копию каталога /home/user/foto, а дубликат папки будем хранить в /mnt/backup Выполним (не забывая проверить права папки куда копируем, или выполняем от root-sudo)

Rsync -av /home/user/foto /mnt/backup

  • -a архивный перенос (вместе с папками, вложенными папками, файлами, скрытыми файлами и т.д)
  • -v вывод на экран данных о выполнении команды

Вот так вот просто! Наши фото лежат уже в двух местах. Конечно они не заархивированы и занимают столько же места сколько и первая папка, но придется чем-то жертвовать. А жертвовать придется своим дисковым пространством. К слову сказать для фотографий архивирование неэффективно, очень уж малый коэффициент сжатия. Естественно надо копировать на другой физический диск! Т.к. если умрет один винчестер, то умрут и все остальные разделы на этом диске со всеми бэкапами будь они там.
Продолжим, что-то я отвлекся..
В вышеприведенной команде есть небольшой подвох. К примеру вы переименовали или отсортировали в другие папки фотографии, а старые каталоги изменили название или вообще удалили. Что же получится? Скрипт честно перенесет новые появившиеся файлы и каталоги, а старые которые вы удалили в папке /home/user/foto так и останутся лежать в папке бэкапа. Фактически в часто изменяемых директориях выполнение такого скрипта будет приводить к помойке в папке бэкапа. Чтобы этого избежать команду надо выполнять с ключем --delete

Rsync -av --delete /home/user/foto /mnt/backup

И обе папки всегда будут идентичными
Теперь надо выбрать ваши самые важные директории и написать в файл простенький перечень команд для бэкапа. У меня он когда-то выглядел примерно так.

Rsync -av --delete /home/mik/mail /mnt/backup/home/mik/ rsync -av --delete /home/mik/.mozilla /mnt/backup/home/mik/ rsync -av --delete /home/mik/.claws-mail /mnt/backup/home/mik/ rsync -av --delete /bin /mnt/backup/system rsync -av --delete /boot /mnt/backup/system rsync -av --delete /dev /mnt/backup/system rsync -av --delete /etc /mnt/backup/system rsync -av --delete /lib /mnt/backup/system rsync -av --delete /netup /mnt/backup/system rsync -av --delete /opt /mnt/backup/system rsync -av --delete /root /mnt/backup/system rsync -av --delete /sbin /mnt/backup/system rsync -av --delete /var /mnt/backup/system

Обращаю особое внимание не надо бэкапить все подряд. Если, к примеру, выбрать для бэкапа весь ваш домашний каталог, то там могут находиться коллекция ваших фильмов, дистрибутивы open source и т.д. Все это занимает слишком много места, и как по моему мнению, это бэкапить не стОит.
Вернемся к нашему файлу с перечнем каталогов для бэкапа и сделаем его исполняемым

Chmod +x ./имя_файла

Скрипт можно прописать в crontab для ежедневных выполнений, а в большинстве дистрибутивах таких как ubuntu или debian просто положите его в каталог /etc/cron.daily. Но возможно все равно придется внести изменения в файл /etc/crontab. У большинства компьютер не работает ночью, так что измените выполнения задач /etc/cron.daily на то время, когда у вас компьютер обычно включен.

А теперь примеры команд rsync , которые надо просто иметь ввиду. А то мало ли с какими задачами вы можете столкнуться в будущем.

1 пример.

Rsync -av --delete --exclude="*.avi" --exclude="*.mpg" /home/user /mnt/backup

Команда синхронизирует весь ваш домашний каталог, но не копирует файлы с расширениями avi и mpg. Если вам не надо еще что-то, то просто дописываете подряд --exclude="_что_исключаем_"

2 пример.

Rsync -avz -e "ssh -l ssh_user -p5623" --delete /home/user/foto 192.168.0.1:"./temp"

А вот это уже команда синхронизации между вашим и удаленным компьютером через ssh соединение.

  • -z дополнительно сжимаем данные
  • -e используем удаленный shell
  • ssh -l ssh_user -p5623 - команда на соединение с удаленным компьютером. ssh_user пользователь, а -p5623 это если порт ssh нестандартный, в примере 5623
  • 192.168.0.1:"./temp" - ip адрес компьютера, (можно и по имени). Также указываем директорию куда будем переносить данные. Обратите внимание, что директория задана через ./ , мы уже отталкиваемся от пути домашней директории ssh_user куда мы попадаем при соединении через ssh

После ввода этой команды мы должны авторизоваться по паролю ssh_user и только тогда начнется синхронизация каталогов. Аналогичным образом можно синхронизировать удаленный каталог и локальный. Достаточно просто поменять местами папки, откуда и куда синхронизируем.
Если вы хотите автоматизировать процесс и не вводить каждый раз пароль, то читайте мою статью

Rsync является утилитой для синхронизации файлов и их резервного копирования. Она работает на многих *nix системах).

Ограничение rsync состоит в том, что данные не могут копироваться между 2 удалёнными (remote) системами. В этом случае Вам пришлось бы скопировать данные с одной удалённой системы, а потом перенести на другую.

В aptosid у Вас есть различные возможности запускать процесс синхронизации. Вы можете запускать rsync командой в терминале, или установить дополнительные пакеты из Debian Sid:

Чтобы установить deb пакет:
apt-get install luckybackup
Инструкция по использованию в терминале

В следующем разделе мы представляем rsync, возможности этой программы и несколько примеров, как rsync может использоваться с собственным скриптом резервного копирования.

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

rsync может копировать данные:
* с локальной системы на локальную систему,
* с локальной системы на удалённую (remote) систему,
* с удаленной (remote) системы на локальную систему.

При этом rsync использует клиент ssh (входит в основную установку), либо rsync-daemon, которые работают на исходной и на целевой системе. В manpages rsync говорится, если системы могут связываться по ssh, ssh также может использоваться для rsync.

Ограничение с rsync состоит в том, что данные не могут копироваться между 2 удалёнными (remote) системами. В этом случае Вам придётся скопировать данные с одной удалённой системы, а потом перенести с rsync на другую.

Чтобы пояснить это, рассмотрим следующий пример с 3 компьютерами:

Neo – локальная система morpheus – удаленная система trinity – удаленная система

Каждый пользователь знает имя другого пользователя, и rsync работает исключительно на neo, локальной системе:

Имя пользователя на neo является cuddles, Имя пользователя на morpheus является tartie, Имя пользователя на trinity является taylar.

Целью является синхронизация каталогов /home/$user/Files:

Neo:/home/cuddles/данные с morpheus и trinity, morpheus:/home/tartie/данные с neo и trinity, trinity:/home/taylar/данные с neo и morpheus.

Теперь возникает проблема, что rsync не может быть применён между 2 удалёнными компьютерами:

Neo-> morpheus - с локальной на удалённую, получится neo-> trinity - с локальной на удалённую, получится morpheus-> neo - с удаленной на локальную, получится trinity-> neo - с отдаленной на локальную, получится morpheus-> trinity - нельзя, с удалённой на удаленную trinity-> morpheus - нельзя, с удалённой на удаленную

Чтобы обойти это ограничение, поступаем как указано ниже:

Morpheus --> trinity - станет: morpheus --> neo и neo --> trinity trinity --> morpheus - станет: trinity --> neo и neo --> morpheus

Этот дополнительный шаг не изменяет ничего в конечном итоге. Тем не менее, указывает на то, что:

Это ограничение с rsync должно быть учтено при планировании процесса резервного копирования.

Применение имён хоста с именами хоста в rsync.

Применение имён хостов neo, morpheus, и trinity, вместо IP-адресов, может позволить сделать процесс копирования нагляднее и Вам будет легче разобраться.

Для этого Вы должны отредактировать /etc/hosts и вставить имена хостов и ему принадлежащие IP-адреса. Таким образом в нашем примере файл /etc/hosts будет выглядеть так:

192.168.1.15 neo 192.168.1.16 morpheus 192.168.1.17 trinity

Первая строка переводит IP-адрес 192.168.1.15 на “neo”, вторая 192.168.1.16 на “morpheus” и третья 192.168.1.17 на “trinity”. После записи может использоваться дополнительно имя хоста вместо IP-адреса. Этот особенно удобно, если изменяются распределённые IP-адреса, например, у "neo" с 192.168.1.15 на 192.168.1.25 Это облегчает работу со скриптами, так как они в случае изменения IP-адресов не должны изменяться, а только файл /etc/hosts.

Два способа использования rsync.

Первый способ - данные “толкают (push)” на целевую машину; другой - данные “вытягиваются (pull)” с источника. Каждый метод имеет свои за и против, которые будут рассмотрены ниже. В нашем примере используются локальная и удаленная системы, чтобы более отчетливо объяснить терминологию.

“push” - локальная система несет исходные каталоги и файлы, целью является удаленная система. Команда rsync запускается на локальной системе и "толкает" данные на целевую систему.

Преимущества:
* Больше чем одна исходная система может иметь резервное копирование на целевой. * Процесс резервного копирования на нескольких компьютерах может проходить одновременно. * Если система заканчивает процесс резервного копирования быстрее, это позволяет использовать ресурсы для других заданий.

Недостатки:
* Если скрипт используется с синхронизацией через cron, то crontab-ы должны задаваться на каждой системе. При модификации скрипта необходимо вносить соответствующие изменения на каждой системе, при изменениях календарного плана должен изменяться каждый crontab на каждом компьютере. Вследствие этого административное обслуживание становится очень громоздким и запутанным. * Процесс резервного копирования не возможно проверить, был ли целевой раздел смонтирован целевой системой. Если он не смонтирован, резервного копирования не произойдёт.

“pull” - удаленная система несет исходные каталоги и файлы, целью является локальная система. Команда rsync запускается на локальной системе и "вытягивает" данные из исходной системы.

Преимущества:
* Система станет сервером, который управляет всеми процессами резервного копирования всех других систем. Процессы резервного копирования централизуются.
* При применении скрипта, он должен находится только на одной системе, что упрощает любые модификации. При изменении календарного плана должен изменяться только один crontab.
* Скрипт может проверить, смонтирован ли целевой раздел и при случае его смонтирует.

Синтаксис rsync (часть из "man rsync"):
rsync ... SRC ... DEST rsync ... SRC ... HOST:DEST rsync ... SRC ... HOST::DEST rsync ... SRC ... rsync://HOST[:PORT]/DEST rsync ... SRC rsync ... HOST:SRC rsync ... HOST::SRC rsync ... rsync://HOST[:PORT]/SRC
Рабочие примеры команд rsync:

Объяснение составных частей этой команды:

Источник: (/путь/файл) morpheus:/home/tartie, целью является: /media/sda7/SysBackups/morpheus/home

Каталог /home/tartie (включая подкаталоги) будет сохранен в /media/sda7/SysBackups/morpheus/home, что после rsync будет выглядеть таким образом:

/media/sda7/SysBackups/morpheus/home/tartie

Обратите внимание, копируется только каталог /tartie, в путь указанный rsync /media/sda7/SysBackups/morpheus/home. "Источник" выбирает только, откуда прибывают данные, а "Цель" указывает rsync, куда должны копироваться данные из "источника" он воспринимает его уже не как /home/tartie, а просто /tartie, которого он направить в /media/sda7/SysBackups/morpheus/home. Ещё пример:

Rsync [...] /home/user/data/files /media/sda7/SysBackups/neo

Здесь будет копироваться исходный каталог /files и все в нём находящиеся каталоги и файлы в целевую папку /media/sda7/SysBackups/neo/ - а не в /media/sda7/SysBackups/neo/home/user/data/files.

На это необходимо обращать внимание при использовании резервного копирования с rsync.

Пояснення опцій (чорновий переклад з англомовного "man rsync"):
-a для способа с архивацией. manpage по этому поводу говорит: “проще говоря, этот метод, для создания рекурсивного резервного копирования и копирования почти всех атрибутов. Не сохраняются только жёсткие ссылки из-за сложности процесса. Опция -a соответствует: -rlptgoD, что это значит: -r = rekursiv - копировать подкаталоги и файлы в них из "исходного места". -l = Links - символические ссылки восстанавливаются в пункте назначения. -p = права - права идентичны с ними в исходном месте. -t = временной штамп - временной штамп в исходном месте идентичен с ним. -q = quiet - минимальный вывод информации. Большее количество информации получают с опцией -v после опции -a. Выполнение без какого-либо ответа будет достигнуто без постановки опции -v. -o = владелец - если rsync проводится как root, владельцы исходных файлов остаются соответствующим образом сохранёнными. -D = соответствует этим обеим командам: --devices --specials --devices = символьные файлы и файлы блочного устройства будут копироваться в удаленную систему, чтобы затем восстанавливаться. Нужно обратить внимание, что без опции --super , опция --devices не работает. --specials = rsync копирует специальные файлы как sockets и fifos. --g: группы сохраняются соответственно исходным файлам. -E: сохраняется атрибут "выполнимо". -v: для подробного вывода. Если подробности не важны, эта опция может быть опущена. Тем не менее, если необходимо видеть, что происходит, эта опция очень полезна. -z: копируемые данные архивируются, что ускоряет копировальный процесс, так как перемещённый объем данных будет меньше. --delete-after= целевые каталоги или целевые файлы, которых больше нет в источнике, удаляются после перемещения, а не перед этим. В случае проблем или катастроф будет “after” использован, "delete” предотвращает использование лишнего пространства больше ненужными файлами и каталогами в пункте назначения. -- exclude = указывает на файлы или каталоги исключаемые из копировального процесса. В примере, --exclude = “*~” были бы ВСЕ файлы с окончанием “~” из процесса резервного копирования исключены. С одной опцией --exclude может передаваться только один аргумент, при большем количестве аргументов исключения необходимо использовать несколько опций --exclude.
Дополнительные команды:
-c - проводит дальнейшие сравнительные проверки, что требует большого времени. Так как rsync уже проводит сравнительные проверки, эта команда не была интегрирована в --a из-за её избыточности, а также для экономии времени. В этой опции, как правило, нет нужды. --super - целевая система попытается проводить действия суперпользователя (root) (смотрите manpage) --dry-run - тестовый запуск: просто показывает, что должно копироваться. Никакие файлы не копируются.

И напоследок, варианты указания исходных и целевых каталогов.

Примерные команды:
rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home

Эта команда копирует все каталоги и файлы ниже от /home/tartie на систему "morpheus" и размещает их в этот каталог /media/sda7/SysBackups/morpheus/home. Структура каталога tartie сохраняется.

Rsync -agEvz --delete-after --exclude=”*~” /home/tartie neo:/media/sda7/SysBackups/morpheus/home

Это - противоположная команда первого примера. Она "двигает" каталог /home/tartie и его содержание в указанный каталог системы "neo" - отметим, что систему рассматривают как "удаленную (remote)", если ставится “:” двоеточие перед путем.

Rsync -agEvz --delete-after --exclude=”*~” /home/cuddles /media/sda7/SysBackups/neo/home

Это - процесс резервного копирования на локальном компьютере. Здесь нужно обращать внимание на то, что никакое двоеточие не установлено. Локальный каталог /home/cuddles копируется на /media/sda7/SysBackups/neo/home на том же самом локальном компьютере.

rsync с многими опциями --exclude:
rsync -agEvz --delete-after --exclude=”*~” --exclude=”*.c” --exclude=”*.o” "/*" /media/sda7/SysBackups/neo

Эта команда копирует все из каталога root локальной системы (все каталоги и файлы) на /media/sda7/SysBackups/neo - исключенными из этого являются все файлы и каталоги, которые кончаются на “~”, “.c” или “.o”.

Замена имени хоста IP-адресом:

Первая команда установлена с методом имени хоста, второй с методом IP-адресов. Обе команды идентичны в своём выполнении:

Rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie /media/sda7/SysBackups/morpheus/home rsync -agEvz --delete-after --exclude=”*~” 192.168.1.16:/home/tartie /media/sda7/SysBackups/morpheus/home

Метод имён хоста не должен применяться, но по нашему мнению он упрощает резервное копирование с rsync в сетях.

class="highlight-2">Невозможная команда:

rsync -agEvz --delete-after --exclude=”*~” morpheus:/home/tartie trinity:/home

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

Мы надеемся, с этим маленьким руководством Вам будет легче приступить к использованию rsync, это очень удачная программа резервного копирования.