跳至内容

镜像解决方案 - lsyncd

先决条件

  • 运行 Rocky Linux 的计算机
  • 能够从命令行修改配置文件
  • 了解如何使用命令行编辑器(此处使用 vi,但可以使用你喜欢的编辑器)
  • 你需要 root 权限或 sudo 权限(从一开始使用 sudo -s 是个好主意)
  • 公钥和私钥 SSH 密钥对
  • 来自 Fedora 的 EPEL(企业 Linux 附加软件包)存储库
  • 你需要熟悉 *inotify*,这是一个事件监控接口
  • 可选:熟悉 *tail*

介绍

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

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

lsyncd 最好的描述来自它的手册页。稍微改写一下,lsyncd 是一个轻量级的实时镜像解决方案,安装起来并不难。它不需要新的文件系统或块设备,也不会影响本地文件系统性能。简而言之,它会镜像文件。

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

对于本指南,你将把具有原始文件的系统称为“源”;你与之同步的系统将被称为“目标”。使用 lsyncd,你可以通过仔细指定要同步的目录和文件来完全镜像服务器。

你还需要设置 Rocky Linux SSH 公钥和私钥对 用于远程同步。这里的示例使用 SSH(端口 22)。

安装 lsyncd

安装 lsyncd 有两种方法。下面包括对每种方法的描述。RPM 往往比源代码包落后一点,但只是落后一点。在撰写本文时,RPM 方法安装的版本为 2.2.3-5,而源代码版本现在为 2.3.1。选择你最熟悉的方法。

安装 lsyncd - RPM 方法

安装 RPM 版本很简单。你只需要先安装 Fedora 的 EPEL 软件库。使用以下命令进行操作

dnf install -y epel-release

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

dnf install lsyncd

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

systemctl enable lsyncd

安装 lsyncd - 源代码方法

从源代码安装并不困难。

安装依赖项

你需要一些 lsyncd 的依赖项,以及从源代码构建软件包的依赖项。在你的 Rocky Linux 计算机上使用以下命令来确保你有必要的依赖项。如果你要从源代码构建,最好安装所有开发工具

dnf groupinstall 'Development Tools'

对于 Rocky Linux 9.0

lsyncd 已在 Rocky Linux 9.0 中经过充分测试,并且可以正常工作。但是,要安装所有必需的依赖项,你需要启用一个额外的存储库

dnf config-manager --enable crb

在执行以下步骤之前执行这九个步骤将允许你完成构建而无需回溯。

以下是 lsyncd 所需的依赖项

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

切换目录以访问 build 目录

cd build

运行以下命令

cmake ..
make
make install

完成后,你将安装 lsyncd 二进制文件,它可以随时在 * /usr/local/bin* 中使用

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 进程数量。 除非您在繁忙的计算机上运行它,否则一个进程就足够了。
  • 在同步部分,default.rsyncssh 表示使用 rsync 通过 SSH 进行同步。
  • 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

请记住要小心

在将一组文件或目录同步到另一台计算机时,请仔细考虑其对目标计算机的影响。 假设您返回到我们上面示例中的 **The lsyncd.exclude File**,您能想象如果您没有排除 /etc/fstab 会发生什么吗?

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

结论和参考资料

lsyncd 是一个功能强大的工具,用于在计算机之间进行目录同步。 正如您所见,它安装起来并不难,维护起来也不复杂。

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

作者:Steven Spencer

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