Linux tar 备份:创建归档、校验并验证恢复

压缩用于减少数据大小,备份则保留某个时点可用于恢复的副本。生成 tar.gz 文件不等于备份可用:应先恢复到另一位置,再核对文件内容、必要的元数据及应用能否使用这些数据。

本节先手动打包、校验和恢复普通用户文件,再比较恢复结果。确认流程有效后,才按定时备份与独立健康检查(英语)将其自动化。

区分归档、压缩、同步和备份

操作 主要目的 关键限制
归档 把文件与元数据打包保存 核对需要保留的元数据及恢复权限
压缩 减少存储空间 不代表加密,也不代表已有独立副本
同步 使源与目标的当前状态一致 误删除或误修改也可能传播到目标
备份 恢复到较早时点 需要保留策略、独立存储与恢复试验

同一磁盘上的另一目录,可能帮助找回被覆盖的文件,却会随磁盘故障一同丢失。应规划独立存储、多个恢复时点,以及生产账号失陷后也不能立即改写的副本。需要加密时,还要独立保护密钥,并确保获授权的恢复人员能够取得密钥;只留下密文而丢失密钥同样无法恢复。

准备隔离的练习目录

在个人 Linux 实验环境中准备 Bash、GNU tar、gzip、GNU coreutils、find 和 diff;最后的同步预览还需要 rsync。下面不需要 sudo。各代码块应依次在同一个专用 Bash 练习会话中逐条执行,这样变量 lab 才能沿用。首行失败会通过 exit 1 结束该会话;请先保存其他工作。后续命令不会自动在所有错误处退出,任何一步报错都应停止并排查,不要直接整段粘贴后凭最后一条成功判断备份成功。

lab=$(mktemp -d "$HOME/linux-backup-lab.XXXXXX") || exit 1
mkdir -p "$lab/source/docs" "$lab/archives" "$lab/restore"
printf "version 1\n" > "$lab/source/docs/note.txt"
printf "enabled=yes\n" > "$lab/source/settings.conf"
chmod 600 "$lab/source/settings.conf"
find "$lab/source" -type f -print

先确认输出的文件确实位于这次新建的临时目录下。source、archives 与 restore 是并列目录,避免把备份文件再次打包进源目录。chmod 600 在支持 Unix 权限的 Linux 文件系统上,只允许文件所有者读写配置文件;Windows 等环境的权限映射可能不同。本练习不验证 root 所有权、访问控制列表(ACL)、扩展属性或数据库一致性。

用相对路径创建 tar.gz 并校验

tar -czf "$lab/archives/source.tar.gz" -C "$lab" source
tar -tzf "$lab/archives/source.tar.gz"
(cd "$lab/archives" && sha256sum source.tar.gz > source.tar.gz.sha256)
(cd "$lab/archives" && sha256sum -c source.tar.gz.sha256)

-c 创建归档,-z 使用 gzip 压缩,-f 指定归档文件。-C 切换基准目录,使成员路径为 source/...,而不是机器上的绝对路径。查看列表时,应找到 source/docs/note.txt 与 source/settings.conf,同时也可能看到目录条目。

sha256sum 为归档计算 SHA-256 摘要;括号中的命令在子 Shell 切换目录,不改变外层会话的位置。-c 检查已记录的摘要,预期出现 source.tar.gz: OK 并以状态 0 结束。校验失败时不要继续把该副本当作已验证备份。摘要只能检测相对于记录值的变化;能同时替换归档和摘要的攻击者不会因此被阻止。

恢复到另一位置并比较

tar -xzf "$lab/archives/source.tar.gz" -C "$lab/restore"
diff -r "$lab/source" "$lab/restore/source"
stat -c "%a %n" "$lab/source/settings.conf" "$lab/restore/source/settings.conf"
cat "$lab/restore/source/docs/note.txt"

-x 提取归档,目标是独立的 restore 目录。diff -r 无输出且退出状态为 0,表示它遍历到的内容相同;状态 1 表示差异,状态 2 表示比较出错。读取恢复后的文件,应看到 version 1。先核对这些结果,再考虑应用层的恢复验证。

stat 应用于分别核对源文件和恢复文件的权限,Linux 本练习中配置文件预期为 600。普通用户提取时,GNU tar 默认还会应用当前 umask,因此不能推断任何归档都会原样恢复全部权限;本例的限制性权限也要实际检查。diff 不检查所有权、ACL 或扩展属性,生产恢复需按要求另行核对。

接着把源目录中 docs/note.txt 的内容改为 version 2,再次运行同一条 diff,预期看到差异。不要重新创建归档或覆盖恢复目录;恢复副本仍是 version 1,这说明恢复某个时点与同步当前状态是两种任务。观察完成后可把源文件改回 version 1,再次确认 diff 状态 0。整个实验保留在新目录中,先检查结果,再按实际路径清理自己的练习文件。

谨慎处理陌生归档与运行中的服务

来源不明的归档,先检查列表中的异常路径、符号链接、文件数量和大小,再用普通账号在全新、隔离的目录中提取。不要以 root 身份直接解压到系统目录。列表看似正常也不能保证安全;包含敏感数据的重要系统应与处理陌生文件的环境隔离。

直接用 tar 打包正在运行的数据库目录,可能混合不同时间点的文件,形成不一致副本。应采用该数据库支持的逻辑备份或物理备份流程,并满足停写、协调快照等一致性条件。先定义可接受的数据损失和恢复时间,再通过实际恢复评价;解压成功不代表数据库能够启动并正确提供数据。

用 rsync 先预览同步变化

rsync -av --dry-run "$lab/source/" "$lab/restore/source/"

安装 rsync 后,--dry-run 只预览将发生的变化,不传输待更新的文件内容;-a 使用归档模式,-v 显示更多信息。源路径末尾的 / 表示复制目录内容,而不是额外创建一层同名目录。预览不是对随后真实执行结果的永久保证,期间文件变化或执行错误仍可能改变结果。

本例没有 --delete,因为它可能删除只存在于目标中的文件。先核对源与目标路径,保留独立时点副本,然后只应用确实需要的同步。rsync 默认通过大小和修改时间等进行快速判断;若实验中只把 version 1 改成等长的 version 2 且修改时间未形成可辨差异,预览未必列出更新,不能用它替代前面的内容比较。

官方参考资料