场景:两台 openEuler 24.03 LTS 服务器,将主机 /upload 目录下的所有文件实时单向同步到备机 /upload。
方案:lsyncd(inotify 监听文件变化)+ rsync(增量传输)+ ssh(加密通道)。
1. 架构与原理
Lsyncd(Live Syncing Daemon)常驻于主机,通过内核的 inotify 机制监听 /upload 目录的增、删、改事件,将变化批量聚合后调用 rsync 经由 SSH 通道推送到备机,实现准实时的单向同步(主 → 备)。
| | | |
|---|
| node1 | 192.168.10.11 | |
| node2 | 192.168.10.12 | |
数据流向为单向:主机的改动会覆盖到备机;备机上对 /upload 的本地改动不会同步回主机,且可能在下一次同步时被主机内容覆盖,因此备机的 /upload 应视为只读副本。
请将下文所有 192.168.10.11、192.168.10.12、用户名等替换为你的实际环境。
2. 前置准备(主备两台都执行)
2.1 确认系统版本
cat /etc/openEuler-release
# 期望输出类似:openEuler release 24.03 (LTS)
uname -r
2.2 配置主机名与 hosts(可选,便于识别)
# 主机执行
hostnamectl set-hostname node1
# 备机执行
hostnamectl set-hostname node2
# 主备都执行,写入 /etc/hosts
cat >> /etc/hosts <<'EOF'
192.168.10.11 node1
192.168.10.12 node2
EOF
2.3 时间同步(强烈建议)
文件时间戳一致可避免 rsync 误判,建议启用 chrony:
dnf install -y chrony
systemctl enable --now chronyd
chronyc sources -v
2.4 创建同步目录
# 主备都执行
mkdir -p /upload
chmod 755 /upload
3. 安装软件
3.1 备机:安装 rsync 与 sshd
备机只做接收,无需安装 lsyncd。
dnf install -y rsync openssh-server
systemctl enable --now sshd
rsync --version
3.2 主机:安装 rsync 与 lsyncd
dnf install -y rsync
安装 lsyncd 有两种方式,优先尝试 dnf 直装;若仓库中没有再用源码编译。
方式 A:dnf 直接安装(先尝试)
# 部分 openEuler 版本将 lsyncd 收录在 EPOL/everything 仓库
dnf install -y lsyncd
若提示 No match for argument: lsyncd,先确认 EPOL 仓库已启用再重试:
dnf repolist all | grep -i epol
# 如未启用,可编辑 /etc/yum.repos.d/openEuler.repo 将 [EPOL] 段的 enabled 改为 1
dnf clean all && dnf makecache
dnf install -y lsyncd
方式 B:源码编译(dnf 找不到时使用)
# 1) 安装编译依赖(lsyncd 基于 Lua)
dnf install -y gcc make cmake lua lua-devel rsync git
# 2) 获取源码(任选其一)
cd /usr/local/src
git clone https://github.com/lsyncd/lsyncd.git
cd lsyncd
# 或下载发布包:
# wget https://github.com/lsyncd/lsyncd/archive/refs/tags/release-2.3.1.tar.gz
# 3) 编译安装
mkdir -p build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
make
make install
# 4) 验证
/usr/local/bin/lsyncd --version
ln -sf /usr/local/bin/lsyncd /usr/bin/lsyncd # 方便直接调用
编译报错多为 Lua 版本不匹配,确保已安装 lua-devel;如系统为 Lua 5.4,新版 lsyncd(2.3.x)已支持。
4. 配置 SSH 免密(主机 → 备机)
lsyncd 通过 SSH 推送数据,必须实现主机到备机的免密登录。以下在主机以 root 身份操作(生产环境建议改用专用同步账户,见第 8 节)。
# 1) 主机生成密钥(已有可跳过,一路回车)
ssh-keygen -t ed25519 -N "" -f /root/.ssh/id_ed25519
# 2) 将公钥分发到备机
ssh-copy-id -i /root/.ssh/id_ed25519.pub root@192.168.10.12
# 3) 验证免密(应能直接登录,不提示输入密码)
ssh root@192.168.10.12 "hostname && date"
首次连接会询问是否信任主机指纹,输入 yes。务必在配置 lsyncd 前手动 ssh 一次,确保 known_hosts 已记录,否则 lsyncd 启动时会因指纹确认卡住。
5. 配置 Lsyncd(主机)
5.1 创建目录
mkdir -p /etc/lsyncd
mkdir -p /var/log/lsyncd
5.2 编写配置文件 /etc/lsyncd/lsyncd.conf.lua
-- /etc/lsyncd/lsyncd.conf.lua
-- 两台 openEuler 24.03 单向同步 /upload
settings {
logfile = "/var/log/lsyncd/lsyncd.log", -- 运行日志
statusFile = "/var/log/lsyncd/lsyncd.status", -- 状态文件
statusInterval = 10, -- 状态刷新间隔(秒)
nodaemon = false, -- 由 systemd 接管,设为 false
insist = true, -- 启动时目标不可达也不退出,持续重试
maxProcesses = 4, -- 并发 rsync 进程数
}
sync {
default.rsync,
source = "/upload/", -- 源目录,结尾的 / 表示同步目录内容
-- 目标:备机 IP:目标目录
target = "192.168.10.12:/upload/",
delay = 5, -- 事件聚合延迟(秒),减少频繁触发
delete = true, -- 主机删除的文件,备机也删除(保持镜像一致)
rsync = {
binary = "/usr/bin/rsync",
archive = true, -- -a:保留权限/属主/时间/软链等
compress = true, -- -z:压缩传输(局域网带宽充足可设 false)
verbose = true,
owner = true,
group = true,
perms = true,
times = true,
-- 通过 ssh 传输,并指定密钥
rsh = "/usr/bin/ssh -i /root/.ssh/id_ed25519 -o StrictHostKeyChecking=accept-new",
},
}
关键说明:
- •
source 与 target 结尾都带 /,表示同步「目录内容」而非目录本身。 - •
delete = true 会让备机成为主机的精确镜像(主机删了备机也删);若只想增量保留、不删除,改为 false。 - •
delay = 5 表示积攒 5 秒内的变化合并一次传输,可按需调小(更实时)或调大(更省资源)。
5.3 校验配置语法
lsyncd -nodaemon /etc/lsyncd/lsyncd.conf.lua
# 看到持续运行、无报错即说明配置正确,按 Ctrl+C 退出,再交给 systemd 托管
6. 配置 systemd 服务(主机)
dnf 安装通常自带 lsyncd.service;源码编译需手动创建。统一使用下面的单元文件,确保配置路径一致。
创建 /etc/systemd/system/lsyncd.service:
[Unit]
Description=Live Syncing (Mirror) Daemon
After=network-online.target sshd.service
Wants=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/lsyncd -nodaemon /etc/lsyncd/lsyncd.conf.lua
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
源码编译若安装在 /usr/local/bin,请将 ExecStart 改为 /usr/local/bin/lsyncd,或保留第 3.2 节创建的软链接。
启动并设为开机自启:
systemctl daemon-reload
systemctl enable --now lsyncd
systemctl status lsyncd --no-pager
7. 防火墙与 SELinux
7.1 防火墙(备机需放行 SSH/22)
数据走 SSH(22 端口),只需保证备机放行 22 即可:
# 备机执行
firewall-cmd --permanent --add-service=ssh
firewall-cmd --reload
firewall-cmd --list-all
若 SSH 改了非标准端口,需在防火墙放行对应端口,并在 lsyncd 的 rsh 中加 -p <端口>。
7.2 SELinux
openEuler 默认开启 SELinux。lsyncd 经 ssh 调用 rsync 通常不受策略阻拦,但若日志出现权限拒绝,可排查:
getenforce
# 查看是否有 lsyncd/rsync 相关 AVC 拒绝
ausearch -m avc -ts recent | grep -iE 'lsyncd|rsync'
如确认是 SELinux 拦截,可针对性生成放行策略(推荐)而非直接关闭:
dnf install -y policycoreutils-python-utils setroubleshoot-server
ausearch -m avc -ts recent | audit2allow -M lsyncd_local
semodule -i lsyncd_local.pp
8. 安全加固(生产建议)
生产环境不建议用 root 直连,可改用专用账户与受限命令:
# 备机:创建同步账户并赋予 /upload 写权限
useradd -m -s /bin/bash syncuser
chown -R syncuser:syncuser /upload
# 主机:生成 syncuser 专用密钥并下发到备机 syncuser
# 然后将 lsyncd.conf.lua 中:
# target = "syncuser@192.168.10.12:/upload/"
# rsh = "/usr/bin/ssh -i /home/syncuser/.ssh/id_ed25519 ..."
进一步可在备机 ~/.ssh/authorized_keys 中用 command= 与 rrsync 限制该密钥只能执行受限 rsync,缩小攻击面。
9. 验证测试
# 1) 主机写入测试文件
echo "hello $(date)" > /upload/test_$(date +%s).txt
mkdir -p /upload/subdir && echo "sub" > /upload/subdir/a.txt
# 2) 等待 delay(约 5 秒)后,到备机检查
ssh root@192.168.10.12 "ls -lR /upload/"
# 3) 删除测试(验证 delete=true 同步删除)
rm -f /upload/test_*.txt
ssh root@192.168.10.12 "ls -l /upload/" # 备机对应文件应已消失
# 4) 观察主机日志
tail -f /var/log/lsyncd/lsyncd.log
看到备机文件随主机变化即同步成功。
10. 运维与排错
常用命令
systemctl status lsyncd # 服务状态
systemctl restart lsyncd # 改完配置后重启生效
journalctl -u lsyncd -f # 跟踪 systemd 日志
tail -f /var/log/lsyncd/lsyncd.log # 跟踪运行日志
cat /var/log/lsyncd/lsyncd.status # 查看实时同步状态/积压队列
常见问题排查表
| | |
|---|
| | lsyncd -nodaemon /etc/lsyncd/lsyncd.conf.lua |
| | 手动 ssh root@备机 确认免密成功,known_hosts 已记录 |
报 rsync: command not found | | |
| | |
| | 局域网可在 rsync 中关 compress;首次可先手动 rsync 打底 |
| delete = false | |
| | |
调大 inotify 监听上限(目录文件量很大时)
cat >> /etc/sysctl.conf <<'EOF'
fs.inotify.max_user_watches = 1048576
fs.inotify.max_user_instances = 1024
EOF
sysctl -p
首次全量打底(可选,海量文件建议)
文件量很大时,可先用 rsync 手动同步一次,再启动 lsyncd 负责后续增量,避免启动瞬间压力过大:
rsync -avz -e "ssh -i /root/.ssh/id_ed25519" /upload/ root@192.168.10.12:/upload/
systemctl restart lsyncd
附录:部署速查清单
| | |
|---|
| rsync | rsync |
| mkdir -p /upload | mkdir -p /upload |
| | |
| /etc/lsyncd/lsyncd.conf.lua | |
| systemctl enable --now lsyncd | systemctl enable --now sshd |
| | ls -lR /upload |