跳转到内容
搜索 AlmaLinux 文档

    浏览当前文档目录

    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。恢复时直接进对应日期目录,不需要「先全量再增量回放」。

    Terminal window
    rsync -a /var/tmp/src/ /var/tmp/bak/data/2026-10-20-01/
    du -sh /var/tmp/bak/data/2026-10-20-01
    592K /var/tmp/bak/data/2026-10-20-01

    改动后再做第二份:

    Terminal window
    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.bin
    du -sh /var/tmp/bak/data/2026-10-20-02
    142740409 /var/tmp/bak/data/2026-10-20-01/file1.bin
    142740409 /var/tmp/bak/data/2026-10-20-02/file1.bin
    788K /var/tmp/bak/data/2026-10-20-02

    inode 相同说明共享数据;du 单独看 02 是 788K,但整体只多出增量(第三份做完后总占用 792K)。

    Terminal window
    cat /var/tmp/bak/data/2026-10-20-02/notes.txt # v1 + v2
    cat /var/tmp/bak/data/2026-10-20-01/notes.txt # v1

    修改只影响之后的备份,旧目录仍是当时的内容——这正是「可以按日期恢复」的前提。

    过期清理:删旧目录才真正释放空间

    Section titled “过期清理:删旧目录才真正释放空间”

    删除最旧的备份目录:

    Terminal window
    rm -rf /var/tmp/bak/data/2026-10-20-01
    du -sh /var/tmp/bak/data

    硬链接的块只有在最后一个引用被删除时才释放。所以:

    • 删最旧的一天,只释放「那天独有」的块;
    • 中间某天被删,其余天仍通过硬链接保留数据;
    • 想快速腾空间,按日期从旧到新删,别乱删中间目录。

    实测里第三次备份后整体 792K,删除 file1.bin 不会让前两份变小——历史仍在。

    Terminal window
    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 “练习:三次备份 + 删除最旧 + 验证空间”
    Terminal window
    rm -rf /var/tmp/src /var/tmp/bak; mkdir -p /var/tmp/src /var/tmp/bak/data
    head -c 200000 /dev/urandom > /var/tmp/src/a.bin
    rsync -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/data
    stat -c '%i %n' /var/tmp/bak/data/0{1,2,3}/a.bin
    rm -rf /var/tmp/bak/data/01
    du -sh /var/tmp/bak/data

    检查:

    1. 三个目录里 a.bin 的 inode 全部相同
    2. du 总量约等于一份数据的大小
    3. 删除 01 后总量基本不变(其余两份仍引用同一份块)
    4. 再删 02、03 后空间才归零

    常见问题

    为什么删了一个备份目录空间没怎么变?

    硬链接的块由多个目录共同引用,只有最后一个引用删除后才释放。删最旧目录时,被其他备份共享的块仍占空间。

    备份目录能被 rsync 自己清理吗?

    不能自动清理。常见做法是保留 N 天,用脚本按日期删除最旧目录;删除顺序从旧到新,避免误删仍在被引用的中间日期。

    硬链接备份能防勒索软件吗?

    不能完全防。若勒索软件以可写权限挂载备份目录,硬链接文件也可能被改写;备份应放在独立介质或只读挂载上。