cp -al 硬链接快照目录
用 cp -al 复制目录树,未变化的文件以硬链接指向源文件,几秒钟就能得到一份看起来完整的目录视图。后续快照的做法是先用 cp -al 链到上一份,再用 rsync 更新变化的内容,于是每份快照既有完整路径结构,又只占用变化部分的空间。它是手工搭出『rsnapshot 式』快照的最简方式。
基本信息
| 适用平台 | Linux/Unix(coreutils 与 rsync) |
|---|---|
| 关键参数 | cp -al 保留属性并建硬链接;rsync -aH 保留硬链接 |
| 限制 | 文件与快照必须在同一文件系统内 |
| 前提 | 数据以『写入即替换』或只读方式更新 |
典型使用场景
- 没有专业备份软件时,用脚本实现多份完整视图的低成本方案
- 网站静态文件与配置目录的历史版本保留
- 发布快照:每次上线前做一份目录快照,回滚只需切目录
- 对比变更:用 diff 比较两份快照,定位到底改了哪些文件
- 教学与验证:理解硬链接与 COW 思路的最直观示例
手工硬链接快照
手工硬链接快照
# 首次:整棵目录树做硬链接
cp -al /data /backup/snap-2026-10-12
# 次日:先链到上一份,再用 rsync 更新变化内容
cp -al /backup/snap-2026-10-12 /backup/snap-2026-10-13
rsync -aH --delete /data/ /backup/snap-2026-10-13/ # -H 保留硬链接结构
du -sh /backup/snap-* # 观察增量占用
ls -i /backup/snap-2026-10-13/README.md # 用 inode 号确认是否共享使用要点
| 要点 | 含义 | 风险 |
|---|---|---|
| 同一文件系统 | 硬链接不能跨设备 | 跨分区复制会变成实体拷贝,空间骤增 |
| 就地修改 | 直接改写文件内容会同时改变所有快照 | 日志与数据库文件不适用 |
| 删除文件 | 仅减少链接计数,空间不释放 | 空间按保留份数规划 |
| inode 共享 | 未变文件指向同一 inode | 清理时误删源目录会连带影响 |
硬链接共享 inode:对源目录文件的就地修改(追加写、应用改配置)会同时改变快照内容。该方案只适合只读数据,或者写入时通过重命名替换文件的场景,数据库与日志这类原地追加写的数据不适用。