为了保证文件不丢失不泄露, 提升文件可用性, 本文将介绍我的整套备份解决方案, 你与以便未来的我参考.
软件
备份主要采用 Syncthing 跨设备实时同步文件作为备份, lsyncd 在同设备不同磁盘备份
要安装 Syncthing 和 lsyncd, 请运行
lsyncd 默认使用 rsync 复制文件,
rsync包是必要的
yay -S syncthing lsyncd rsync配置
创建 backup 用户和用户组
sudo groupadd -g 9999 backupsudo useradd -u 9999 -g 9999 -m -s /bin/bash backup配置 backup 用户的 Syncthing
本方法不适用 Syncthing 同步数据用途, 因为新的文件会被创建为
backup:backup, 导致权限配置失败
- 如果已经在当前用户配置过 Syncthing, 可以进行如下迁移
sudo mkdir -p /home/backup/.local/state/syncthingsudo cp -r ~/.local/state/syncthing /home/backup/.local/state/sudo chown backup:backup -R /home/backup/.local/state/syncthingsudo chmod 0700 -R /home/backup/.local/state/syncthing- 启动 Syncthing
-
配置 Syncthing 前往 http://127.0.0.1:8384 进行配置
-
修改需要 Syncthing 备份的文件夹的用户组为
backup若当前用户需要访问备份文件夹, 仅修改用户组
sudo chown :backup -R /path/to/backupsudo chmod 0770 -R /path/to/backupsudo chmod g+s /path/to/backup否则, 修改为 backup:backup 并改为 0700 权限, 以防止当前用户的不法应用扫盘
sudo chown backup:backup -R /path/to/backuponlysudo chmod 0700 -R /path/to/backuponlysudo chmod g+s /path/to/backuponly如果你要备份的文件在你的 HOME 目录, 请注意使用 ACL 控制权限, 否则可能导致权限与 SSH 等安全性要求高的程序无法使用
Terminal window sudo setfacl -m u:backup:x ~sudo setfacl -R -m u:backup:rX ~/path/to/backuponly
配置 lsyncd
创建如下配置文件
sudo chown :$USER /home/backupsudo chmod 0770 /home/backupsudo mkdir -p /home/backup/.config/lsyncdsudo chown $USER:backup -R /home/backup/.config/lsyncdsudo chmod 0770 -R /home/backup/.config/lsyncd/home/backup/.config/lsyncd/lsyncd.conf.luasettings { logfile = "/home/backup/.config/lsyncd/lsyncd.log", statusFile = "/home/backup/.config/lsyncd/lsyncd.status", nodaemon = false, -- 后台运行 insist = true, -- 即使启动时失败也继续重试}
sync { default.rsync, source = "/path/to/source", target = "/path/to/backup",
-- delay = second, -- 同步延迟, 避免重复写入 rsync = { archive = true, -- compress = true, -- 如果是网络同步, 推荐开启压缩 _extra = { -- 声明忽略文件 "--filter=:- .gitignore", "--filter=:- .stignore", "--filter=:- .kopiaignore" } }}
sync { default.rsync, source = "/path/to/source1", target = "/path/to/backup1",
rsync = { archive = true, _extra = { "--filter=:- .gitignore", "--filter=:- .stignore", "--filter=:- .kopiaignore" } }}
-- ...要在 Rsync 中不区分大小写地匹配路径, 请手动使用诸如
*.[Mm][Pp]4规则
要在前台测试配置文件, 请使用
sudo lsyncd -nodaemon /home/backup/.config/lsyncd/lsyncd.conf.lua配置 Systemd Unit
可以在如下路径写入
/home/backup/.config/systemd/user/lsyncd.service[Unit]Description=Lsyncd for backup userAfter=network.target
[Service]Type=simple# 显式指定配置文件路径ExecStart=/usr/bin/lsyncd -nodaemon %h/.config/lsyncd/lsyncd.conf.luaRestart=on-failure
[Install]WantedBy=default.target重载并启用服务 (需要在 backup 用户 Shell 环境 中运行)
systemctl --user daemon-reloadsystemctl --user enable --now lsyncd.service进入 backup 用户 Shell 环境
为了可以便捷得管理备份文件, 我们可以进入 backup 用户
可以设置如下别名
要打开 backup 仅用户可访问的路径, 请添加如下函数
local BACKUP_DEST_DIR="/tmp/.backup-export"
getbackup() { local SRC_FILE="$1"
local TARGET_PATH=$(sudo -u backup zsh -c ' DEST="'"$BACKUP_DEST_DIR"'" SRC="'"$SRC_FILE"'"
if [[ ! -f "$SRC" ]]; then exit 1; fi
mkdir -p "$DEST" 1>&2 chmod 777 "$DEST" 1>&2
FILENAME=$(basename "$SRC") TARGET="$DEST/$FILENAME"
cp -a "$SRC" "$TARGET" 1>&2 chmod 644 "$TARGET" 1>&2
echo "$TARGET" ')
if [[ -z "$TARGET_PATH" ]]; then return 1 fi
sudo chown $USER:$USER "$TARGET_PATH" 1>&2 chmod 700 "$TARGET_PATH" 1>&2
echo "$TARGET_PATH"}
clearbackup() { if [[ -z "$BACKUP_DEST_DIR" || ! -d "$BACKUP_DEST_DIR" ]]; then return 1 fi
rm -f -- "$BACKUP_DEST_DIR"/*}并使用诸如
command $(getbackup /path/to/file)或者, 可以使用 Yazi
sudo pacman -S yazialias browsebackup="sudo -Eu backup yazi"使用 Git 同步
#!/usr/bin/env bash
set -eu
PROJECT_DIR="$1"
if [ -z "$PROJECT_DIR" ]; then echo "Usage: $0 /path/to/your/repo" exit 1fi
cd "$PROJECT_DIR" || exit 1
if [[ -z $(git status --porcelain) ]]; then echo "No changes to commit." exit 0fi
# git pull --rebasegit pull
git add .
git commit -m "Auto-sync: $(date '+%Y-%m-%d %H:%M:%S %z')"
git push origin $(git rev-parse --abbrev-ref HEAD)
echo "[$(date)] Sync completed for $PROJECT_DIR"See Also
删除 Syncthing 历史记录文件
- 列出要删除的文件(夹), 确保没有重要数据被删除
.stversions是 Syncthing “文件版本控制” 所指定的 “历史版本路径”, 请与 Syncthing 配置相匹配
find /path/to/backup \( -name ".stversions" -type d \) -o \( -name ".sync-conflict-*" -type f \)- 删除文件
find /path/to/backup \( -name ".stversions" -type d -o -name ".sync-conflict-*" -type f \) -exec rm -rf {} +使用 Rmlint 移除或链接相同文件
- 安装
yay -S rmlint- 在目标目录下运行
rmlint
其会在当前工作文件夹生成 rmlint.json 与 rmlint.sh
- 运行
rmlint.sh
./rmlint.sh默认情况下是删除相同的文件副本, 可以使用:
-rl使用相对路径软链接-H使用硬链接-p在删除文件前再次校验 Hash,-c在支持 CoW 的文件系统上使用 CoW (reflink)-d(默认) 删除相同的文件副本
- 清理 Rmlint 缓存文件
rm rmlint.json