19 березня, Вівторок, 2024
A- A A+

rsync: синхронизация файлов

rsync (англ. Remote Synchronization) — программа для UNIX-подобных систем, которая выполняет синхронизацию файлов и каталогов в двух местах с минимизированием трафика, используя кодировку данных при необходимости. rsync может копировать или отображать содержимое каталога и копировать файлы, опционально используя сжатие и рекурсию. wiki

Общий вид команды

rsync {OPTIONS} {FROM} {TO}

Копирование содержимого директории /local/folder/ с локальной машины на удаленный сервер user@server, в директорию /remote/folder/

rsync -e "ssh -p 22" --progress --partial --force -avz /home/ext/DB_backups/ Ця електронна адреса захищена від спам-ботів. Вам необхідно увімкнути JavaScript, щоб побачити її.:/volume1/PVE/backups

Важно обратить внимание на последний слэш: если он есть то копируется содержимое папки, иначе - вся директория, вместе с названием.

  • --progress - отображение прогрессбара
  • --partial - сохранение частей файлов после копирования (см. детали алгоритма работы rsync), ускоряет последующие копирования
  • --force - удаление не пустых директорий
  • -e ssh - использование ssh для синхронизации, порт указывается так -e "ssh -p22", настройка подключений по ssh без ввода пароля описана тут
  • -a - алиас для группы ключей (-rlptgoD), сохраняет разные атрибуты файлов/директорий при копировании, включает рекурсию
  • -v - вывод в консоль подробных действий
  • -z - компрессия передаваемых файлов

Другие полезные опции

  • -h - удобный вывод размерностей;
  • --max-size='150k' - синхронизировать только файлы, размер которых меньше 150Kb;
  • --bwlimit=100k - ограничить скорость до 100Kb.

Для того чтобы обеспечить корректное копирование файлов на удаленный сервер без пароля необходимо сгенерировать ключ на стороне хоста ssh-keygen

просмотреть cat ~/.ssh/id_rsa.pub

Скопировать ключ на уделенный хост

ssh-copy-id -i ~/.ssh/id_rsa.pub -p 22 Ця електронна адреса захищена від спам-ботів. Вам необхідно увімкнути JavaScript, щоб побачити її.

Дальше создаем крон crontab -e

каждый день в 2 часа, 10 мин запускать синк

10 2 * * * rsync -e "ssh -p 22" --progress --partial --force -avz /home/ext/DB_backups/ Ця електронна адреса захищена від спам-ботів. Вам необхідно увімкнути JavaScript, щоб побачити її.:/volume1/PVE/backups

Копирование отдельного файла

Если будет спрашивать пароль, то на стророне удаленного хоста проверить права на .ssh папку

chmod 700 ~
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
rsync --progress --partial -avz /local/file.ext user@remote.server:/remote/folder/

Синхронизация двух локальных папок с удалением из {TO} всего чего нет в {FROM}

rsync -av --delete /local/from/ /local/to/

Тоже предназначение, как и у предыдущей команды, только физически ничего не меняется (симуляция процесса)

rsync -avn --delete /local/from/ /local/to/

Показать разницу между двумя каталогами

rsync -avi /local/folder1/ /local/folder2/

И то, из-за чего мне понадобился rsync: надо синхронизировать из периодически обновляемого хранилища группу файлов в другую директорию. В rsync есть опция --files-from=list.txt которая синхронизирует только файл из списка в list.txt, разделитель - новая строка.

rsync -avh --files-from=list.txt --progress /local/folder1/ /local/folder2/

Несколько других полезных опции rsync

  • --exclude='*.pyc' - исключить файлы совпадающие с маской *.pyc, regexp не поддерживается
  • --exclude-from='files.txt' - исключить файлы, которые упомянуты в files.txt, разделить имен - новая строка
  • -h - human-readable формат для размера файлов
  • -u - если файл в {TO} новее чем в {FROM}, то не заменять
  • --existing - обновление только уже существующих файлов, новые не копируются
  • --max-size='7MB' - не передавать файлы, больше 7 МБайт

Для rsync есть графический интерфейс - Grsync.

Под Ubuntu нужно установить пакет grsync

sudo apt-get install grsync

Синхронизация файлов от root

Если нужно синхронизировать файлы от root'a то понадобятся кое-какие манипуляции.

Способ 1. На удаленной машине разрешаем rsync от root без пароля

# sudo visudo
proft ALL= NOPASSWD:/usr/bin/rsync

Тут proft это пользователь под которым подключаемся.

На локальной машине добавим ключ --rsync-path

sudo rsync -e "ssh -p 22" --progress  --force -avh --rsync-path="sudo rsync" /home/mariadb proft@server:/home/

Способ 2. Подключимся с локальной машины на удаленную с сохранением, на некоторое время, прав на sudo

stty -echo; ssh -p 22 proft@server sudo -v; stty echo

На локальной машине добавим ключ --rsync-path

sudo rsync -e "ssh -p 22" --progress  --force -avh --rsync-path="sudo rsync" /home/mariadb proft@server:/home