搞Linux运维的,迟早会和restore打个照面。平时它像系统里的一个透明工具,安静地躺在dump包里,直到哪天真把重要目录删了、或者磁盘报错,你才会发现这个老朋友有多关键。restore命令是配合dump备份工具使用的恢复端命令——dump把某个文件系统的数据连同权限、所有者、稀疏文件、扩展属性一起写进备份镜像,restore就负责把这个镜像按原样倒回磁盘。和tar比,它更接近“整盘级恢复”的思路,适合系统管理员、备份运维的同学深入掌握。下面我直接讲restore怎么用,从原理说到实战,再讲我踩过的坑。
1. restore命令的角色与使用场景
1.1 dump与restore的分工逻辑
要搞懂restore,先要理解它和dump的关系。dump是备份端,restore是恢复端,两者就像录音和播放的关系。dump备份时并不像tar那样逐层遍历目录、逐个文件拷贝,而是直接读取文件系统的底层数据结构,把inode、目录项、数据块按磁盘上的原始组织方式打包成镜像。restore拿到这个镜像后,不是简单解包,而是根据镜像中的目录树和inode信息重建文件结构。
这个设计带来了几个实打实的好处。第一点是备份速度快,因为跳过了大量内核文件系统接口调用,直接走底层数据块;第二点是元数据保留得全,除了常规的权限和所有者,文件ACL、扩展属性、稀疏文件都能一并搞定;第三点是天然支持增量备份,dump用0到9共十个级别表示备份深度,restore可以按级别顺序把全量和增量一层层叠回去。
用生活化的类比解释:tar像是把抽屉里的东西一件件拿出来如实装箱,运输方便但要记清楚每样东西原本放在哪格;而dump更像是对整个抽屉做三维扫描,restore则按扫描图纸把抽屉重新搭出来。如果只是临时拷贝几个文件,tar够用,但要追求“恢复完和原来一模一样”,restore才是对口的工具。
1.2 什么场景必须用restore
restore的应用场景其实很集中,主要围绕“整个文件系统级别的恢复”展开,常见的有这么几类:
- 裸机恢复:系统盘损坏,启动到急救盘或Live环境,把备份的分区镜像通过restore -r还原到新硬盘上。
- 文件误删后的精准捞取:在不知道完整路径或想看一眼备份里有什么时,用交互模式挑文件恢复。
- 跨机器的文件系统迁移:新旧机器都是同类型文件系统(比如都是ext4),用restore能把整个分区结构搬过去。
- 历史磁带数据读取:很多单位还有老磁带库,里面就是dump格式备份,现在依然要靠restore来读。
这里要提醒一句,restore不是万能的。它救的是“文件系统层面的文件和目录”,救不了数据库在线日志这种需要一致性快照的东西。如果你对数据库所在分区直接执行dump,最好先把数据库停掉或保证处于冷备份状态,否则恢复出来的文件可能处于不一致状态,数据库起不来。
1.3 四种工作模式先混个脸熟
restore的全部功能围绕四个模式展开,每个模式对应一种恢复粒度:
-t:列出备份内容,相当于打开备份看一眼。-x:按指定文件名提取,适合明确知道要捞哪些文件时使用。-i:交互式恢复,先进入一个命令行界面,浏览备份目录树,挑选好文件再一次性导出。-r:完整重建整个文件系统,是裸机恢复的核心参数。
很多人上来就直接找-r用,我觉得这是错误的打开方式。日常用得最多的其实是-t和-x,搞清楚备份里有什么,才能决定要不要上大招。接下来我把每个模式讲透。
2. restore命令核心语法与选项拆解
2.1 命令格式与最常用选项
restore的基本格式是:
restore [选项] [文件...]其中-f用来指定备份源,可以是一个普通备份文件,也可以是磁带设备(比如/dev/st0)。如果不写-f,restore默认从标准输入读取备份流,这在配合磁带机或管道时很有用。
常用参数我列了一个速查表:
| 参数 | 作用 |
|---|---|
-t | 列出备份中的文件清单 |
-x | 按指定路径提取文件到当前目录 |
-i | 进入交互式恢复模式 |
-r | 重建完整文件系统 |
-f file | 指定备份文件或设备 |
-d dir | 部分版本支持,指定恢复目标目录 |
-y | 所有提问都默认yes,不做询问 |
-v | 输出更详细信息,调试时用 |
-C | 部分新版本支持,对比备份与当前目录的一致性 |
我个人的习惯是:能用cd就尽量不依赖-d参数。因为不同发行版打包的restore版本有差异,-d行为未必完全一致,而切到目标目录再执行restore,在任何版本上都是稳妥的。
2.2 四种模式怎么选
-t模式主要用于侦察。它会把备份中的所有文件路径打印到标准输出,可以配合管道做搜索:
restore -t -f /backups/web-server-full.dump | less restore -t -f /backups/web-server-full.dump ./etc/nginx/nginx.conf注意文件名路径前面通常带./前缀。这是dump镜像内部的表示方式,提取时最好保留这个前缀写法,否则容易匹配不上。
-x模式适合精准提取。你明确知道要恢复哪些文件,比如nginx配置:
cd /data/recovery restore -x -f /backups/web-server-full.dump ./etc/nginx/nginx.conf命令执行完,/data/recovery下会出现./etc/nginx/nginx.conf这一条完整路径。如果想把多个文件一网打尽,直接在命令后面罗列即可。
-i模式适合不确定路径时手动挑。进入一个类似shell的交互界面,用cd切换目录、ls查看文件、add选择要恢复的文件,最后extract统一导出。
-r模式是大招。它会把备份中的整个文件系统逐块重建到当前目录,执行前必须确保当前工作目录是目标文件系统的挂载点或一个干净的目录。裸机恢复时,通常先挂载新分区到/mnt/restore,再在这个目录下执行restore。别在系统根目录下直接跑-r,那等于把自己正在运行的文件系统覆盖掉,后果很严重。
2.3 交互模式里那些命令咋用
进入交互模式非常简单:
restore -i -f /backups/web-server-full.dump看到restore >提示符后,可以用下面这些命令操作:
| 命令 | 作用 |
|---|---|
ls | 列出当前备份目录层级的文件 |
cd | 切换当前浏览目录,注意只能往下走 |
pwd | 查看当前在备份中的路径 |
add | 把当前文件或目录加入待恢复列表 |
delete | 从待恢复列表里移除 |
extract | 开始恢复已选择的文件 |
setmods | 恢复时手动设置所有者和权限 |
verbose | 切换详细信息输出 |
help | 查看帮助 |
这个模式最实用的地方在于:你可以先ls看一圈,再用add把某个目录整体勾选,最后extract一次搞定。放到生产环境,最怕的就是背路径,交互模式能有效避免这种低级失误。
3. 实操:从备份文件恢复文件的完整流程
3.1 准备工作:先确认备份格式与空间
恢复之前,先做三件事。
第一步,确认备份文件确实是dump格式:
file /backups/web-server-full.dump如果输出类似“dump data file, version 8”之类的字样,说明这份备份可以被restore识别。如果输出是“gzip compressed data”,那你应该先解压再恢复,或者直接用tar处理,别让restore读错类型。
第二步,建一个干净的恢复目录。比如:
mkdir -p /data/recovery cd /data/recovery第三步,检查磁盘空间。备份文件可能只有几十GB,但恢复出来的数据可能远大于单卷大小,尤其包含稀疏文件时更是如此。用df -h /data/recovery确认剩余空间充足,否则恢复中途才报空间不足,人会非常被动。
3.2 查看备份里到底有什么
先别急着恢复,用-t看一眼备份内容,心里才有数:
restore -t -f /backups/web-server-full.dump | less如果只想确认某个特定文件是否存在:
restore -t -f /backups/web-server-full.dump ./etc/nginx/nginx.conf看到对应路径打印出来,说明这份备份里有这个文件。这里我想强调一下,备份内容预览这一步极其重要,不仅能确认备份没坏,还能帮你决定用-x还是-i,避免恢复完发现路径不对或版本不对。
3.3 按文件名提取到指定目录
假设我要恢复nginx配置和网站的首页文件,执行:
cd /data/recovery restore -x -f /backups/web-server-full.dump ./etc/nginx/nginx.conf ./var/www/html/index.html命令结束后,检查一下目录树:
find /data/recovery/etc -type f find /data/recovery/var -type f正常情况下,/data/recovery/etc/nginx/nginx.conf和/data/recovery/var/www/html/index.html都会存在。这里有个容易踩的坑:如果你没先cd到目标目录,直接在任意位置执行恢复,文件会被撒到你执行命令时的当前目录下,恢复结果就会散落一地。
3.4 交互式挑选文件恢复
如果记不住完整路径,交互模式就派上用场了。操作过程大概是这样:
[root@host recovery]# restore -i -f /backups/web-server-full.dump restore > ls ./etc ./var ./usr restore > cd ./etc/nginx restore > ls ./nginx.conf restore > add ./nginx.conf restore > cd / restore > cd ./var/www/html restore > add index.html restore > extract You have selected the following files: ./etc/nginx/nginx.conf ./var/www/html/index.html Set owner/mode after extraction? [y] y restore > quit注意最后那个Set owner/mode after extraction?,它是在问你:恢复出来的文件要不要把备份里的所有者和权限一并写回。默认选y,前提是你用root执行。如果你用的是普通用户,这里极大概率会报权限错误,所以交互恢复也建议先切root。
3.5 用-r重建整个文件系统
用-r做裸机恢复,完整的步骤大概是这样的:
- 启动急救系统,挂载目标硬盘分区到
/mnt/restore,比如mount /dev/sdb1 /mnt/restore。 - 切到该目录:
cd /mnt/restore。 - 先恢复全量备份(0级):
restore -r -f /backups/web-server-full.dump。 - 再按顺序恢复各级增量备份:
restore -r -f /backups/web-server-incr1.dump、restore -r -f /backups/web-server-incr2.dump。
每执行完一次-r,当前目录会生成一个restoresymtable文件,这个文件是增量恢复的关键上下文,千万别手贱删掉。如果你中途发现恢复顺序搞错了,比如在没恢复全量的情况下先恢复增量,restore会报增量级别太低之类的错误,这时候必须从全量卷重新开始。
执行完毕后,退出目标目录,对分区做一次卸载再重新挂载,确认文件都正常。这里再提醒一句:-r恢复的是整个文件系统,恢复后的机器可能还要单独处理引导程序,那是另一个话题,但restore这一步的重建工作已经完成了。
3.6 恢复之后做一次快速校验
文件恢复完,别急着宣布完工。我习惯用下面几种方式验证:
- 用
ls -l抽查几个关键文件的权限和所有者是否符合预期。 - 用
du -sh /data/recovery对比原文件的预估大小。 - 如果备份里包含服务配置,恢复完成后直接启动对应服务试运行。
部分版本的restore支持-C参数做备份与当前目录的对比,用法是:
restore -C -f /backups/web-server-full.dump如果你的版本不支持,也没关系,用diff -r对比关键目录也能达到效果。重点是“恢复完必须验证”,这一步很多人会省,省掉之后出了事再回头,代价往往翻倍。
4. 常见问题与排查技巧实录
4.1 提示打不开备份文件或设备
执行restore时最常见的报错是:
restore: Cannot open tape解决思路很直接:先确认-f后面的路径对不对。普通文件要存在且可读,磁带设备要先通电且驱动器里有磁带。如果备份文件本身损坏,通常看到的是Invalid dump header或bad magic number。这时候用file命令再确认一次格式,再用ls -l看文件权限,基本能定位问题。
还有一个容易忽略的场景:如果备份是写到磁带上的,而restore没有指定-f /dev/st0,它会尝试从标准输入读,结果就是卡在那里等数据,看起来像死机一样。所以-f参数在这种场景下绝不能漏。
4.2 恢复出来的文件权限不对劲
普通用户执行restore,恢复出来的文件所有者和权限往往无法还原,会看到一大堆约束权限或奇怪的属主。原因就是设置文件属主、ACL这类操作需要root权限。遇到这种情况,切换到root,或者用sudo -i提权后再执行。
需要特别说明的是,dump和restore从设计上就是面向管理员的操作工具,不是普通用户数据备份的小玩具。想用restore恢复别人的系统文件,没有root资质,就别指望全须全尾地还原权限。
4.3 增量恢复顺序出错导致失败
用-r恢复增量备份时,顺序是个致命点。必须遵循“先低级别、后高级别”的顺序。比如全量是0级,那先恢复0级;接着恢复1级、2级……以此类推。如果跳级或者顺序反了,restore会报:
restore: Incremental dump volume too low遇到这个错误,补救办法是重新开始:rm -f restoresymtable restoretape等临时文件,从全量卷重新执行一遍。这个过程很耗时间,所以我现在的习惯是恢复前先写清楚编号顺序,按顺序放好备份文件,再动手。
4.4 版本或文件系统类型不匹配
restore只能读dump生成的备份,不同发行版打包的dump/restore版本可能有差异,偶尔会出现Incompatible dump date或无法解析文件头的现象。处理思路是:优先用备份时同一套工具或机器上的restore版本;如果不行,尝试找一台兼容的旧系统做中转恢复。
还要注意文件系统类型的对应关系。传统dump/restore主要面向ext2、ext3、ext4这类ex系列文件系统。如果你用的是xfs,那就得用xfsdump和xfsrestore,别拿restore硬碰。恢复之前看一眼备份文件出自哪种文件系统,可以省很多事。
4.5 实战教训速查表
我把平时遇到的几个高频问题整理成了表格,方便大家直接对照:
| 现象 | 可能原因 | 处理办法 |
|---|---|---|
Cannot open tape | 备份文件路径错误或设备不可用 | 检查路径、文件权限、设备连接 |
Invalid dump header | 文件不是dump格式或已损坏 | 用file确认格式,重新获取备份 |
Incremental dump volume too low | 增量恢复顺序错误 | 删除临时文件,从全量重新恢复 |
cannot chmod/chown | 非root执行 | 切换到root再恢复 |
| 恢复后的文件不完整 | 目标分区空间不足 | 提前用df -h检查空间 |
出现./lost+found not found | 目标分区不是全新文件系统 | 手动创建lost+found目录,继续恢复 |
这表格里的内容都是我自己实打实踩过的,不是从文档里抄来的。尤其是第一条,我见过有人把一个压缩包塞给restore,最后卡了半小时才发现文件类型不对。
5. dump/restore与tar等工具的选型分析
5.1 dump/restore的优势在哪里
再说说选型的问题。选择dump/restore的典型动机有三点。
第一,恢复精度高。它保留下来的不只是文件内容,还有文件系统层面的结构信息,恢复后目录顺序、inode关联、稀疏文件空洞都能最大程度还原。对于跑数据库、中间件的机器来说,这种细节差异可能直接影响启动成败。
第二,全量加增量的组合策略成熟。dump的0到9级增量体系很清晰,0级是全量,数字越大代表距离上次更低级别备份以来的变更。restore -r配合这个体系,恢复策略从“每天全量”进化成“周期全量+每日增量”,备份窗口压力小很多。
第三,整机恢复时效率高。因为restore是文件系统级别的重建,批量恢复大量文件时,比逐个文件跑一遍要更稳。
5.2 局限与注意点
但dump/restore也有明显的局限。它只能操作文件系统级别的内容,一旦超出这个范围,比如备份某个应用自己维护的裸数据文件,dump就无能为力了。另外,它需要root权限,不是普通用户随便跑的工具。
还有一个现实问题:目前主流发行版对dump包的维护力度不如tar和rsync,新装系统可能压根没有内置restore。CentOS系要用yum install dump,Debian/Ubuntu系要用apt install dump,并且只对ext系列分区支持得比较好。xfs文件系统请改用xfsdump/xfsrestore。
5.3 与tar工具的直观对比
| 对比项 | dump/restore | tar |
|---|---|---|
| 备份粒度 | 文件系统级 | 文件/目录级 |
| 权限与所有权还原 | 完整还原 | 常用-p可保留 |
| 稀疏文件处理 | 原生支持 | 依赖版本和选项 |
| 增量备份 | 默认0-9级别,策略清晰 | 不直接支持,需额外脚本叠加 |
| 跨文件系统备份 | 不支持 | 支持 |
| 裸机恢复友好度 | 高 | 低 |
| 使用门槛 | 较高 | 较低 |
| 系统内置度 | 部分发行版需额外安装 | 基本都内置 |
从表格可以看出来,这俩不是一个维度的工具。tar的舒适区是“把目录归档、传递、迁移”,restore的舒适区是“把整个文件系统按原样重建”。日常备份可以两者混用,但关键时刻裸机恢复,我绝对把票投给dump/restore。
5.4 什么时候别用restore
也有不该用restore的场景。比如你只是想备份用户个人目录,目标存储是NAS或对象存储云桶,那tar或rsync明显更合适。再比如你的分区是xfs,或者没有root权限,硬上restore就是给自己找麻烦。
但即便平时不用,我也建议你把restore的用法记牢。很多老单位的数据中心里还躺着成堆的dump磁带,哪天要找回历史数据,能读磁带的往往就是restore命令。这属于“平时用不上、一用就要救命”的冷门工具。
我在实际维护中遇到过一起磁盘损坏事故,靠一份三个月前的restore备份把一台无盘启动的服务器拉了回来。过程并不顺利,因为第一次恢复时忘了按增量顺序执行,折腾了不少时间。自那以后,我把restore的用法打印成一张A4纸贴在机柜边,备份完成后一定先做一次-t确认备份可读,每个季度挑一台离线机器做一次完整的恢复演练。这套流程虽然土,但关键时刻是真的能救命。