Как синхронизировать два каталога с помощью lsyncd на Linux
Lsyncd (Live Syncing Daemon) - это бесплатный и открытый исходный код, который мы можем использовать для синхронизации исходного и целевого дерева каталогов. Написанный на языке программирования LUA, он отслеживает события файловой системы в источнике и реплицирует их на целевом объекте, обычно используя такие инструменты, как rsync и ssh. В этом руководстве мы узнаем, как установить lsyncd на наиболее часто используемые дистрибутивы Linux и как настроить его для синхронизации локальных и удаленных каталогов.
В этом уроке вы узнаете:
- Как установить lsyncd на некоторые из наиболее часто используемых дистрибутивов Linux
- Как настроить lsyncd для синхронизации локальных и удаленных каталогов
Установка
Lsyncd доступен в официальных репозиториях Fedora, Debian и Ubuntu; Установка его на эти системы - это всего лишь вопрос запуска этих дистрибутивов пакетных менеджеров. Для выполнения установки на Debian и его производные, включая Ubuntu, мы можем использовать apt:
sudo apt install lsyncd
Чтобы установить lsyncd на Fedora, вместо этого мы используем dnf
:
sudo dnf install lsyncd
Мы также можем использовать менеджер пакетов dnf для установки lsyncd на Red Hat Enterprise Linux и его клоны (например, Rocky Linux и AlmaLinux), однако, поскольку эти дистрибутивы не упаковывают утилиту напрямую, мы должны сначала добавить репозиторий EPEL в качестве источника программного обеспечения.
Установка lsyncd на Archlinux (AUR)
Хотя lsyncd не доступен напрямую в официальных репозиториях Archlinux, мы можем установить его из AUR (Arch User Repository), либо используя помощник AUR, такой как yay, либо собрав его вручную. В этом уроке мы следуем второму методу.
Прежде всего, мы должны убедиться, что git
и пакеты base-devel
установлены в нашей системе:
sudo pacman -S install git base-devel
Мы также должны установить некоторые build-зависимости:
sudo pacman -S asciidoc cmake lua53-posix
PKGBUILD, содержащий инструкции по сборке пакета, и другие необходимые файлы хранятся в репозитории git; Мы можем клонировать его с помощью следующей команды:
git clone https://aur.archlinux.org/lsyncd.git
Чтобы начать сборку пакета, мы входим в репозиторий git, который мы только что клонировали, и выполняем команду makepkg
:
cd lsyncd && makepkg
Процесс может занять некоторое время, в зависимости от ресурсов нашего станка. Как только сборка будет завершена, мы должны найти пакет в текущем рабочем каталоге. Пакет назван в честь версии lsyncd, которая на момент написания статьи называется "2.3.1". Чтобы его установить, запускаем:
sudo pacman -U lsyncd-2.3.1-9-x86_64.pkg.tar.zst
Настройка lsyncd
Чтобы указать, как должен работать lsyncd, мы редактируем его основной файл конфигурации, который сам написан на LUA. В Fedora и дистрибутивах, основанных на Fedora, файл находится в /etc/lsyncd.conf
, в то время как в других дистрибутивах это: /etc/lsyncd/lsyncd.conf.lua
. Обратите внимание, что файл может не существовать по умолчанию, поэтому нам может потребоваться создать его вручную. Несмотря на то, что можно сильно настроить действия, выполняемые lsyncd, чтобы синхронизировать исходное и целевое деревья, здесь мы научимся использовать две основные реализации по умолчанию: rsync и rsync-ssh.
Реализация rsync
Чтобы начать использовать реализацию "rsync", мы можем начать с копирования файла примера /usr/share/doc/lsyncd/examples/lrsync.lua
и изменить его в соответствии с нашим сценарием использования. На Fedora мы можем выполнить:
sudo cp /usr/share/doc/lsyncd/examples/lrsync.lua /etc/lsyncd.conf
На всех остальных дистрибутивах вместо этого:
sudo mkdir -p /etc/lsyncd/ && sudo cp /usr/share/doc/lsyncd/examples/lrsync.lua /etc/lscynd.conf.lua
Вот содержимое файла:
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync.
--
settings {
▸\statusFile = "/tmp/lsyncd.stat",
▸\statusInterval = 1,
}
sync{
▸\default.rsync,
▸\source="src",
▸\target="trg",
}
Первое, что мы видим в файле, это вызов функции настроек
, которая используется для изменения настроек демона. В качестве аргумента он принимает ассоциативный массив, заполненный параметрами конфигурации и их значениями (отсутствующая скобка вокруг аргумента — это просто синтаксический сахар LUA). В этом случае, например, мы можем видеть, что путь к statusfile установлен как /tmp/lsyncd.stat
(lsyncd использует этот файл для периодической записи записи о состоянии), а statusInterval, интервал времени после записи lsyncd в файл состояния, установлен на 1 секунду. С полным перечнем доступных параметров мы можем ознакомиться в официальной документации.
После функции настроек
выполняется однократный вызов синхронизации
для фактической синхронизации содержимого исходного и целевого каталогов. Эта функция также принимает ассоциативный массив в качестве единственного аргумента: он включает имя реализации, которую мы хотим использовать (в данном случае default.rsync), и путь к исходному и целевому каталогам. Предположим, что мы хотим синхронизировать каталог /var/www/html
с /opt/www/html
на той же машине, мы бы написали:
sync{
▸\default.rsync,
▸\source="/var/www/html",
▸\target="/opt/www/html",
}
Будет синхронизировано только содержимое исходного каталога, а не сам каталог. Кроме того, для успешного выполнения команды должен существовать целевой каталог. Чтобы сохранить целевой каталог синхронизированным с удаленным каталогом, все, что нам нужно сделать, это включить часть host в определение цели, так же, как мы сделали бы это при прямом вызове rsync. Просто в качестве примера, чтобы использовать каталог /opt/www/html
в качестве цели, на удаленном хосте с IP 192.168.122.186, подключившись к нему как пользователь "vagrant", мы напишем:
sync{
▸\default.rsync,
▸\source="/var/www/html",
▸\target="vagrant@192.168.122.186:/opt/www/html",
}
Само собой разумеется, что для того, чтобы это работало, ssh-соединение уже должно быть настроено и авторизовано.
Реализация rsyncssh
Реализация default.rsyncssh отличается от default.rsync тем, как она обрабатывает перемещение файлов. Последний удаляет файлы и повторно передает их, в то время как первый использует команды ssh для их перемещения локально, на целевой хост. При использовании этой реализации, вместо того, чтобы включать имя удаленного хоста как часть "цели", мы передаем его через специальный параметр: "host".
В качестве основы для этой реализации мы можем использовать файл /usr/share/doc/lsyncd/examples/lrsyncssh.lua
. Вот его содержание:
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync, but executing moves through on the target.
--
sync{default.rsyncssh, source="src", host="localhost", targetdir="dst/"}
Чтобы синхронизировать два каталога, которые мы видели в предыдущем примере с помощью этой реализации, мы напишем:
----
-- User configuration file for lsyncd.
--
-- Simple example for default rsync, but executing moves through on the target.
--
sync{
▸\default.rsyncssh,
▸\source="/var/www/html",
▸\host="vagrant@192.168.122.186",
▸\targetdir="/opt/www/html/"
▸\}
Передача опций rsync и ssh
При использовании реализаций default.rsync и default.rsyncssh можно указать дополнительные параметры rsync с помощью параметра "rsync". Мы можем, например, указать альтернативный путь для двоичного файла rsync, запустить rsync в архивном режиме (как бы с помощью опции -a
) и заставить его прочитать список файлов, которые нужно исключить из файла, написав:
sync{
▸\default.rsync,
▸\source="/var/www/html",
▸\target="vagrant@192.168.122.186:/opt/www/html",
▸\rsync={
▸\▸\binary="/usr/local/bin/restic"
▸\▸\archive=true,
▸\▸\excludeFrom=/etc/rsync_excludes.txt
▸\}
}
При использовании реализации default.rsyncssh также возможна передача параметров SSH, используя параметр "ssh". Как "rsync", он принимает ассоциативный массив в качестве значения. Используя его, в качестве примера, мы можем указать альтернативный порт для ssh-соединения:
sync{
▸\default.rsyncssh,
▸\source="/var/www/html",·
▸\host="vagrant@192.168.122.186",·
▸\targetdir="/opt/www/html",
▸\ssh={
▸\▸\port=15400
▸\}
}
Запуск и включение службы lsyncd
Поскольку подавляющее большинство дистрибутивов Linux приняли systemd в качестве системы инициализации, чтобы запустить службу lsyncd и включить ее при загрузке, мы можем использовать следующую команду:
sudo systemctl enable --now lsyncd.service
Выводы
В этом уроке мы узнали, как установить lsyncd на некоторые из наиболее часто используемых дистрибутивов Linux, и как использовать его для синхронизации двух локальных или удаленных деревьев каталогов. Помните, что lsyncd работает только в одном направлении, синхронизируя содержимое исходного каталога с целевым. Двунаправленная синхронизация невозможна.