AlmaLinux 10:硬链接增量备份与过期清理
在 AlmaLinux 10.2 容器(rsync 3.5.0)中实测三次 --link-dest 备份、inode 对比、删除文件后的历史保留、以及 du 的实际占用。日志:plans/content-expansion/evidence/logs/alma-rsync-incremental.log。
策略:每天一个目录,保留 N 天
Section titled “策略:每天一个目录,保留 N 天”/backup/data/2026-10-20//backup/data/2026-10-19/ ← --link-dest 指向前一天每天跑一次 rsync -a --link-dest=前一天 源/ 目标/,未变化的文件共享 inode。恢复时直接进对应日期目录,不需要「先全量再增量回放」。
实测:三次备份的占用
Section titled “实测:三次备份的占用”rsync -a /var/tmp/src/ /var/tmp/bak/data/2026-10-20-01/du -sh /var/tmp/bak/data/2026-10-20-01592K /var/tmp/bak/data/2026-10-20-01改动后再做第二份:
rsync -a --link-dest=/var/tmp/bak/data/2026-10-20-01 \ /var/tmp/src/ /var/tmp/bak/data/2026-10-20-02/stat -c '%i %n' /var/tmp/bak/data/2026-10-20-01/file1.bin /var/tmp/bak/data/2026-10-20-02/file1.bindu -sh /var/tmp/bak/data/2026-10-20-02142740409 /var/tmp/bak/data/2026-10-20-01/file1.bin142740409 /var/tmp/bak/data/2026-10-20-02/file1.bin788K /var/tmp/bak/data/2026-10-20-02inode 相同说明共享数据;du 单独看 02 是 788K,但整体只多出增量(第三份做完后总占用 792K)。
时间点语义:旧备份不变
Section titled “时间点语义:旧备份不变”cat /var/tmp/bak/data/2026-10-20-02/notes.txt # v1 + v2cat /var/tmp/bak/data/2026-10-20-01/notes.txt # v1修改只影响之后的备份,旧目录仍是当时的内容——这正是「可以按日期恢复」的前提。
过期清理:删旧目录才真正释放空间
Section titled “过期清理:删旧目录才真正释放空间”删除最旧的备份目录:
rm -rf /var/tmp/bak/data/2026-10-20-01du -sh /var/tmp/bak/data硬链接的块只有在最后一个引用被删除时才释放。所以:
- 删最旧的一天,只释放「那天独有」的块;
- 中间某天被删,其余天仍通过硬链接保留数据;
- 想快速腾空间,按日期从旧到新删,别乱删中间目录。
实测里第三次备份后整体 792K,删除 file1.bin 不会让前两份变小——历史仍在。
恢复:按日期取目录
Section titled “恢复:按日期取目录”rsync -a /var/tmp/bak/data/2026-10-20-01/ /restore/path/或者单文件:cp /var/tmp/bak/data/2026-10-20-01/notes.txt /restore/。因为每个目录都是完整视图,恢复不需要 rsync 参与。
--link-dest用相对路径:按目标目录解析,容易链到错误位置;- 源结尾少写斜杠:
src会把目录本身复制进去,得到目标/src/...; - 跨文件系统:硬链接失效,退化为完整复制,空间暴涨;
- 保留策略用
find -mtime删:先确认要删的是最旧目录,删中间目录不会立刻省空间。
练习:三次备份 + 删除最旧 + 验证空间
Section titled “练习:三次备份 + 删除最旧 + 验证空间”rm -rf /var/tmp/src /var/tmp/bak; mkdir -p /var/tmp/src /var/tmp/bak/datahead -c 200000 /dev/urandom > /var/tmp/src/a.binrsync -a /var/tmp/src/ /var/tmp/bak/data/01/rsync -a --link-dest=/var/tmp/bak/data/01/ /var/tmp/src/ /var/tmp/bak/data/02/rsync -a --link-dest=/var/tmp/bak/data/02/ /var/tmp/src/ /var/tmp/bak/data/03/du -sh /var/tmp/bak/datastat -c '%i %n' /var/tmp/bak/data/0{1,2,3}/a.binrm -rf /var/tmp/bak/data/01du -sh /var/tmp/bak/data检查:
- 三个目录里
a.bin的 inode 全部相同 du总量约等于一份数据的大小- 删除 01 后总量基本不变(其余两份仍引用同一份块)
- 再删 02、03 后空间才归零
常见问题
为什么删了一个备份目录空间没怎么变?
硬链接的块由多个目录共同引用,只有最后一个引用删除后才释放。删最旧目录时,被其他备份共享的块仍占空间。
备份目录能被 rsync 自己清理吗?
不能自动清理。常见做法是保留 N 天,用脚本按日期删除最旧目录;删除顺序从旧到新,避免误删仍在被引用的中间日期。
硬链接备份能防勒索软件吗?
不能完全防。若勒索软件以可写权限挂载备份目录,硬链接文件也可能被改写;备份应放在独立介质或只读挂载上。
- 存储扩容:LVM 扩容
- 定时任务:systemd timer
- 日志轮转:logrotate 实战