```sh sudo apt-get install rsync rsync_ _опции_ _источник_ _приемник_ rsync -avzhe ssh vlapa@178.20.46.157:~/git/ ~/1Tb_r1-a/Backup/_git/ ``` ****-v**** - Выводить подробную информацию о процессе копирования;** -****-q**** - Минимум информации; ****-c**** - Проверка контрольных сумм для файлов; ****-a**** - Режим архивирования, когда сохраняются все атрибуты оригинальных файлов; ****-R**** - Относительные пути; ****-b**** - Создание резервной копии; ****-u**** - Не перезаписывать более новые файлы; ****-l**** - Копировать символьные ссылки; ****-L**** - Копировать содержимое ссылок; ****-H**** - Копировать жесткие ссылки; ****-p**** - Сохранять права для файлов; ****-g**** - Сохранять группу; ****-t**** - Сохранять время модификации; ****-x**** - Работать только в этой файловой системе; ****-e**** - Использовать другой транспорт, например, ssh; ****-z**** - Сжимать файлы перед передачей; ****--delete**** - Удалять файлы которых нет в источнике; ****--exclude**** - Исключить файлы по шаблону; ****--recursive**** - Перебирать директории рекурсивно; ****--no-recursive**** - Отключить рекурсию; ****--progress**** - Выводить прогресс передачи файла; ****--stat**** - Показать статистику передачи; ****--********max-size**** ****—**** максимальный размер файла для передачи; ****--********bwlimit**** ****—**** ограничение скорости для передачи файлов; ****--version**** - Версия утилиты. ```sh sudo vim /etc/rsyncd.conf` pid file = /var/run/rsyncd.pid lock file = /var/run/rsync.lock` log file = /var/log/rsync.log` [share] path = /tmp/share/` hosts allow = 192.168.56.1` hosts deny = * list = true` uid = root gid = root` read only = false` ``` **Здесь мы задаем путь к нашей папке для синхронизации, разрешаем доступ к серверу только с ip адреса (192.168.56.1) и запрещаем все остальные подключения. Параметры uid и gid указывают пользователя и группу, от которых будет запущен демон. Лучше не использовать root, а указать пользователя nobody и выдать ему права на ту папку, в которую будет выполняться синхронизация каталогов rsync.** Настройка rsync завершена, остается сохранить файл, запустить сервер rsync и добавить его в автозагрузку: ```sh sudo systemctl start rsync sudo systemctl enable rsync sudo service cron reload ``` **Копирование и синхронизация файлов на локальном компьютере `rsync -zvh file /tmp/backups/` **Указав опцию** `--progress` **вы можете видеть сколько процентов уже скопировано, а сколько еще осталось:** `rsync -zvh --progress file /tmp/backups/` **Синхронизация папок на локальной машине** `rsync -azvh /home/user/documents /tmp/backups/` **Синхронизация с удаленным сервером** `rsync -avz /home/sergiy/tmp/ root@192.168.56.102:/home/` **По умолчанию rsync попытается использовать транспорт ssh. Если вы хотите использовать ранее созданный сервер rsync, нужно указать это явно:** `rsync -avz /home/sergiy/tmp/ rsync://192.168.56.102:/share` Точно также можно синхронизировать файлы с rsync из удаленного сервера: `rsync -avz root@192.168.56.102:/home/ /home/sergiy/tmp/` Адрес удаленного сервера записывается в таком формате: `имя_пользователя@адрес_машины/папка/на/удаленной_машине` Синхронизация папок rsync будет выполняться на стандартном порту. ### _**Синхронизация файлов по SSH**_ Чтобы задать протокол подключения используется опция -e. При использовании SSH все передаваемые данные шифруются и передаются по защищенному каналу, таким образом, чтобы никто не мог их перехватить. Для использования SSH вам нужно знать пароль пользователя в системе. Синхронизация файлов rsync с удаленного сервера по ssh будет выглядеть вот так: `rsync -avzhe ssh root@192.168.56.102:/root/install.log /tmp/` Если вы используете другой порт для ssh, то здесь его можно указать: `rsync -avzhe "ssh -p 22" root@192.168.56.102:/root/install.log /tmp/` А теперь передадим данные на тот же сервер: `rsync -avzhe ssh backup.tar root@192.168.0.101:/backups/` **Просмотр прогресса при синхронизации** Для просмотра прогресса копирования файла с одной машины на другую используется опция progress: `rsync -avzhe ssh --progress /home/user/documents root@192.168.56.102:/root/documents` **Синхронизация не всех файлов в rsync** Опции include и exclude позволяют указать какие файлы нужно синхронизировать, а какие исключить. Опции работают не только с файлами но и с директориями. Например, скопируем все файлы, начинающиеся на букву R: `rsync -avze ssh --include 'R*' --exclude '*'` `root@192.168.56.102:/root/documents/ /root/documents` **Удаление при синхронизации** Во время синхронизации можно удалять файлы, которых нет на машине откуда идет rsync синхронизация, для этого используется опция --delete. Например: `rsync -avz --delete root@192.168.56.102:/documents/ /tmp/documents/` Если перед выполнением этой команды создать в папке файл которого нет на удаленном сервере, то он будет удален. **Максимальный размер файлов** Вы можете указать максимальный размер файлов, которые нужно синхронизировать. Для этого используется опция --max-size. Например, будем синхронизировать только файлы меньше 200 килобайт: `rsync -avzhe ssh --max-size='200k' /user/documents/` `root@192.168.56.102:/root/documents` **Удаление исходных файлов** Есть возможность удалять исходные файлы после завершения синхронизации с удаленным сервером: `rsync --remove-source-files -zvh backup.tar /tmp/backups/` Таким образом, файл backup.tar будет удален после завершения копирования в папку /tmp/backups. **Режим симуляции rsync** Если вы новичок, и еще не использовали rsync, то возможно захотите посмотреть как отработает команда без применения реальных действий в файловой системе. Для этого есть опция dry-run. Команда только выведет все выполняемые действия в терминал, без выполнения реальных изменений: `rsync --dry-run --remove-source-files -zvh backup.tar /tmp/backups/` **Ограничить скорость передачи** Вы можете ограничить использование пропускной способности сети с помощью опции ==`--bwlimit`==: `rsync --bwlimit=100 -avzhe ssh /user/home/documents/ root@192.168.56.102:/root/documents/` Как я уже писал выше, rsync синхронизирует только части файла, если вы хотите синхронизировать файл целиком используйте опцию ==-W==: `rsync -zvhW backup.tar /tmp/backups/backup.tar backup.tar` **Автоматическая синхронизация папок rsync** Можно расписать автоматическую синхронизацию с помощью cron. Но в случае доступа к серверу по SSH необходимо будет создать ключ и загрузить его на сервер, чтобы аутентификация проходила без запроса пароля. Создаем ключ: `ssh-keygen -t rsa` Загружаем ключ на сервер к с которым собираемся синхронизироваться: `ssh-copy-id -i /home/sk/.ssh/id_rsa.pub sk@192.168.1.250` Теперь можем переходить к настройке расписания cron. Будем запускать синхронизацию каждый день: `crontab -e` `00 05 * * * rsync -azvre ssh /home/user/Downloads/ 192.168.56.102:/share` rsync синхронизация каталогов будет выполняться каждый день в пять утра. `@hourly rsync -avzhe ssh vlapa@178.20.46.157:/home/vlapa/git/ /home/vlapa/1Tb_r1-a/Backup/_git/` rsync синхронизация каталогов будет выполняться каждый час. ============================== **Автоматическая синхронизация файлов с удалённым сервером** ```bash #!/bin/bash # Локальная директория для синхронизации LOCAL_DIR="/path/to/local/dir" # Удалённый сервер и директория REMOTE_USER="user" REMOTE_SERVER="server.com" REMOTE_DIR="/path/to/remote/dir" # Синхронизация с удалённым сервером rsync -avz $LOCAL_DIR $REMOTE_USER@$REMOTE_SERVER:$REMOTE_DIR # Вывод сообщения о завершении echo "Синхронизация завершена!" ``` ✔️ **Скрипт синхронизирует файлы из локальной директории на удалённый сервер с помощью** rsync**.** ======================================= # Утилита rcync: синхронизация директорий и backup-ы 15.12.2019 Теги: [CLI](https://tokmakov.msk.ru/blog/tags/15) • [Linux](https://tokmakov.msk.ru/blog/tags/1) • [Директория](https://tokmakov.msk.ru/blog/tags/37) • [Команда](https://tokmakov.msk.ru/blog/tags/2) • [Конфигурация](https://tokmakov.msk.ru/blog/tags/11) • [Настройка](https://tokmakov.msk.ru/blog/tags/266) • [Сервер](https://tokmakov.msk.ru/blog/tags/301) • [Файл](https://tokmakov.msk.ru/blog/tags/35) Утилита rsync — это программное обеспечение с открытым исходным кодом, которое можно использовать для синхронизации файлов и директорий с локального компьютера на удаленный и наоборот. Примечательная особенность rsync — возможность передавать файлы с шифрованием, используя ssh в качестве транспорта. Синтаксис команды $ rsync опции источник приемникКопировать ## Примеры использования Перед тем, как копировать файлы, всегда стоит сделать пробный прогон (ключ `-n`) в режиме с показом подробностей (`-v`): `rsync -avn /path/to/src/ user@example.com:/path/to/dstКопировать В этом режиме `rsync` покажет список файлов, которые он скопирует. После этого можно запускать настоящее копирование: `rsync -av /path/to/src/ user@example.com:/path/to/dstКопировать В этой команде ключ `-a` подразумевает рекурсивное копирование всех файлов и каталогов включая их атрибуты: владелец, группа, дата создания и изменения. Ключ `-v` даст подробный отчет о работе по мере выполнения и по окончании. Обратите внимание на слэш в конце первого аргумента — без него файлы источника `/path/to/src/файлы` будут размещены в `/path/to/dst/src/файлы`. А при наличии слэша в конце первого аргумента — файлы будут в `/path/to/dst/файлы`, что скорее всего и нужно. По умолчанию `rsync` попытается использовать транспорт ssh. При использовании другого порта для ssh, его нужно указать: `rsync -av -e "ssh -p 2222" /path/to/src/ user@example.com:/path/to/dstКопировать Точно также можно скопировать файлы из удаленного сервера на локальную машину: `rsync -av user@example.com:/remote/machine/path/ /local/machine/pathКопировать Обратите внимание, что источник всегда является первым аргументом, а приемник — вторым. Для автоматического копирования, например по `cron`, необходимо настроить авторизацию с использованием ключей. ## Основные опции **Опция** `-a` или `--archive` — рекурсивно копирует файлы, включая разыменованные символьные ссылки, с сохранением связанных с файлами сведений об их владельцах, групповых и индивидуальных правах и времени последнего изменения. Использование этого ключа равносильно указанию ключей `--group`, `--links`, `--owner`, `--perms`, `--recursive` и `--times`. **Опция** `-b` или `--backup` — переименовывает файлы, которые в противном случае должны быть удалены или перезаписаны, добавляя к их существующим именам знак тильды (~). Эта опция обычно используется вместе с `--backup-dir` — вместо переименования `rsync` перемещает эти файлы в указанный каталог. **Опция** `--backup-dir=dir` — используется вместе с `--backup` и перемещает в директорию `dir` те файлы, которые в противном случае должны быть удалены или перезаписаны. После перемещения старой версии файла в каталог `dir` новая версия из источника копируется в приемник. Если `dir` указан с использованием относительного пути, то это путь относительно приемника. **Опция** `--copy-unsafe-links` — для каждого файла, являющегося символьной ссылкой на файл за пределами той иерархии, которой принадлежит источник, производится копирование файла, на который указывает ссылка, а не символьной ссылки на него. **Опция** `--delete` заставляет `rsync` удалять файлы в приемнике, которые отсутствуют в источнике. **Опция** `-n` или `--dry-run` — запуск утилиты без записи на диск. С опцией `--verbose` позволяет посмотреть, что будет сделано, если запустить rsync без `--dry-run`. Особенно полезно запускать перед использованием `--delete`. **Опция** `-g` или `--group` — сохранение групповых связей копируемых файлов. **Опция** `-l` или `--links` — для каждого файла, являющегося символьной ссылкой, копирование символьной ссылки, а не файла, на который указывает ссылка, даже если файл, на который указывает ссылка, не присутствует в источнике. **Опция** `--link-dest=dir` — если файл существует в источнике, но его нет в приемнике, rsync ищет в каталоге `dir` файл с точно таким же именем. Если точная копия файла будет найдена, rsync создает из файла в `dir` жесткую ссылку на него в приемнике. Если точная копия не будет найдена, rsync копирует файл в приемник. **Опция** `-o` или `--owner` — сохранение данных о владельце копируемых файлов (только для пользователей с root-правами). **Опция** `-p` или `--perms` — сохранение данных о правах доступа копируемых файлов. **Опция** `-r` или `--recursive` — рекурсивный спуск по каталогу-источнику и копирование всех файлов в иерархии. **Опция** `-t` или `--times` — сохранение данных о времени последнего изменения копируемых файлов. **Опция** `-u` или `--update` — пропускать файл, если в приемнике оказался файл новее, чем в источнике. **Опция** `-v` или `--verbose` — вывод информации о том, что в данный момент делает rsync. **Опция** `-z` или `--compress` — сжатие файлов в процессе копирования. ## Зеркальное копирование Утилиту rsync можно использовать для создания зеркальной копии каталога. На удаленной системе должен быть установлен ssh-сервер (к нему можно подключиться с использованием утилиты ssh). Если нужно запускать копирование по расписанию, следует настроить авторизацию с использованием ключей. `rsync --archive --update --delete /path/to/mirror/ user@example.com:/path/to/mirrorКопировать Опция `--update` заставляет rsync не перезаписывать самые последние версии файлов на удаленной системе более старыми версиями таких же файлов, взятых из локальной системы. Опция `--delete` заставляет rsync удалять на удаленном сервере файлы, отсутствующие на локальной системе. ## Резервное копирование После проведения исходного резервного копирования rsync может эффективно осуществлять дополнительное резервное копирование, экономя место на диске и время копирования. При дополнительном (инкрементном) копировании сохраняются только те файлы, которые претерпели изменения со времени последнего резервного копирования. С помощью опции `--link-dest=dir` можно превращать каждое дополняющее резервное копирование в полноценное, путем создания жестких ссылок между дополняющими резервными копиями и неизменившимися файлами, имеющимися в исходной полноценной резервной копии. Если `dir` задается как отосительный путь, то он задается относительно файла-приемника. `rsync --archive --link-dest=../backup /path/to/src/ user@example.com:/path/to/dstКопировать При запуске этой команды rsync проходит сверху вниз по содержимому каталога `/path/to/src`, проверяя каждый найденный файл. Для каждого файла в каталоге `/path/to/src` утилита ищет в каталоге `/path/to/dst` точную копию этого файла. - Если она находит точную копию в каталоге `/path/to/dst` — переходит к следующему файлу - Если она не находит точную копию в каталоге `/path/to/dst` — ищет точную копию в каталоге `backup` - Если она находит точную копию файла в каталоге `backup`, утилита создает жесткую ссылку из файла в каталоге `backup` на файл в каталоге `/path/to/dst` - Если она не находит точную копию файла в каталоге `backup`, утилита копирует файл из каталога `/path/to/src` в каталог `/path/to/dst` Небольшой bash-скрипт, демонстрирующий создание полноценной и дополняющей резервной копии: ```bash #!/bin/bash rm -rf backup-two-days-ago mv backup-one-day-ago backup-two-days-ago mv backup-latest-state backup-one-day-ago rsync --archive --link-dest=../backup-one-day-ago /some/path/data/ backup-latest-state ``` Можно немного доработать этот скрипт, чтобы хранить не три, а тридцать резервных копий: ```bash #!/bin/bash SOURCE='/home/evgeniy/data' BACKUP='/home/evgeniy/backup' COUNT=30 # кол-во бэкапов rm -rf ${BACKUP}/backup-${COUNT} for (( i = COUNT; i > 1; i-- )); do mv ${BACKUP}/backup-$((i - 1)) ${BACKUP}/backup-${i} done rsync --archive --link-dest=../backup-2 ${SOURCE}/ ${BACKUP}/backup-1 ``` ========================================== Шпора по флагам rsync ![[2025-06-20_22-34-47.png]] Rsync - программка, которую можно использовать для синхронизации файлов и каталогов с локального компьютера на удаленный и наоборот. Чем-то напоминает scp. `rsync file1 file2 ... user@host:dest `rsync -a dir host:dest_dir Взаимодействием с сервером возможности утилиты не ограничиваются. Все операции можно выполнять и локально. По умолчанию rsync копирует ресурсы без учета предыдущего содержимого целевого каталога. Например, если вы перенесли каталог d, содержащий файлы a и b, на машину, на которой был файл d/c, то после копирования сервер будет содержать d/a, d/b и d/c. Чтобы создать точную копию исходного каталога, необходимо из целевого каталога удалить не существующие в исходном каталоге файлы, например d/c в примере: `rsync -a --delete dir host:dest_dir Посмотрим на еще 1 пример: `rsync -avh --del --progress dir1 dir2 dir3 backup В результате выполнения, каталоги "dir1, dir2 и dir3", вместе со всем их содержимым, будут рекурсивно скопированы в каталог backup. Если какие-то файлы уже есть в каталоге backup, и не были изменены, они будут пропущены. Исключение файлов и каталогов Еще одной значительной фичей rsync является способность исключать файлы и каталоги из процесса передачи. Например, ты хочешь перенести локальный каталог src на хост и при этом исключить все данные с именем .git. Можно сделать следующим образом: `rsync -a --exclude=.git src host: