cp -al 硬链接快照原理
cp -al 能在极短时间内生成目录快照:-a 保留属性与结构(含软链),-l 用硬链接代替复制数据,所以快照与源共享同一份数据块,只有后续被改写过的文件才额外占用空间。配合 rsync --delete 把新快照更新成“当天真实状态”,就能用很小的空间代价保留逐日快照。代价是同一 inode 被多处引用:任何原地修改都会同时改到历史版本。
基本信息
| 适用平台 | Linux 与类 Unix(GNU coreutils 的 cp) |
|---|---|
| 关键选项 | -a 归档保留属性、-l 硬链接、-i 覆盖前确认 |
| 配套工具 | rsync -a --delete(不要加 --inplace) |
| 观察手段 | df -h、du -sh --count-links、ls -li 看 inode |
| 硬性限制 | 源与目标必须在同一文件系统,硬链接不能跨挂载点 |
典型使用场景
- 每天留一份站点或数据目录快照,出问题秒级回滚
- 发布前建快照,便于比对与恢复
- 低成本备份方案的前置步骤(快照后交给去重备份工具)
- 对比两天目录差异(diff -r 直接比快照)
- 小容量磁盘上做多版本留存
快照与更新
快照与更新
cp -al /backup/site-2026-10-11 /backup/site-2026-10-12 # 秒级生成快照,几乎不占空间
rsync -a --delete /data/site/ /backup/site-2026-10-12/ # 把新快照更新为今天的真实状态
df -h /backup # 观察总占用是否只小幅增长
du -sh --count-links /backup/site-2026-10-12 # 含链接计数,看清真实占用
diff -r /backup/site-2026-10-11 /backup/site-2026-10-12 | head # 比对两天差异
ls -li /backup/site-2026-10-12/index.html # 用 inode 号确认与源共享同一份数据原理与边界
| 要点 | 说明 | 注意 |
|---|---|---|
| 硬链接共享 inode | 快照与源指向同一数据块 | 删除任一侧目录项不影响另一侧数据 |
| 空间只在改写时增长 | rsync 替换文件会写新 inode | 用 >> 追加会同时改到快照里的同一份数据 |
| 必须同一文件系统 | 硬链接不能跨挂载点 | 目标是另一块盘或网络存储时会退化成真实复制或直接报错 |
| rsync 默认写新文件 | 安全,符合快照语义 | 加 --inplace 会原地写,破坏历史版本 |
| 属性保持一致 | cp -a 保留权限与属主 | 跨用户恢复时注意权限继承是否合适 |
删除旧快照的空间回收是渐进的:只有当某份数据不再被任何快照引用时才会真正释放,所以删掉一份快照未必立刻回收等量空间。
不要对快照目录里的文件做原地修改(>> 追加、sed -i 这类原地写入):硬链接让历史版本与当前版本共享数据,一改就同时改掉了回滚点。