镜像解决方案 - 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
}
}
稍微分解一下这个文件
logfile
和statusFile
将在服务启动时自动创建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