Linux dump:传统但可靠的文件系统级备份工具详解

在 Linux 系统管理中,备份是保障数据安全的最后一道防线。不同的备份工具适用于不同场景:tar 擅长文件级备份,rsync 适合增量同步,而 dump 则是专为文件系统级备份设计的经典工具。它诞生于 Unix 时代,至今仍被用于需要**完整还原文件系统元数据(权限、硬链接、设备文件)**的场景(如系统分区备份)。

尽管 dump 不如现代工具(如 borgbackuprestic)灵活,但它的高效性(直接读取文件系统元数据)和可靠性(历经数十年验证)使其在特定场景下不可替代。本文将深入解析 dump 的工作原理、使用方法、最佳实践及 troubleshooting,帮助你掌握这一“古老但好用”的工具。

目录#

1. Linux dump 是什么?#

dump文件系统级备份工具,它直接读取文件系统的inode表目录块,而非遍历目录树(如 tar)。这意味着:

  • 高效性:无需逐个扫描文件,处理大型文件系统(如 / 分区)速度更快;
  • 完整性:完整备份文件系统的所有元数据(权限、硬链接、设备文件、稀疏文件);
  • 局限性:仅支持特定文件系统(如 ext2/ext3/ext4、UFS),且只能备份整个文件系统(无法指定单个目录)。

简而言之:dump 是“复制整个文件系统的镜像”,适合备份需要精确还原的系统分区(如 /、/boot),而非用户数据目录(如 /home)。

2. dump 的核心概念#

在使用 dump 前,需先理解几个关键概念:

2.1 备份级别(Backup Levels)#

dump 采用增量备份级别(0~9),核心逻辑是:

Level N 备份:仅备份自最后一次更低级别(<N)备份以来修改的文件。

常见级别组合(以周备份为例):

时间级别说明
周一0全量备份(备份整个文件系统)
周二1增量备份(仅备份周一以来修改的文件)
周三2增量备份(仅备份周二以来修改的文件)
周四1增量备份(仅备份周一以来修改的文件)
周五2增量备份(仅备份周四以来修改的文件)

关键结论

  • Level 0 是基础,所有增量备份都依赖它;
  • 还原时需按从低到高的级别顺序(先 Level 0,再 Level 1,最后 Level 2)。

2.2 文件系统支持#

dump 仅支持传统 Unix 文件系统

  • 原生支持:ext2/ext3/ext4、UFS;
  • 不支持:btrfs、xfs(需使用 xfsdump 替代)、ZFS。

注意:备份前需确保文件系统未挂载挂载为只读(ro),否则可能导致备份不一致(文件正在修改)。

2.3 备份介质#

dump 支持多种输出目标:

  1. 磁带(传统介质):dump -0u -f /dev/st0 /dev/sda1(/dev/st0 是磁带设备);
  2. 文件dump -0u -f /backup/root.dump /dev/sda1(保存为本地文件);
  3. 标准输出(可 pipe 到压缩/网络):dump -0u -f - /dev/sda1 | gzip > /backup/root.dump.gz(压缩备份);
  4. 网络dump -0u -f - /dev/sda1 | ssh user@server "cat > /backup/root.dump"(远程备份)。

2.4 /etc/dumpdates:备份历史记录#

dump 会将每次备份的信息写入 /etc/dumpdates 文件,格式如下:

/dev/sda1 0 Fri Nov  3 12:00:00 2023  # /dev/sda1 的 Level 0 备份(2023-11-03)
/dev/sda1 1 Sat Nov  4 12:00:00 2023  # /dev/sda1 的 Level 1 备份(2023-11-04)

该文件是 dump 实现增量备份的关键——它记录了每个文件系统的最后一次备份级别和时间。若丢失此文件,增量备份将无法正常工作。

3. 安装 dump#

dump 通常未预安装,需手动安装:

  • Debian/Ubuntusudo apt install dump
  • RHEL/CentOSsudo yum install dump
  • Arch Linuxsudo pacman -S dump

4. dump 实战:备份与还原#

以下以备份 /dev/sda1(假设是 / 分区)为例,演示完整流程。

4.1 全量备份(Level 0)#

全量备份是所有增量备份的基础,命令格式:

sudo dump -0u -f /backup/root-level0.dump /dev/sda1

参数说明:

  • -0:指定备份级别为 0(全量);
  • -u:更新 /etc/dumpdates 文件;
  • -f:指定输出文件(或设备);
  • /dev/sda1:要备份的文件系统设备。

压缩备份(推荐):
dump 可通过管道与 gzip 结合,减少备份体积:

sudo dump -0u -f - /dev/sda1 | gzip -9 > /backup/root-level0.dump.gz

4.2 增量备份(Level 1~9)#

假设已完成 Level 0 备份,次日进行 Level 1 增量备份:

sudo dump -1u -f /backup/root-level1.dump /dev/sda1

参数仅需将 -0 改为 -1dump 会自动参考 /etc/dumpdates 中的最后一次 Level 0 备份时间,仅备份修改的文件。

4.3 查看备份历史#

使用 dump -W 查看所有文件系统的备份状态:

sudo dump -W

输出示例:

Last dump(s) on /dev/sda1:
Level 0 on Fri Nov  3 12:00:00 2023
Level 1 on Sat Nov  4 12:00:00 2023

4.4 还原操作:restore 命令#

dump 的配套还原工具是 restore,它支持三种还原模式:

  • 交互式还原(-i):手动选择要恢复的文件;
  • 全量还原(-r):恢复整个文件系统;
  • 比较验证(-C):检查备份与当前文件系统的一致性。

4.4.1 交互式还原(提取特定文件)#

若仅需恢复 /etc/passwd,可使用交互式模式:

# 进入还原环境(需指定备份文件)
sudo restore -i -f /backup/root-level0.dump

交互式命令示例:

restore > ls                # 查看备份中的目录
restore > cd etc            # 进入 etc 目录
restore > add passwd        # 标记要恢复的文件
restore > extract           # 开始提取(会提示输入备份的块大小,直接回车默认)
restore > quit              # 退出

提取的文件会保存在当前目录(需确保当前目录为空,或指定还原路径)。

4.4.2 全量还原(恢复整个文件系统)#

若需将文件系统还原到新磁盘(如 /dev/sdb1),步骤如下:

  1. 创建文件系统sudo mkfs.ext4 /dev/sdb1
  2. 挂载文件系统sudo mount /dev/sdb1 /mnt/restore
  3. 进入挂载点cd /mnt/restore
  4. 全量还原
    sudo restore -r -f /backup/root-level0.dump
    • -r:指定全量还原模式;
    • -f:指定备份文件。

4.4.3 增量还原(Level 0 → Level 1 → ...)#

若需恢复到 Level 1 备份状态,需按级别顺序还原:

# 1. 先还原 Level 0(全量)
sudo restore -r -f /backup/root-level0.dump
# 2. 再还原 Level 1(增量)
sudo restore -r -f /backup/root-level1.dump

压缩备份的还原
若备份时使用了 gzip,需先解压再还原:

gunzip -c /backup/root-level0.dump.gz | sudo restore -r -f -

5. 最佳实践#

为确保 dump 备份的可靠性,需遵循以下最佳实践:

5.1 始终使用只读文件系统#

dump 备份挂载为读写(rw)的文件系统时,可能因文件修改导致备份不一致。解决方法:

  • 备份前将文件系统重新挂载为只读
    sudo mount -o remount,ro /dev/sda1
  • 若无法卸载(如 / 分区),可创建LVM 快照(只读副本):
    # 创建 10GB 快照(需 LVM 卷)
    sudo lvcreate -L 10G -s -n root_snap /dev/vg0/root
    # 挂载快照为只读
    sudo mount -o ro /dev/vg0/root_snap /mnt/snap
    # 备份快照
    sudo dump -0u -f /backup/root-level0.dump /dev/vg0/root_snap
    # 清理快照
    sudo umount /mnt/snap && sudo lvremove /dev/vg0/root_snap

5.2 定期测试还原#

备份的价值在于能恢复,而非“存在”。建议每周做一次测试还原

  • 恢复 Level 0 备份到测试磁盘;
  • 检查关键文件(如 /etc/passwd、/boot/vmlinuz)是否完整;
  • 验证元数据(如权限、硬链接)是否正确。

5.3 备份 /etc/dumpdates#

/etc/dumpdates 是增量备份的“地图”,若丢失将无法进行增量备份。建议:

  • /etc/dumpdates 包含在 Level 0 备份中;
  • 额外备份到异地存储(如 S3、NAS)。

5.4 加密敏感数据#

若备份包含敏感信息(如用户密码、数据库),需加密:

# 备份并加密(使用 gpg)
sudo dump -0u -f - /dev/sda1 | gpg -c > /backup/root-level0.dump.gpg
# 还原时解密
gpg -d /backup/root-level0.dump.gpg | sudo restore -r -f -

5.5 避免使用 -allowrw 选项#

dump 提供 -allowrw 选项,允许备份读写挂载的文件系统,但极度危险(可能导致备份损坏)。除非万不得已,否则禁用此选项。

6. 常见问题与排查#

6.1 错误:dump: can't open /dev/sda1 read-write#

原因:文件系统挂载为只读,或无读权限。
解决:确保文件系统挂载为只读(mount -o remount,ro /dev/sda1),或使用 sudo 运行 dump

6.2 错误:restore: not a dump file#

原因:备份文件损坏,或不是 dump 格式(如误用 tar 备份的文件)。
解决

  • 检查备份文件的完整性(如 md5sum 校验);
  • 确认备份命令正确(未混淆 dumptar)。

6.3 错误:dump: filesystem is mounted read-write#

原因:文件系统处于读写状态,dump 默认拒绝备份。
解决

  1. 优先重新挂载为只读(推荐);
  2. 若无法卸载,使用 -allowrw 选项(风险提示:可能导致备份不一致):
    sudo dump -0u -allowrw -f /backup/root-level0.dump /dev/sda1

6.4 还原后文件缺失#

原因

  • 还原顺序错误(如先还原 Level 1 再 Level 0);
  • 备份级别选择错误(如 Level 2 依赖 Level 1,但 Level 1 未备份)。
    解决
  • 从低到高的级别顺序还原;
  • 检查 /etc/dumpdates,确保所有依赖的级别已备份。

7. 总结#

dump传统但可靠的文件系统级备份工具,适合以下场景:

  • 备份需要精确还原的系统分区(如 /、/boot);
  • 需要高效增量备份的大型文件系统;
  • 需保留硬链接、设备文件等元数据的场景。

dump 也有局限性:

  • 仅支持少数文件系统;
  • 无法备份单个目录;
  • 不如现代工具灵活(如无 deduplication、无远程备份集成)。

简言之:dump 不是“万能工具”,但在系统分区备份场景下,它是“最可靠的选择之一”。

8. 参考资料#

  1. Man Pages
    • dump(8)man 8 dump(官方文档);
    • restore(8)man 8 restore(还原工具文档);
    • dumpdates(5)man 5 dumpdates(备份历史文件格式)。
  2. Distro Docs
  3. 实战教程
    • 《Linux 系统管理技术手册》(第5版):第10章“备份与还原”。

通过本文的学习,你已掌握 dump 的核心用法。记住:备份的价值在于还原——定期测试还原流程,比“做了备份”更重要!