Lsyncd 配置与使用完整指南

基本上是和ChatGPT交流后得到的流程,因为涉及的对话很长还有bug调试,所以就直接让GPT总结了一下。以下均为AI总结生成。

(适用于:数据盘 → 资源盘,实时同步,3 天回收保护,容器内 supervisor 托管)


1. 背景与目标

  • 数据盘/root/data-tmp(SSD,高速但会随实例释放)

  • 资源盘/root/data-fs(持久化存储,适合保存代码/备份)

  • 需求

    1. 数据盘内容实时同步到资源盘
    2. 支持删除保护,至少保留 3 天的历史版本
    3. 支持进程守护,关闭 SSH 连接后依然运行

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 pipefail
TRASH_BASE="/root/data-fs/backup/.trash"
TODAY=$(date +%F)

mkdir -p "$TRASH_BASE/current"

# 把 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"

# 删除 3 天前的快照
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.lua
autorestart=true
startsecs=3
startretries=10
redirect_stderr=true
stdout_logfile=/var/log/supervisor/lsyncd.out.log
stderr_logfile=/var/log/supervisor/lsyncd.err.log

[program:cron]
command=/usr/sbin/cron -f
autorestart=true
stdout_logfile=/var/log/supervisor/cron.out.log
stderr_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
# 先确定supervisorctl位置和主配置位置
which supervisorctl
ls -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. 进程状态

    1
    supervisorctl status lsyncd

    应为 RUNNING

  2. 同步是否正常

    1
    cat /root/data-fs/lsyncd/lsyncd.status
  3. 实时测试

    1
    2
    echo "test" > /root/data-tmp/projects/test.txt
    ls /root/data-fs/backup/projects/ | grep test.txt
  4. 回收站检查

    1
    2
    rm /root/data-tmp/projects/test.txt
    find /root/data-fs/backup/.trash/current -name test.txt
  5. 每日快照
    第二天早上看:

    1
    ls /root/data-fs/backup/.trash/

    应该有 2025-09-30 这样的目录,只保留最近 3 天。


8. 整体工作流

  1. Lsyncd:实时同步数据盘 → 资源盘
  2. Rsync 参数:增量 + 回收站(删除/覆盖保护)
  3. Cron 脚本:每日轮转回收站,只保留 3 天
  4. 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