Linux目录打包备份与解压验证

适用环境:安装 GNU tar、gzip、sha256sum 的 Linux;示例在 Bash 中执行。账号需能读取源文件,并在 /var/backups/baole 与临时恢复目录创建文件;路径无写权时应由管理员准备受控目录,不直接套用。仅适用于已经停止写入或本来不变的普通目录,运行中的数据库另行导出。

本教程完成一次“打包—检查—试解压”的完整操作。示例源目录是 /srv/example-site,备份放在 /var/backups/baole;这两个路径必须改成实际路径,备份目录不能在源目录内部。同一块磁盘上的压缩包只是本机副本,完成后还要转移到服务器之外。本页分段命令在同一个Bash会话中执行;重新连接后,先根据记录重新设置变量对应的绝对路径。

1. 确认范围和空间

source_dir=/srv/example-site
backup_root=/var/backups/baole
test -d "$source_dir" || { printf '%s\n' '源目录不存在,请先修改路径'; exit 1; }
umask 077
mkdir -p -- "$backup_root"
du -sh -- "$source_dir"
df -h -- "$source_dir" "$backup_root"
find "$source_dir" -type l -print

du 查看目录当前占用,df 查看源和实际备份目录所在文件系统的可用空间。压缩比不能事先保证,目标盘要留足空间;若使用挂载存储,核对它确实挂载到预期设备,避免写入未挂载的根盘目录。列出的符号链接通常只会被归档为链接本身,链接指向的其他目录是否也要备份,应另行确认。网站维护窗口应同时停止会写入这些文件的后台任务。

2. 创建独立的备份批次

run_dir=$(mktemp -d "$backup_root/files.XXXXXXXX")
tar -czf "$run_dir/site.tar.gz" -C "$(dirname "$source_dir")" "$(basename "$source_dir")"
printf 'tar exit=%s\n' "$?"
printf '%s\n' "$run_dir"

每条命令执行成功后再进行下一条。tar 返回 0 才表示此次命令正常完成;出现“file changed as we read it”、权限错误或空间不足,都需要处理并重新备份,不能只看压缩包已经生成。-C 使归档保存相对路径,避免恢复时直接指向原系统目录。记下打印的 run_dir。

3. 检查压缩包,并保存校验值

gzip -t "$run_dir/site.tar.gz"
tar -tzf "$run_dir/site.tar.gz" > "$run_dir/contents.txt"
sed -n '1,30p' "$run_dir/contents.txt"
(cd "$run_dir" && sha256sum -- site.tar.gz > SHA256SUMS)
(cd "$run_dir" && sha256sum -c SHA256SUMS)

gzip -t 正常时通常不输出内容;这里的内容列表只是抽看前 30 行,不替代完整的解压验证。SHA256SUMS 用于后续传输核验,不能证明数据库一致性。把压缩包和校验文件一起通过可信渠道取回。

4. 解压到新目录,检查真实文件

restore_dir=$(mktemp -d /var/tmp/baole-restore.XXXXXXXX)
tar -xzf "$run_dir/site.tar.gz" -C "$restore_dir" --no-same-owner --no-same-permissions
find "$restore_dir" -maxdepth 3 -type f | head -n 30
printf '%s\n' "$restore_dir"

只处理自己生成或确认可信的归档。解压前检查成员名称,不接受异常绝对路径或越出目标目录的路径。找到几份重要配置、近期附件和大文件,比较内容及 SHA256;再确认业务实际需要的目录没有漏掉。本例为普通文件内容验证,没有完整保留 ACL、扩展属性或业务运行环境。正式回迁前要另行安排权限、数据库和应用检查。

遇到这些结果怎么办

现象 处理
Permission denied 先确认备份账号对哪些文件有读取权,不用忽略错误参数跳过重要数据。
压缩包能列出但试解压失败 保留错误输出,检查目标空间、归档完整性和路径;重新生成或重新传输。
解压后缺少某个目录 核对符号链接、挂载点、排除规则和实际源路径,补齐后重新验证。