目 录CONTENT

文章目录

PVE建设家庭Nextcloud备份方案

醉酒的行者
2026-08-30 / 0 评论 / 0 点赞 / 2 阅读 / 0 字

PVE建设家庭Nextcloud备份方案

盘A LVM-Thin 存 VM + 盘B ext4 borg 备份 | SSH 模式 | 模板 + 数据增量 | 完整部署与恢复手册

目录

零、方案对比与选型分析(7 种方案全评测)

0.1 需求与约束(选型前提)

项目 现状
系统盘 内置 2×1TB ZFS mirror(rpool),PVE 系统 + DB VM,实时冗余 RPO=0
数据盘 盘A + 盘B 两块 4TB,装在同一个 USB 硬盘盒仓内连接 PVE
核心负载 Nextcloud VM 单盘 1.2TB(系统+数据不拆分),DB 已分离在 rpool
备份对象 NC 用户数据 1.2TB(每天真实变化量仅几 GB);系统属静态资产
硬约束 ① 1.2TB 每日全量代价不可接受 ② 盘B 掉线不能影响 PVE 启动 ③ 盘A 需精简置备(多个大 VM)

0.2 七种方案总览对比

方案 盘A/盘B 用法 RPO 防误删/勒索 每日备份代价 USB 断线后果 结论
A. ZFS mirror(原始架构) 两盘组 mirror 实时同步 ≈0 ❌ 错误实时同步 无备份(只有镜像) 最差:pool SUSPENDED / 单盘掉线触发全盘 resilver,两盘先后掉线需人工仲裁 ❌ 淘汰:共享故障域 + ZFS 对 USB 链路极敏感
B. LVM-Thin + ext4
+ vzdump 全量
盘A LVM-Thin 存 VM
盘B ext4 存 vzdump
24h ✅ 时间隔离 ❌ NC 1.2TB 每次全量打包,代价不可接受 可接受:VM 崩溃重启、备份失败一次 ⚠️ 骨架正确,但备份引擎需换
C. 双 ext4 + qcow2(方案D) 两盘都 ext4 Directory
VM 用 qcow2 文件
24h ✅ 时间隔离 ❌ 同样全量问题;qcow2 性能再降 5-15% 同 B ❌ 淘汰:为 df 可见性牺牲性能,且全量问题未解
D. BTRFS ×2 两盘 BTRFS(校验+压缩) 24h ✅ 时间隔离 ❌ 同样全量问题 同 B ❌ 淘汰:PVE 生产环境成熟度存疑,收益不抵风险
E. PBS 增量备份 盘A LVM-Thin
盘B 跑 PBS 容器做块级去重增量
24h ✅ 时间隔离 ✅ 只传变化块 同 B,但 PBS 容器也依赖 USB 盘健康 ⚠️ 备选:整机增量优秀,但恢复粒度是整盘,无法单文件恢复,且多维护一个 PBS 容器
F. NC 拆盘分层 系统盘→rpool(vzdump)
数据盘→盘A(borg 增量)
24h ✅ 时间隔离 ✅ 只传变化文件 同 B ⚠️ 可行但多一次 1.2TB 迁移 + 双盘双策略维护;恢复时需 DB/数据时间点对齐意识
G. LVM-Thin + borg SSH 增量 + 空模板
★ 最终选定
盘A LVM-Thin(NC 单盘不拆)
盘B ext4 borg 仓库 + 模板
24h ✅ 时间隔离 + AES-256 加密 ✅ 首次全量后每天几 GB 最轻:VM 重启、备份失败一次,无 resilver 放大 选定

0.3 关键决策逻辑(为什么是 G)

决策点 1:备份的敌人是「每天重复打包不变数据」
         → 1.2TB 全量(B/C/D)全部出局,必须用块级增量 → PBS / borg 二选一

决策点 2:恢复粒度
         → PBS 整盘恢复,误删一个文件也要恢复整盘
         → borg 可 mount 单文件秒取 + 加密 + 校验 + prune 全家桶
         → 选 borg

决策点 3:传输方式
         → NFS 有 flock/缓存一致性隐患(borg 官方明确不推荐仓库放 NFS)
         → SSH 是 borg 原生远程协议,加密且可靠 → 选 SSH

决策点 4:NC 系统盘要不要备份
         → 系统是静态资产,坏了用空模板 10 分钟拉起,occ files:scan 对齐索引即可
         → 省掉拆盘迁移和双备份策略 → 不拆盘、系统不每日备份、只备数据目录

决策点 5:盘A 文件系统
         → 多个 1TB+ 大 VM → 必须精简置备 → LVM-Thin(raw + thin,性能最优)
         → 盘A 在 df 中不可见是设计使然,用 pvesm status / lvs 监控

决策点 6:USB 硬盘盒共同故障域
         → 桥接芯片/电源/线缆任一故障 = 盘A 盘B 同时离线,任何方案都无法消除
         → 只能缓解:冷备盘 + UAS/休眠加固 + nofail + (可选)第三副本异地
         → 该约束下 ZFS mirror 是最差选择(resilver 放大 + 数据仲裁风险)

0.4 淘汰方案的关键理由速记

被淘汰 一句话理由
ZFS mirror RPO=0 的收益 < USB 链路下 resilver/仲裁/共享故障域的风险;且无时间隔离,勒索/误删直接同步到备份盘
vzdump 全量 1.2TB × 每天打包一次,时间和空间都不可接受
双 ext4 + qcow2 性能损失买到的只有 df 可见性,监控需求用 pvesm status 即可满足
BTRFS 单盘 BTRFS 无镜像时校验只能报错不能自愈;PVE 生产案例少
PBS 整机粒度恢复笨重;对本场景「只在乎 NC 数据」属杀鸡用牛刀
NC 拆盘 多一次 1.2TB 迁移 + 双策略维护;空模板方案已覆盖系统恢复需求

选定方案的哲学: 把「系统」和「数据」区别对待——系统是静态的,用模板兜底;数据是动态的,用 borg 增量。盘B 上的 borg 仓库是唯一真相源:盘在 + 密码在,一切可重建。

一、最终架构总览

┌─────────────────────────────────────────────────┐
│ rpool ZFS mirror (2×1TB)                        │
│   ├─ PVE 系统                                   │
│   └─ DB VM(数据库)          → 不备份(ZFS 实时冗余 RPO=0)│
└─────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────┐
│ data2 盘A (4TB LVM-Thin)  vm-storage           │
│   └─ NC VM(单盘:系统+数据 1.2TB)              │
│   └─ 其他小 VM                                  │
└─────────────────────────────────────────────────┘
         │ borg 增量(SSH 加密通道)
         ▼
┌─────────────────────────────────────────────────┐
│ data2 盘B (4TB ext4)  /mnt/backup  → backup 存储│
│   ├─ borg 仓库(AES-256 加密,repokey 模式)      │
│   ├─ NC 空模板(vzdump,偶尔更新)               │
│   └─ ISO / 容器模板                             │
└─────────────────────────────────────────────────┘

核心设计原则

组件 策略 理由
DB VM 不备份 rpool ZFS mirror 实时冗余,单盘故障零丢失(RPO=0)
NC 系统/程序 静态模板(vzdump 存一份,大版本升级后更新) 系统是静态的,备一次就够;坏了恢复模板 10 分钟
NC 用户数据 borg 每日增量(SSH 模式 → 盘B) 数据是动态的;1.2TB 首次全量后,每天只传变化块(几 GB)
其他小 VM vzdump 每日全量(可选) 体积小,全量代价低

备份时间线

02:00  vzdump 备份其他小 VM(snapshot 模式不停机)→ 盘B
02:15  borg 增量备份 NC 数据目录(NC VM 内 cron)→ SSH → 盘B
周日   borg check 完整性校验 + borg compact 空间回收

方案的本质: 盘B 上的 borg 仓库是 NC 数据的唯一真相源。只要盘B 完好 + 密码在手,任何故障都能恢复。系统坏了恢复模板,数据坏了 borg extract。

二、PVE 侧部署(PVE 宿主机)

USB 硬盘盒部署的特别注意事项(盘A/盘B 同盒 USB 连接):

  1. 共同故障域:两块盘共享盒内桥接芯片、电源、线缆和 PVE 的一个 USB 口。任一故障 = 数据(盘A)和备份(盘B)同时离线。建议至少准备一块冷备盘,重要数据考虑第三方副本(云/异地)。
  2. 启动安全:fstab 必须带 nofail(本方案已配置),否则 USB 盒未上电时 PVE 重启会卡在 emergency mode。
  3. USB 自动休眠:内核默认对 USB 设备节能,可能导致掉盘。部署后在 PVE 上执行下面的「USB 稳定性加固」命令。
  4. 硬盘休眠:硬盘盒自身的自动休眠(通常 10 分钟无 I/O 后停转)会造成首次 I/O 延迟数十秒、甚至桥接芯片复位。务必关闭。

步骤 0(USB 部署必做):USB 稳定性加固

# 1. 确认桥接走 UAS(现代盒子标准,性能好且稳定)
lsusb -t
# 看 Driver=uas 即正常;若是 usb-storage 建议换盒子或加 quirks

# 2. 禁用 USB 自动挂起(防止内核休眠 USB 设备导致掉盘)
echo -1 > /sys/module/usbcore/parameters/autosuspend
# 永久生效:内核启动参数
sed -i 's/^GRUB_CMDLINE_LINUX_DEFAULT="/GRUB_CMDLINE_LINUX_DEFAULT="usbcore.autosuspend=-1 /' /etc/default/grub
update-grub

# 3. 禁止硬盘自动休眠停转(针对盒内两块盘)
hdparm -S 0 /dev/disk/by-id/wwn-0x5000cca2AAAA
hdparm -S 0 /dev/disk/by-id/wwn-0x5000cca2BBBB
# 写入 /etc/hdparm.conf 持久化(部分 USB 桥接不支持,报错则忽略,
# 改用盒子的物理开关/跳线或保持定时备份 I/O 唤醒)

# 4. USB 掉盘监控(写入 cron,每 5 分钟检查,掉线写系统日志)
cat > /usr/local/bin/check-usb-disks.sh <<'EOF'
#!/bin/bash
for d in wwn-0x5000cca2AAAA wwn-0x5000cca2BBBB; do
  if [ ! -e "/dev/disk/by-id/$d" ]; then
    logger -p user.error "USB disk $d OFFLINE!"
  fi
done
EOF
chmod +x /usr/local/bin/check-usb-disks.sh
# crontab -e 加入:
# */5 * * * * /usr/local/bin/check-usb-disks.sh

步骤 1:确认磁盘设备名

# 找到两块 4TB 盘,记录 by-id(防重启盘符变化,USB 下尤其重要)
lsblk
ls -l /dev/disk/by-id/ | grep wwn-

# USB 盒接法:确认两块盘都能看到 wwn-(桥接透传 SMART/WWN)
# 如果 by-id 下只有 usb-... 名字没有 wwn-,用 usb- 名字也可以(更长但同样稳定)

# 假设:
# 盘A = /dev/disk/by-id/wwn-0x5000cca2AAAA
# 盘B = /dev/disk/by-id/wwn-0x5000cca2BBBB

步骤 2:盘A 创建 LVM-Thin(VM 存储)

DISK_A=/dev/disk/by-id/wwn-0x5000cca2AAAA

# 擦除旧签名(确认无数据!)
wipefs -a $DISK_A

# 创建 LVM-Thin
pvcreate -f $DISK_A
vgcreate -f vg_vm $DISK_A
lvcreate -l 100%FREE -T vg_vm/thinpool

# 注册到 PVE
pvesm add lvmthin vm-storage --vgname vg_vm --thinpool thinpool
pvesm set vm-storage --content images,rootdir

# 验证
pvesm status   # 应有 vm-storage,类型 lvmthin

注意: LVM-Thin 是块设备,df -h 看不到是正常的。空间用量用 lvs vg_vm/thinpool 的 Data% 列查看。

步骤 3:盘B 创建 ext4(备份存储)

DISK_B=/dev/disk/by-id/wwn-0x5000cca2BBBB

wipefs -a $DISK_B
mkfs.ext4 $DISK_B

# 挂载 + fstab 持久化(nofail: 盘B 掉线时 PVE 仍正常启动,不会卡 emergency mode)
mkdir -p /mnt/backup
UUID=$(blkid -s UUID -o value $DISK_B)
echo "UUID=$UUID /mnt/backup ext4 defaults,nofail,x-systemd.device-timeout=10 0 2" >> /etc/fstab
mount -a
df -h /mnt/backup   # 现在能看到 4TB

# 如果已经部署过,把 fstab 里的 defaults 改成 defaults,nofail,x-systemd.device-timeout=10
sed -i 's#/mnt/backup ext4 defaults #/mnt/backup ext4 defaults,nofail,x-systemd.device-timeout=10 #' /etc/fstab
mount -a

# 注册到 PVE(放备份 + ISO + 模板)
pvesm add dir backup --path /mnt/backup --content backup,iso,vztmpl
pvesm status   # 应有 backup,类型 dir

步骤 4:配置 borg server(SSH 模式)

# 安装 borg
apt install borgbackup

# 创建专用用户(不用 root,安全)
useradd -m borg
mkdir -p /mnt/backup/nc-repo
chown borg:borg /mnt/backup/nc-repo

# borg 用户对备份根目录需要可进入
chmod 755 /mnt/backup

为什么用 SSH 而不是 NFS: borg 的锁文件和 segment 操作在 NFS 上有可靠性隐患(flock 不完善、缓存一致性)。SSH 是 borg 官方推荐的远程仓库访问方式,且传输先去重压缩,性能更好。

步骤 5:vzdump 定时备份其他小 VM(可选)

# 若盘A 上除 NC 外还有其他 VM,配置每日备份
# 只备份小 VM,NC VM 和 DB VM 不勾选
pvesh create /cluster/backup \
  --storage backup \
  --schedule "02:00" \
  --mode snapshot \
  --compress zstd \
  --keep-last 7 --keep-weekly 4 \
  --vmid "102,103"   # 其他小 VM 的 ID,不含 NC/DB

三、NC VM 侧部署(Nextcloud VM 内)

步骤 1:确认数据目录路径

# Snap 安装
ls /var/snap/nextcloud/common/nextcloud/data/

# 手动安装:查 config.php 里的 datadirectory
grep datadirectory /var/www/nextcloud/config/config.php
# 通常是 /var/www/nextcloud/data/

步骤 2:安装 borg + 配 SSH 免密

apt install borgbackup

# 生成专用密钥
ssh-keygen -t ed25519 -f /root/.ssh/borg_key -N ""

# 把公钥传到 PVE 的 borg 用户
ssh-copy-id -i /root/.ssh/borg_key borg@pve-host

# 测试免密
ssh -i /root/.ssh/borg_key borg@pve-host "echo ok"

步骤 3:生成密码 + 初始化仓库

# 生成强密码并保存到文件 + 打印出来记录到密码管理器
openssl rand -base64 32 > /etc/borg-passphrase
chmod 600 /etc/borg-passphrase
cat /etc/borg-passphrase   # ⚠️ 抄下来存到密码管理器!丢了数据全没

# 初始化加密仓库(repokey 模式:密钥在仓库内,密码保护)
export BORG_PASSPHRASE=$(cat /etc/borg-passphrase)
borg init --encryption=repokey borg@pve-host:/mnt/backup/nc-repo

密码是唯一恢复凭证: repokey 模式下密钥存在仓库里但被密码加密。密码丢失 = 所有备份永久不可读。务必存到密码管理器 / 另一台设备 / 纸质抄录。

步骤 4:首次全量备份

# 首次 1.2TB,耗时数小时,建议 tmux 内运行
tmux new -s borg-init

export BORG_PASSPHRASE=$(cat /etc/borg-passphrase)
export BORG_RSH="ssh -i /root/.ssh/borg_key"

borg create --stats --progress \
  --exclude '*/files_versions/*' \
  --exclude '*/files_trashbin/*' \
  --exclude '*/cache/*' \
  --exclude '*/thumbnails/*' \
  borg@pve-host:/mnt/backup/nc-repo::$(date +%F) \
  /var/snap/nextcloud/common/nextcloud/data

# 完成后查看
borg list borg@pve-host:/mnt/backup/nc-repo

步骤 5:创建每日备份脚本

# /usr/local/bin/nc-borg-backup.sh
#!/bin/bash
set -e

export BORG_PASSPHRASE=$(cat /etc/borg-passphrase)
export BORG_RSH="ssh -i /root/.ssh/borg_key"
REPO=borg@pve-host:/mnt/backup/nc-repo
DATA_DIR=/var/snap/nextcloud/common/nextcloud/data
LOG=/var/log/nc-borg-backup.log

echo "=== $(date) backup start ===" >> $LOG

# 每日增量备份
borg create --stats \
  --exclude "$DATA_DIR/*/files_versions/*" \
  --exclude "$DATA_DIR/*/files_trashbin/*" \
  --exclude "$DATA_DIR/*/cache/*" \
  --exclude "$DATA_DIR/*/thumbnails/*" \
  $REPO::$(date +%F) \
  $DATA_DIR >> $LOG 2>&1

# 保留策略:7 天 + 4 周
borg prune --keep-daily 7 --keep-weekly 4 $REPO >> $LOG 2>&1

# 周日:完整性校验 + 空间回收
if [ "$(date +%u)" = "7" ]; then
  borg check --verify-data $REPO >> $LOG 2>&1
  borg compact $REPO >> $LOG 2>&1
fi

echo "=== $(date) backup done ===" >> $LOG
chmod +x /usr/local/bin/nc-borg-backup.sh

# 测试运行一次
/usr/local/bin/nc-borg-backup.sh
tail /var/log/nc-borg-backup.log

步骤 6:配置 cron 定时

crontab -e
# 添加:
# 15 2 * * * /usr/local/bin/nc-borg-backup.sh

# 验证次日是否执行
grep "backup done" /var/log/nc-borg-backup.log

步骤 7:验证增量效果

# 模拟少量数据变化
dd if=/dev/urandom of=$DATA_DIR/admin/files/test-100mb.bin bs=1M count=100

# 再跑一次备份,观察传输量
/usr/local/bin/nc-borg-backup.sh
grep "Deduplicated size" /var/log/nc-borg-backup.log | tail -1
# 应显示 ~100MB 左右,而不是 1.2TB → 增量生效

rm $DATA_DIR/admin/files/test-100mb.bin

四、NC 空模板管理

制作模板

# 方法 1:克隆一个干净的 NC VM 作为模板(推荐)
# 先把 NC VM 克隆一份,清掉用户数据,保留系统+程序
qm clone 101 900 --name nc-template
# 启动 900,清空数据目录后关机
qm shutdown 900
qm template 900   # 转为模板(可选)

# 方法 2:vzdump 导出空 NC 到盘B
vzdump 101 --storage backup --mode stop
# 注意:这会备份整个 1.2TB。建议先克隆出空模板再对模板做 vzdump(只有几十 GB)

什么时候更新模板

场景 原因
Nextcloud 大版本升级(27→28) 程序变了
PHP 版本升级 运行环境变了
修改 NC 配置 / 加插件 配置不在数据目录里
操作系统大版本升级 系统环境变了

五、恢复手册(4 种场景)

场景 0(USB 部署专属):USB 盒瞬时掉线(最常见,非盘坏)

现象: USB 口/桥接芯片/供电抖动,盘A+盘B 同时消失又回来。盘A 是 LVM-Thin,VM 会立刻 I/O 错误崩溃;盘B 挂载点失效。

恢复步骤(PVE 宿主机):

# 1. 确认盘回来了
ls -l /dev/disk/by-id/ | grep wwn-

# 2. 恢复 LVM(掉线时 VG 变 stale)
vgchange -an vg_vm 2>/dev/null
vgscan --mknodes
vgchange -ay vg_vm

# 3. 恢复盘B 挂载
mount /mnt/backup

# 4. 重启受影响的 VM(NC VM 会因 I/O 错误停机)
qm start <NC_VMID>

# 5. 检查 borg 仓库完整性(如果掉线发生在备份进行中)
# 在 NC VM 内:borg check --repository-only borg@pve-host:/mnt/backup/nc-repo

# 频繁掉线 = 换线缆/换USB口/换独立供电的盒子,不要带病运行

场景 1:误删单个文件 / 文件被加密

# NC VM 内,把某个快照挂载出来浏览
export BORG_PASSPHRASE=$(cat /etc/borg-passphrase)
export BORG_RSH="ssh -i /root/.ssh/borg_key"

mkdir -p /mnt/borg-restore
borg mount borg@pve-host:/mnt/backup/nc-repo /mnt/borg-restore

# 浏览所有快照,找到误删文件
ls /mnt/borg-restore/
ls /mnt/borg-restore/2026-08-15//var/snap/.../data/admin/files/

# 复制回来
cp /mnt/borg-restore/2026-08-15/.../admin/files/重要文件.pdf $DATA_DIR/admin/files/
chown www-data:www-data $DATA_DIR/admin/files/重要文件.pdf

# 卸载
borg umount /mnt/borg-restore

# NC 里扫描新文件(只扫该用户,很快)
occ files:scan admin

场景 2:数据目录损坏,DB 完好

# 1. 修复或换数据盘后,恢复最新快照
export BORG_PASSPHRASE=$(cat /etc/borg-passphrase)
export BORG_RSH="ssh -i /root/.ssh/borg_key"

cd $DATA_DIR
borg extract --progress borg@pve-host:/mnt/backup/nc-repo::2026-08-17

# 2. 修正权限
chown -R www-data:www-data $DATA_DIR

# 3. 对齐数据库(磁盘 → DB)
occ files:scan --all

# 4. 清理幽灵记录(DB 有但磁盘没有的)
# ⚠️ DB 可能比备份新(记录到故障瞬间),残留记录会让网页出现打不开的文件
occ files:cleanup

# 5. 通知用户打开同步客户端,回补备份后~故障前的文件

场景 3:盘A 彻底损坏(NC VM 全没)

# ── PVE 上 ──
# 1. 换新盘,重建 LVM-Thin
wipefs -a /dev/disk/by-id/新盘
pvcreate /dev/disk/by-id/新盘
vgcreate -f vg_vm /dev/disk/by-id/新盘
lvcreate -l 100%FREE -T vg_vm/thinpool
# vm-storage 若已从 PVE 配置中删除,重新注册:
pvesm add lvmthin vm-storage --vgname vg_vm --thinpool thinpool
pvesm set vm-storage --content images,rootdir

# 2. 从空模板恢复 NC 系统盘
# Web UI:local storage → 备份 → 选 nc-template 的 vzdump → 恢复
# 或命令行:
qmrestore /mnt/backup/dump/vzdump-qemu-900-*.vma.zst 101 --storage vm-storage

# ── NC VM 内 ──
# 3. 装 borg + 配 SSH(同部署步骤 2)
apt install borgbackup
ssh-keygen -t ed25519 -f /root/.ssh/borg_key -N ""
ssh-copy-id -i /root/.ssh/borg_key borg@pve-host

# 4. 恢复密码(从密码管理器取回)
echo '你的密码' > /etc/borg-passphrase
chmod 600 /etc/borg-passphrase

# 5. 验证仓库可读
export BORG_PASSPHRASE=$(cat /etc/borg-passphrase)
export BORG_RSH="ssh -i /root/.ssh/borg_key"
borg list borg@pve-host:/mnt/backup/nc-repo

# 6. 恢复数据
cd $DATA_DIR
borg extract --progress borg@pve-host:/mnt/backup/nc-repo::最新快照
chown -R www-data:www-data $DATA_DIR

# 7. 重建文件索引(空模板的 DB 没有文件记录)
occ files:scan --all

# 8. 恢复备份脚本 + cron(同部署步骤 5-6)

场景 4:盘B 损坏(备份仓库丢失)

# 当前数据无影响(都在盘A),但进入零备份裸奔期,尽快:

# 1. 换新盘,重建 ext4
wipefs -a /dev/disk/by-id/新盘B
mkfs.ext4 /dev/disk/by-id/新盘B
# fstab 更新 UUID,mount -a

# 2. 重建 borg 仓库
mkdir -p /mnt/backup/nc-repo
chown borg:borg /mnt/backup/nc-repo

# 3. NC VM 内重新初始化 + 全量备份
export BORG_PASSPHRASE=$(cat /etc/borg-passphrase)
borg init --encryption=repokey borg@pve-host:/mnt/backup/nc-repo
/usr/local/bin/nc-borg-backup.sh   # 重新全量 1.2TB(数小时)

盘B 是备份唯一副本,本身是单点故障。 若想消除裸奔风险,可加一块盘C 做 borg 双仓库(每周 borg transfer 复制一份),或定期 borg transfer 到异地 NAS。

六、日常运维清单

频率 检查项 命令
每日 备份日志无报错 grep "backup done" /var/log/nc-borg-backup.log | tail -1
每周 快照列表完整 borg list borg@pve-host:/mnt/backup/nc-repo
每周 盘B 剩余空间 df -h /mnt/backup
每周 盘A 精简置备用量 lvs vg_vm/thinpool(Data% > 80% 需清理)
每周日 完整性校验(脚本自动) borg check --verify-data
每月 硬盘 SMART 健康 smartctl -a /dev/disk/by-id/<id>
每季度 恢复演练 borg mount 恢复几个文件到临时目录验证
NC 升级后 更新空模板 重新克隆 / vzdump 空模板

七、关键概念速查

borg 加密(repokey 模式)

说明
数据加密 AES-256,盘B 上全是密文(文件名也加密)
密钥位置 仓库 config 文件内(盘B 上),被密码加密
恢复条件 盘B 完好 + 密码在手,其他一切可重建
密码丢失 所有备份永久不可读,务必多重备份密码

删除同步机制(borg 不自动删)

源端删文件 → 新快照不含它,旧快照仍保留(可恢复误删)
         → prune 删除旧快照后,独占数据块才释放
         → borg compact 真正回收空间
整个链条约 1~4 周,期间随时可恢复误删文件(这是保护,不是缺陷)

files:scan 与 files:cleanup

命令 方向 作用
occ files:scan --all 磁盘 → DB 把磁盘上的文件写入/更新 DB 索引(只加不删)
occ files:cleanup DB → 磁盘 删除 DB 中磁盘上不存在的幽灵记录

规律: 文件通过 NC 以外方式变动(borg 恢复、手动拷贝)后,需要 scan;怀疑 DB 有幽灵记录时,跑 cleanup。

保留策略(Keep Last 7 + Weekly 4)

最近 7 天:每天一个恢复点(细粒度,恢复"昨天的文件")
7天~4周:每周一个恢复点(粗粒度,恢复"三周前的状态")
超过 4 周:自动删除
盘B 上最多同时存在 10 份快照(去重存储,实际占用远小于 10×全量)

RPO 对照

数据 保护方式 RPO
DB(rpool ZFS mirror) 实时镜像 ≈ 0
NC 数据(盘A → 盘B borg) 每日增量 最多 24h(可加密度缩短)
NC 系统(空模板) 静态快照 模板更新周期

一句话总结: DB 靠 ZFS 实时冗余;NC 系统靠空模板;NC 数据靠 borg 每日增量到盘B。恢复时:模板拉起系统 + borg extract 拉回数据 + scan/cleanup 对齐索引。

0

评论区