跳至内容

镜像解决方案 - lsyncd

先决条件

  • 一台运行 Rocky Linux 的计算机
  • 熟悉从命令行修改配置文件
  • 了解如何使用命令行编辑器(此处使用 vi,但您可以使用您喜欢的编辑器)
  • 您需要 root 权限或 sudo 权限(最好一开始就使用 sudo -s
  • 公钥和私钥 SSH 密钥对
  • Fedora 的 EPEL(企业 Linux 的额外软件包)存储库
  • 您需要熟悉 inotify,一个事件监视器接口
  • 可选:熟悉 tail

简介

如果您想在计算机之间自动同步文件和文件夹,lsyncd 是一个很好的选择。但是,您必须从命令行配置所有内容。

对于任何系统管理员来说,这是一个值得学习的程序。

lsyncd 的最佳描述来自其 man 页。略作改写,lsyncd 是一个轻量级的实时镜像解决方案,易于安装。它不需要新的文件系统或块设备,也不会影响本地文件系统的性能。总之,它会镜像文件。

lsyncd 监视本地目录树的事件监视器接口 (inotify)。它聚合和组合事件几秒钟,然后生成一个(或多个)进程来同步更改。默认情况下,这是 rsync

在本指南中,您将称拥有原始文件的系统为“源”,而同步到的系统为“目标”。使用 lsyncd,您可以完全镜像服务器,只需仔细指定要同步的目录和文件。

您还需要设置 Rocky Linux SSH 公钥/私钥对 进行远程同步。此处的示例使用 SSH(端口 22)。

安装 lsyncd

信息

截至目前(2025 年 9 月),已启用 EPEL(企业 Linux 的额外软件包)的 Rocky Linux 10 不包含 lsyncd 包。要在 Rocky Linux 10 上使用 lsyncd,您需要使用 **安装 lsyncd - 源码方法**。RPM 方法仍保留在此处,因为 EPEL 很可能在未来为版本 10 构建此包。在从源码构建之前,检查该软件包是否可用总是有益的。

您可以通过两种方式安装 lsyncd。下面是每种方法的说明。RPM 包通常比源码包滞后一点点。撰写本文时,RPM 方法安装的版本是 2.2.3-5,而源码版本现在是 2.3.1。选择您最熟悉的方法。

安装 lsyncd - RPM 方法

您首先需要安装的是来自 Fedora 的 EPEL 软件存储库。使用以下命令进行操作:

dnf install -y epel-release

现在安装 lsyncd 以及任何缺失的依赖项

dnf install lsyncd

设置服务在启动时启动,但暂时不要启动它

systemctl enable lsyncd

安装 lsyncd - 源码方法

从源码安装并不难。

安装依赖项

您需要一些 lsyncd 和从源码构建软件包的依赖项。安装“开发工具”组

dnf groupinstall 'Development Tools'

启用代码准备生成器存储库

dnf config-manager --enable crb

安装所需的依赖项

dnf install lua lua-libs lua-devel cmake unzip wget rsync

下载并构建 lsyncd

接下来,您需要源代码

wget https://github.com/axkibe/lsyncd/archive/master.zip

解压 master.zip 文件

unzip master.zip

这会创建一个名为“lsyncd-master”的目录。您需要进入该目录并创建一个名为“build”的目录

cd lsyncd-master

然后

mkdir build

更改目录以访问构建目录

cd build

运行这些命令

cmake ..
make
make install

完成后,您将在 /usr/local/bin 中安装好 lsyncd 二进制文件并准备好使用

lsyncd systemd 服务

使用 RPM 安装方法,systemd 服务会为您安装,但如果您从源码安装,则需要创建 systemd 服务。虽然您可以启动二进制文件而不使用 systemd 服务,但您希望确保它在启动时确实启动。否则,服务器重启将停止您的同步工作。

创建 systemd 服务并不难,从长远来看可以为您节省时间。

创建 lsyncd 服务文件

您可以将此文件创建在任何地方,甚至在您的服务器根目录中。创建完成后,您可以将其移动到正确的位置。

vi /root/lsyncd.service`

此文件的内容将是

[Unit]
Description=Live Syncing (Mirror) Daemon
After=network.target

[Service]
Restart=always
Type=simple
Nice=19
ExecStart=/usr/local/bin/lsyncd -nodaemon -pidfile /run/lsyncd.pid /etc/lsyncd.conf
ExecReload=/bin/kill -HUP $MAINPID
PIDFile=/run/lsyncd.pid

[Install]
WantedBy=multi-user.target

将此文件安装到正确的位置

install -Dm0644 /root/lsyncd.service /usr/lib/systemd/system/lsyncd.service

最后,重新加载 systemctl 守护进程,以便 systemd 可以“看到”新的服务文件

systemctl daemon-reload

lsyncd 配置

使用任一 lsyncd 安装方法,您都需要一个配置文件:/etc/lsyncd.conf。以下部分将告诉您如何构建和测试配置文件。

测试配置示例

这是一个将 /home 同步到另一台计算机的配置文件示例。目标计算机的本地 IP 地址为:192.168.1.40

  settings {
   logfile = "/var/log/lsyncd.log",
   statusFile = "/var/log/lsyncd-status.log",
   statusInterval = 20,
   maxProcesses = 1
   }

sync {
   default.rsyncssh,
   source="/home",
   host="root@192.168.1.40",
   excludeFrom="/etc/lsyncd.exclude",
   targetdir="/home",
   rsync = {
     archive = true,
     compress = false,
     whole_file = false
   },
   ssh = {
     port = 22
   }
}

稍微分解一下这个文件

  • logfilestatusFile 将在服务启动时自动创建
  • statusInterval 是在写入状态文件之前等待的秒数
  • maxProcesses 是允许生成的 lsyncd 进程数。除非您在繁忙的计算机上运行此程序,否则 1 个进程就足够了。
  • 在 sync 部分,default.rsyncssh 表示使用 SSH 上的 rsync
  • source= 是您要同步的目录路径
  • host= 是您要同步到的目标计算机
  • excludeFrom= 告诉 lsyncd 排除文件所在的位置。它必须存在,但可以为空。
  • targetdir= 是您发送文件的目录。这通常等于源,但并非总是如此。
  • rsync = 部分,以及您正在运行 rsync 的选项
  • ssh = 部分,指定目标计算机上正在监听的 SSH 端口

如果您添加了多个要同步的目录,则必须为每个目录重复整个“sync”部分,包括所有开括号和闭括号。

lsyncd.exclude 文件

如前所述,excludeFrom 文件必须存在。现在创建它

touch /etc/lsyncd.exclude

例如,如果您要同步计算机上的 /etc 文件夹,在 lsyncd 过程中会有许多您想要排除的文件和目录。每个排除的文件或目录都在该文件中,每行一个

/etc/hostname
/etc/hosts
/etc/networks
/etc/fstab

测试和启动

一切设置完成后,您可以进行测试。确保您的 systemd lsyncd.service 可以启动

systemctl start lsyncd

如果在执行此命令后没有出现错误,请检查服务状态以确保一切正常

systemctl status lsyncd

如果它显示服务正在运行,请使用 tail 查看两个日志文件的末尾,并确保所有内容都已显示

tail /var/log/lsyncd.log
tail /var/log/lsyncd-status.log

假设这一切看起来都正确,请转到 /home/[user] 目录,其中 [user] 是计算机用户,并使用 touch 在那里创建一个文件。

touch /home/[user]/testfile

转到目标计算机,看看文件是否出现。如果是,则一切正常。使用以下命令设置 lsyncd.service 在启动时启动:

systemctl enable lsyncd

请务必小心

每当您将一组文件或目录同步到另一台计算机时,请仔细考虑其对目标计算机的影响。假设您回看之前的 **lsyncd.exclude 文件** 示例。您能想象如果排除 /etc/fstab 会发生什么吗?

fstab 是配置任何 Linux 计算机上存储驱动器的文件。磁盘和标签在不同计算机上几乎肯定不同。目标计算机下次重启很可能会失败。

结论和参考

lsyncd 是一个强大的工具,用于在计算机之间进行目录同步。它安装不难,维护也不复杂。

您可以通过访问 官方网站 了解更多关于 lsyncd 的信息

作者:Steven Spencer

贡献者:Ezequiel Bruni, tianci li, Ganna Zhyrnova