首页/系统/Linux 运维命令速查/场景:cp -al 硬链接快照省空间
文件与目录76 条

场景:cp -al 硬链接快照省空间

用 cp -al 一秒生成目录快照:所有文件硬链接共享数据,后续只复制变化文件,磁盘占用接近增量备份。

Linux 运维命令速查系统更新于 2026-10-13

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 这类原地写入):硬链接让历史版本与当前版本共享数据,一改就同时改掉了回滚点。

易错点

  • 对快照里的文件原地修改:历史版本同步被改,需要回滚时才发现已无干净副本
  • rsync 加了 --inplace:原地写会污染所有共享该 inode 的快照
  • 目标目录与源不在同一文件系统:-l 失效退化成真实复制或直接报错,空间与时间成本远超预期
  • 用 du 默认统计评估占用:硬链接被重复计数,应结合 --count-links 与 df 判断

数据来源与参考

  • man 1 cp(GNU coreutils 手册)
  • man 1 rsync(rsync 官方手册)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌