为了保证文件不丢失不泄露, 提升文件可用性, 本文将介绍我的整套备份解决方案, 你与以便未来的我参考.
软件
备份主要 Syncthing 跨设备(或跨磁盘)实时同步文件作为备份
yay -S syncthing配置
创建 backup 用户和用户组
sudo groupadd -g 9999 backupsudo useradd -u 9999 -g 9999 -m -s /bin/bash backup禁用 backup 用户 SSH
在 SSHD 配置文件
/etc/ssh/sshd_config写入
# disabled users for SSH loginDenyUsers backup并重启 SSHD 服务
sudo systemctl restart sshd.service若要尝试配置是否生效, 可以实时查看 SSHD 日志
Terminal window journalctl -u sshd -f并在另一个终端运行
Terminal window # 如果不是默认的 22 端口, 请使用参数 `-p <port>`然后可以在日志中看到类似如下内容代表配置已经生效了
sshd-session[xxxxxx]: User backup from 127.0.0.1 not allowed because listed in DenyUsers
启用自动运行 backup 用户的 Systemd Units
sudo loginctl enable-linger 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
跨磁盘备份
跨磁盘备份可以使用 当前用户 与 backup 用户分别运行一个 Syncthing, 然后在两个 Syncthing 间同步
如果需要在 backup 用户同用户下备份, 可以使用 mutagen 文件监听与同步工具:
yay -S mutagen.io-bin安装完成后, 可以在 backup 用户运行如下命令以创建同步
mutagen sync create --name=<name> -m=<sync-mode> <alpha> <beta> [--ignore=...]
alpha与beta是两个 endpoint, The reason that these endpoints aren’t termed “source” and “destination” is that Mutagen has multiple synchronization modes
要保证单项同步或其他同步方式, 请参阅 https://mutagen.io/documentation/synchronization/#modes
一个典型同步创建命令如下
mutagen sync create --name=cloudbackup-enc --mode=one-way-safe --ignore-vcs --ignore=".stfolder/" --ignore=".cache/" <source> <target>配置 Mutagen Systemd Unit
在如下位置
/home/backup/.config/systemd/user/mutagen.service写入
[Unit]Description=Mutagen Sync DaemonAfter=network.target
[Service]Type=forkingExecStart=/usr/bin/mutagen daemon startExecStop=/usr/bin/mutagen daemon stopRestart=always
[Install]WantedBy=default.target如果备份 (的 Alpha 或 Beta) 需要挂载, 请等待挂载服务避免 Mutagen 认为文件夹为空从而暂停同步, 例如:
After=network.target mount-backups.service mount-backups1.serviceRequires=network.target mount-backups.service mount-backups1.service
重载并启用该服务
systemctl daemon-reload --usersystemctl enable --user --now mutagen.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在当前 GUI 环境下以用户 backup 运行应用程式
- 授权当前的 X11 渲染环境访问权限 (Wayland 将回退到 XWayland)
xhost +SI:localuser:backup- 以
backup运行应用程式 (以dolphin为例)
kdesu需要安装kde-cli-tools包Terminal window sudo pacman -S kde-cli-tools
sudo -E /usr/lib/kf6/kdesu -u backup dolphinBTW, 要同步 Dolphin 配置
以及默认应用打开方式(打开方式可能无效) 到backup, 请使用Terminal window sudo cp ~/.config/dolphinrc ~/.config/mimeapps.list /home/backup/.config/sudo chown backup:backup /home/backup/.config/dolphinrc /home/backup/.config/mimeapps.listsudo chmod 770 /home/backup/.config/dolphinrc /home/backup/.config/mimeapps.list并重启 Dolphin
要设置 Dolphin 为深色主题并且不会在重启 Dolphin 后字体变为黑色, 可以使用
Terminal window # 设置颜色方案为 Breeze Darksudo -u backup kwriteconfig6 --file kdeglobals --group General --key ColorScheme BreezeDark# 设置全局主题为 Breeze Darksudo -u backup kwriteconfig6 --file klaunchrc --group General --key GlobalTheme BreezeDark# 刷新图标主题sudo -u backup kwriteconfig6 --file kdeglobals --group Icons --key Theme breeze-dark然后在 Dolphin 右上角菜单 “配置” > “窗口配色方案” 为 “Breeze Dark” (“Breeze 微风深色”)