Lsyncd 配置与使用完整指南
基本上是和ChatGPT交流后得到的流程,因为涉及的对话很长还有bug调试,所以就直接让GPT总结了一下。以下均为AI总结生成。
(适用于:数据盘 → 资源盘,实时同步,3 天回收保护,容器内 supervisor 托管)
1. 背景与目标
2. 目录结构(统一规范)
执行以下命令准备目录:
1 2 3 4 5 mkdir -p \ /root/data-tmp/projects \ /root/data-fs/backup/projects \ /root/data-fs/backup/.trash/current \ /root/data-fs/lsyncd
目录说明:
/root/data-tmp/projects/ → 源数据(代码、环境等)
/root/data-fs/backup/projects/ → 实时镜像
/root/data-fs/backup/.trash/ → 回收站(保留最近 3 天删除/覆盖的旧文件)
/root/data-fs/lsyncd/ → 日志与状态文件
3. 首次全量同步(避免海量 inotify 事件)
1 rsync -aHv /root/data-tmp/projects/ /root/data-fs/backup/projects/
⚠️ 首次执行时 不要带 --delete ,避免误删资源盘已有文件。
4. Lsyncd 配置文件
新建 /etc/lsyncd.conf.lua:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 settings { logfile = "/root/data-fs/log/lsyncd/lsyncd.log" , statusFile = "/root/data-fs/log/lsyncd/lsyncd.status" , statusInterval = 5 , maxProcesses = 4 } sync { default.rsync, source = "/root/data-tmp" , target = "/root/data-fs/backup/projects/" , delete = true , delay = 2 , rsync = { archive = true , compress = true , _extra = { "--partial" , "--inplace" , "--backup" , "--backup-dir=/root/data-fs/backup/.trash/current" , "--exclude=.git/" , "--exclude=**/node_modules/" , "--exclude=**/.venv/" , "--exclude=**/__pycache__/" , "--exclude=**/*.tmp" , "--exclude=**/.cache/" } } }
5. 回收站轮转脚本(保留 3 天)
新建 /usr/local/bin/cleanup-trash.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 #!/bin/bash set -euo pipefailTRASH_BASE="/root/data-fs/backup/.trash" TODAY=$(date +%F) mkdir -p "$TRASH_BASE /current" if [ -d "$TRASH_BASE /current" ] && [ -n "$(ls -A "$TRASH_BASE /current" 2>/dev/null) " ]; then mv "$TRASH_BASE /current" "$TRASH_BASE /$TODAY " fi mkdir -p "$TRASH_BASE /current" find "$TRASH_BASE " -maxdepth 1 -type d -regex '.*/[0-9]{4}-[0-9]{2}-[0-9]{2}$' -mtime +3 -exec rm -rf {} \;
赋权:
1 chmod +x /usr/local/bin/cleanup-trash.sh
6. 进程守护(supervisor)
安装:
1 apt update && apt install -y supervisor && apt install -y cron && apt install -y rsync && apt install -y lsyncd
配置 /etc/supervisor/conf.d/backup-stack.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 [program:lsyncd] command =/usr/bin/lsyncd -nodaemon /etc/lsyncd.conf.luaautorestart =true startsecs =3 startretries =10 redirect_stderr =true stdout_logfile =/var/log/supervisor/lsyncd.out.logstderr_logfile =/var/log/supervisor/lsyncd.err.log[program:cron] command =/usr/sbin/cron -fautorestart =true stdout_logfile =/var/log/supervisor/cron.out.logstderr_logfile =/var/log/supervisor/cron.err.log
新增定时任务 /etc/cron.d/cleanup-trash:
1 0 3 * * * root /usr/local/bin/cleanup-trash.sh
启动:
1 2 3 4 5 6 7 8 9 10 which supervisorctlls -l /etc/supervisor/supervisord.conf /etc/supervisord.conf 2>/dev/null/root/miniconda3/bin/supervisorctl -c /etc/supervisor/supervisord.conf reread /root/miniconda3/bin/supervisorctl -c /etc/supervisor/supervisord.conf update /root/miniconda3/bin/supervisorctl -c /etc/supervisor/supervisord.conf status /root/miniconda3/bin/supervisorctl -c /etc/supervisor/supervisord.conf start all
7. 日常巡检 checklist
下面的巡检也应该用上面的绝对地址,但我懒得改了。
进程状态
1 supervisorctl status lsyncd
应为 RUNNING
同步是否正常
1 cat /root/data-fs/lsyncd/lsyncd.status
实时测试
1 2 echo "test" > /root/data-tmp/projects/test.txtls /root/data-fs/backup/projects/ | grep test.txt
回收站检查
1 2 rm /root/data-tmp/projects/test.txtfind /root/data-fs/backup/.trash/current -name test.txt
每日快照
第二天早上看:
1 ls /root/data-fs/backup/.trash/
应该有 2025-09-30 这样的目录,只保留最近 3 天。
8. 整体工作流
Lsyncd:实时同步数据盘 → 资源盘
Rsync 参数:增量 + 回收站(删除/覆盖保护)
Cron 脚本:每日轮转回收站,只保留 3 天
Supervisor:守护进程,自动重启,SSH 退出不影响
✨ 这样,你已经搭建好了一套稳定、安全的同步与备份体系。不过,目前来看,在实例关闭之后重启,可能还需要手动启动同步程序,建议每次重新开机的时候检查一下,如果当前不存在同步流,就用下面的指令启动。
1 2 3 4 /root/miniconda3/bin/supervisord -c /etc/supervisor/supervisord.conf /root/miniconda3/bin/supervisorctl -c /etc/supervisor/supervisord.conf reread /root/miniconda3/bin/supervisorctl -c /etc/supervisor/supervisord.conf update /root/miniconda3/bin/supervisorctl -c /etc/supervisor/supervisord.conf start lsyncd