首页/数据/备份与容灾速查/cp -al 硬链接快照目录

cp -al 硬链接快照目录

用 cp -al 复制目录树并把未变文件以硬链接指向源文件,快速得到完整视图;后续复制以 -al 链到上一份并用 rsync 更新,即可实现增量快照。

备份与容灾速查数据更新于 2026-10-13

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:对源目录文件的就地修改(追加写、应用改配置)会同时改变快照内容。该方案只适合只读数据,或者写入时通过重命名替换文件的场景,数据库与日志这类原地追加写的数据不适用。

易错点

  • 对原地追加写的文件使用该方案:数据库、日志的快照会被同步改写,失去时间点意义
  • 快照与源不在同一文件系统:硬链接失败变成实体拷贝,空间迅速吃满
  • 快照中删除文件只减少链接计数:历史数据不会释放,空间要按保留份数规划
  • 脚本清理时误删源目录:硬链接不能保护数据完整性,源仍是单点

数据来源与参考

  • man 1 cp(-l、-a 选项)
  • rsync 手册(-H 保留硬链接)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌