1. 项目概述:灾难恢复为什么需要一个专用工具
服务器坏了到底有多慌?我见过不少团队,备份做了好几年,RPO讲得头头是道,可真到了要恢复的时候,系统装了三天还没起来。问题往往不是数据丢了,而是系统本身没了:引导分区坏了、磁盘分区表损坏、内核被误升级搞挂了、甚至整台服务器硬件报废。这时候你拿一个普通的tar备份根本无济于事,因为你要的不是文件,是一台能开机的机器。
Linux上的灾难恢复和系统热备工具rear(Relax-and-Recover)解决的就是这一类问题。它的定位非常明确:把操作系统本身、引导配置、分区信息、驱动模块和你的业务数据打包成可恢复的完整映像,当整机崩溃时,用一张启动介质就能把系统恢复到原机,或者迁移到另一台硬件配置不同的机器上。
这篇实践教程适合谁?如果你是Linux运维、系统工程师,或者自己折腾服务器和虚拟机的爱好者,只要你不是那种“数据丢了重装一下就行”的玩法,rear都值得你花一个下午把它跑通。它不像商业备份软件那样复杂,也不需要专用服务器和昂贵授权,一套开源方案加一台NFS存储就能把完整的灾难恢复体系搭起来。
需要强调的一点是,rear的核心能力可以概括为三句话:系统可引导、数据可还原、硬件可迁移。我在这篇教程里会从原理讲到实操,再把我在真实环境里踩过的坑整理出来,尽量让你看完就能照着做。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心机制解析:rear不是“打包文件”那么简单
2.1 三个关键资源:恢复介质、备份归档、系统元数据
先说一个很多人对relax-and-recover的误解:以为它就是一个把根文件系统打包的工具。实际上rear在运行时处理的是三个层面的东西,缺一个恢复都会失败。
第一个是恢复介质(recovery media)。rear会基于当前内核生成一个独立的救援系统,这个系统就是ISO文件或者PXE引导的内核与initrd。它自带一套专用恢复环境,包含分区工具、文件系统工具、网络工具、磁盘驱动和rear自身的恢复程序。这张ISO就是“诺亚方舟”,不管原机器系统烂成什么样,只要BIOS还能引导这个ISO,恢复就有戏。
第二个是备份归档(backup archive)。这就是你的实际数据,包括系统文件、配置、业务和数据库文件。rear本身不强行定义怎么备份数据,它可以调用内置的tar,也可以对接很多外部备份方案,比如BACULA、Bareos、NFS共享,甚至IBM TSM。数据归档和恢复介质是独立生成的,这意味着你可以每天定时只刷新数据备份,而恢复介质不用频繁重建,但硬件变更或驱动更新后,介质需要重新生成。
第三个是系统元数据(system metadata)。这部分很多人会忽略。rear在备份时会把当前系统的分区布局、文件系统类型和挂载点、LVM结构、MD RAID信息、网卡设置、UUID,甚至引导加载程序(GRUB2)的安装位置全部记录下来,形成一个restore脚本。到恢复时,它先照着这个脚本重建磁盘布局,再挂载文件系统,最后才恢复数据。这是rear能实现“从裸金属恢复到可用系统”的关键所在。
理解这个机制非常重要。很多人在用rear时遇到的恢复失败,不是数据没备份好,而是元数据对不上:磁盘名称变了、UUID变了、LVM卷组名冲突,这些问题恰恰是rear设计时要解决的,但在实操中又最容易因为人为配置不当而触发。
2.2 恢复流程说白了是什么
rear的恢复流程用大白话说就是:先用恢复介质把机器带起来,然后在这个临时系统里把磁盘按照备份时记录的结构重新格式化、分区、创建文件系统,再把备份数据解压回去,最后重装引导加载程序,重启,完事。
这个流程听起来和Windows的Ghost有点像,但实操层面有很多细节。Ghost是整盘扇区级克隆,rear不是扇区级,而是文件系统级的,它更灵活,也更容易适应新的硬件环境。比如你把系统从一块500GB的硬盘迁移到一块1TB的SSD上,扇区级克隆工具往往会在分区表上闹脾气,rear则会根据新磁盘的大小重新计算分区边界,只要相关分区足够容纳原有数据,就能顺利完成迁移。
整个恢复流程可以在rear的交互式菜单里逐步执行,也可以预先在配置文件里写好自动恢复。我建议第一次做恢复演练时,使用交互模式,一步一确认,仔细看每次分区操作和挂载动作,这样你对rear的信任感是实打实建立起来的,而不只是看文档觉得它行。
2.3 为什么rear能跨硬件迁移
跨硬件迁移是rear特别实用的一个场景,也是很多人选择它的核心原因。它的实现原理其实很朴素:恢复介质里塞进了当前系统所有的存储驱动和必要固件,当你在新机器上启动这个介质时,内核会发现并加载适配新硬件的驱动,然后重建的initrd里会包含这些驱动,使新系统能够真正引导起来。
不过这里有一个重要的注意事项:恢复介质里的驱动覆盖范围,取决于你生成介质时所在的系统,或者你显式指定的驱动列表。如果你在原机器上生成介质,那么新机器上特别新的网卡或NVMe控制器可能不被旧介质支持。这就是为什么在做硬件迁移前,最好用目标硬件上能识别的新系统环境重新生成一次恢复介质,或者干脆为迁移单独准备一份驱动更全的介质。
跨硬件迁移时还有一个麻烦:网卡名称和固件设备路径可能不一样。原来叫ens33,迁移后变成eno1,如果/etc/sysconfig/network-scripts/里写死了Device=ens33,恢复后网络就会起不来。对此我没有特别好的自动化方案,因为业务系统差异太大,但rear至少会尽量保留原系统的网络配置结构,迁移后的网络调整基本可控,不至于完全不可收拾。
3. 实操过程:从安装到完成一次可用的系统备份
3.1 安装rear并配置初始环境
rear在主流发行版里都能直接装。以Rocky Linux 9为例:
bash复制dnf install rear -y
Debian/Ubuntu系统则用:
bash复制apt install rear -y
安装完成后,rear的主配置文件是/etc/rear/local.conf。我们可以先看看默认配置,但通常要做大量修改。rear的配置项非常多,最核心的几个概念包括:OUTPUT定义恢复介质输出方式(ISO、PXE、RAM Disk等)、BACKUP定义数据备份方式(NETFS内置tar、BACULA、BAREOS等)、BACKUP_URL定义备份归档存储位置。
我在生产环境中常用的初始配置是这样写的:
bash复制OUTPUT=ISO
BACKUP=NETFS
BACKUP_URL=file:///backup/rear
这里先用本地目录把流程跑通,后续再改成真正的远程存储。另外有一点一定要记住,无论OUTPUT和BACKUP怎么配,都需要给rear指定一个唯一的系统ID,避免多台机器备份到同一目录时互相覆盖:
bash复制HOSTNAME=web-server-01
你没看错,rear确实会按主机名区分备份目录。如果你不设置而机器又恰巧没有合理的主机名,恢复时选错备份包的概率会成倍上升。
3.2 备份方案配置:从本地目录切换到NFS
本地目录备份只能算是练习,真正的灾备必须有异地或至少是独立于本机的存储。我强烈建议直接上NFS,不仅配置简单,恢复的时候也最省心。恢复介质启动后,直接挂载NFS就能读到备份归档,不需要在救援环境里配置额外的云存储凭证。
NFS服务端的搭建这里不展开,我默认你有一台NFS服务器,导出了/data/rear这个共享目录。客户端也就是被备份服务器,先确认能挂载:
bash复制mount -t nfs nfs-server:/data/rear /mnt
touch /mnt/test-write && rm /mnt/test-write
umount /mnt
能写能删才说明权限没问题。然后修改local.conf:
bash复制OUTPUT=ISO
BACKUP=NETFS
BACKUP_URL=nfs://nfs-server/data/rear
BACKUP_OPTIONS="nfsvers=4"
NETFS_KEEP_OLD_BACKUP=yes
最后一个参数NETFS_KEEP_OLD_BACKUP=yes非常关键,它能在新备份完成后保留上一份归档,避免你上一次备份失败或备份过程中系统崩溃导致连一份旧的可恢复数据都没有。虽然会增加存储占用,但安全冗余在灾备场景里永远值得。
3.3 配置文件细节:哪些目录必须排除
刚接触rear的人最容易犯的错就是把所有目录都塞进备份。理论上rear在备份时会排除一些明显不需要的内容,比如/proc、/sys、/dev这些虚拟文件系统,但有些真实存在的目录你需要自己决定是否排除。
我建议在配置里加上这样一段:
bash复制BACKUP_PROG_EXCLUDE=(
"/tmp/*"
"/var/tmp/*"
"/var/cache/*"
"/var/log/*"
"/usr/local/src/*"
"/backup/*"
"/var/lib/libvirt/images/*"
)
为什么要排除这些目录?/tmp、/var/tmp这些本来就是临时文件,备份没有意义。日志文件如果你有专门的日志采集系统可以不备份,但如果你没有,我建议只排除轮转后的旧日志,比如/var/log目录下保留最近几天的日志其实是可接受的。需要特别注意的是,排除/var/lib/libvirt/images这种目录的前提是你对虚拟机镜像另有备份方案,否则等于把虚拟机的数据全丢了。生产环境里,镜像文件可能几百个GB,硬塞进系统备份既拖慢备份速度,也放大恢复时磁盘空间不足的风险,所以一定要想清楚再排除。
另外,如果你有数据库,强烈不建议把数据库数据目录放在系统备份里。因为文件系统级备份不保证数据库文件的一致性,可能备份出来的是写了一半的数据文件。数据库应该用mysqldump、pg_dump或存储快照等方式单独备份,rear主要负责把操作系统和基础环境恢复起来。
3.4 执行mkbackup,并把介质保存到安全位置
配置完成后,执行备份的命令很简单:
bash复制rear -v mkbackup
这条命令会同时生成恢复ISO和备份归档。你会看到rear先收集系统信息,然后创建恢复介质,接着进行数据备份。首次备份通常比较耗时,因为要遍历所有未排除的文件。我一般在业务低峰期做首次全量备份。
生成的ISO在/var/lib/rear/output/目录下,归档在/var/lib/rear/output/对应的主机名目录里。如果你配置了BACKUP_URL,归档会同步过去。
这里有一个经验之谈:ISO生成后要把它复制到安全的地方,不要只留在本机。因为灾难场景下,你甚至连机器都开不了,ISO若只在本机就等于没有。我通常会写一个cron任务,把ISO每月重建一次,并推送到NFS和一台跳板机兼作备份留存。这样原机器完全损坏时,只要手头有能用的ISO,配合NFS里的归档就能恢复。
备份介质还有一个容易被忽视的点:要定期验证ISO本身能启动。我曾经遇到过生成的ISO在KVM里可以引导,但在物理机的UEFI模式下死活起不来,后来发现是引导方式兼容性问题。如果你有物理机条件,一定要抽一台备用机实际引导一次,比什么都管用。
4. 恢复与迁移演练:把一台机器“搬”到另一台机器
4.1 模拟灾难场景
我用的实验环境如下:一台VMware虚拟机作为源系统,分区结构为boot分区加LVM根分区,系统是Rocky Linux 9,运行了一个简单的Web服务,生成了几份测试数据。现在把它当成一台完全崩溃的服务器来处理。
模拟灾难的方式很粗暴:直接把虚拟机关机,然后破坏它的引导。我习惯的做法是用一个空白的虚拟磁盘替换原系统的系统盘,保留数据盘在另一块磁盘上,并确保新磁盘容量和老磁盘不一样,以此模拟硬件变更。这样恢复的时候,rear需要面对全新的磁盘布局和容量差异,比“同一块盘恢复”这种演练有意义得多。
4.2 从recovery ISO启动恢复到原机
把ISO挂载到虚拟机的CD-ROM上,从CD-ROM引导。rear的救援系统启动完成后,会自动进入一个菜单界面。选择“Recover”后,它开始探测备份归档所在的位置。
如果你用的是NFS备份,在提示时选择网络配置,输入NFS服务器地址和共享路径,rear会挂载共享并列出可用的备份。选对主机名和时间戳后,rear就会读取系统元数据,然后开始磁盘分区。
这里要仔细看rear输出的分区计划。它会把原磁盘的分区结构按比例映射到新磁盘上。如果新磁盘更大,它会自动扩展最后一个分区的空间;如果更小,它会警告你空间不足。我建议在它执行分区前,逐项确认分区目标和挂载点,避免把数据恢复到错误的磁盘上。
分区和格式化完成后,rear开始恢复数据,这个过程就是解压归档。等它全部恢复完毕,会自动重新安装引导程序。完成之后,重启系统,拔掉ISO,理论上就能进入原来的系统。
4.3 异机迁移注意事项
如果你迁移的目标机器硬件差异较大,尤其是网络控制器和显卡不同,首次启动可能会出现异常。我遇到的最典型情况是网络服务启动失败,因为原系统配置的网络接口名在目标机器上不存在。这时候可以进入系统,用NetworkManager重新配置网络接口,并在/etc/default/grub中更新内核的net.ifnames参数,然后重建grub配置。对于实际生产环境,我更推荐在迁移前就把网络配置改成使用一致的接口命名策略或干脆依赖NetworkManager的自动连接,这样能少掉很多麻烦。
另一类常见问题是UEFI和传统的BIOS引导方式不一致。原机器是BIOS引导,目标机器只支持UEFI启动,或者反过来,恢复后引导会失败。处理方法是让恢复介质在目标机器上启动时,确保目标机器BIOS设置与恢复后系统的引导方式一致。最稳妥的办法是事先知道目标机器的引导方式,在原系统生成介质时把必要的引导文件都准备好。rear在2.6以上版本对UEFI的支持已经相当成熟,能自动处理大多数场景,但实际恢复前做一次演练仍然非常值得。
4.4 验证恢复结果
恢复完成、系统重启后,不要急着欢呼。我有一套固定的验证清单,照着走一遍才算恢复成功。
text复制1. 系统能否正常启动到登录界面
2. 网络连接是否恢复,IP地址是否与预期一致
3. 所有关键分区是否都正确挂载,尤其是有没有分区丢失
4. 启动目标(systemd default target)是否正常加载服务
5. 业务应用是否启动,数据文件是否存在且内容正确
6. 日志里有没有大量I/O错误或文件系统错误
7. 根文件系统的挂载选项、UUID是否有异常
只有这些都确认无误,我才会宣布恢复完成。在实际工作中,我见过不少备份工具恢复后机器能开机,但数据库表结构丢失、权限错乱、应用连不上数据库的情况。所以验证环节一定要做业务级的检查,不能只看“能开机不蓝屏”就完事。
5. 常见问题与排查技巧实录
5.1 恢复后启动卡在“root device”或dracut提示找不到根文件系统
这是rear恢复后最经典的一个问题,表现为系统在initramfs阶段卡住,报类似“unable to find root device”的错误。原因是新环境的磁盘标识与原系统的UUID不一致,或者initrd里缺少对应文件系统模块。
排查时,先在救援模式下手动查看磁盘和UUID:
bash复制lsblk -f
blkid
然后确认/etc/fstab里写的UUID在不在现有磁盘上。不在,说明恢复时磁盘布局重建出了问题,通常是因为分区方式发生了偏移。此时不要直接改fstab,而是回到恢复环境,重新检查元数据里的分区配置,看看是否有分区被跳过。
如果UUID存在但系统仍然找不到根设备,问题多半是initrd里缺模块。这时可以从恢复介质进入救援环境,chroot到已恢复的系统,重建initramfs:
bash复制chroot /mnt/sysroot
dracut --force --regenerate-all
记得生成initramfs之后,同时重建grub配置:
bash复制grub2-mkconfig -o /boot/grub2/grub.cfg
耐心做完这两步再重启,大多数场景都能修复。
5.2 网络驱动缺失导致备份或恢复时连不上NFS
恢复介质虽然集成了很多驱动,但总有些较新的网卡不在里面,导致你在恢复环节配置网络时发现根本没有网卡接口,也就无法挂载NFS。
遇到这种情况不要慌,先确认恢复环境能不能识别到PCI设备:
bash复制lspci | grep -i ethernet
如果能看到网卡但没有驱动,说明介质里缺少相应内核模块。解决方法是,在源系统上找到对应模块名称,提前把模块加入rear的MODULES配置,重新生成介质:
bash复制MODULES_LOAD=(
"r8169"
"igb"
)
如果你不确定模块名称,可以先在源系统上查看:
bash复制lsmod | grep -i eth
把用到的驱动模块全部加入配置。另一个更省事的办法是直接把MODULES设置成包含所有可能用到的模块:
bash复制MODULES=( 'all_modules' )
这个配置会让恢复介质体积明显变大,但兼容性会好很多。我建议在迁移场景下用这个,平时日常备份则用默认配置,保持介质轻量。
5.3 磁盘空间不足导致恢复失败
恢复时rear会按照原系统的分区大小比例在新磁盘上创建分区。如果你的新磁盘比原磁盘还小,或者目标磁盘空间被其他分区占用,rear在检查磁盘空间时会报错,中断恢复。
这个问题没有太多高级技巧,最直接的办法是换一块更大的磁盘,或者在恢复前调整元数据和分区方案。rear提供了layout重新分配的功能,在恢复菜单里你可以选择手动分区。此时可以进入分区界面,把某些分区缩小一些,或者删除不必要的分区给根分区腾出空间。
从这个角度来说,我建议平时在配置rear时,不要把根分区设置得极小。因为恢复时是一整套系统原样落地,如果原系统根分区使用率是70%,你试图缩到50%的空间,恢复结果大概率是不稳定的。
5.4 硬件RAID/HBA驱动问题
物理服务器上做灾备,最容易出问题的就是RAID卡和HBA卡的驱动。恢复介质如果是虚拟化环境下生成的,往往不包含真实物理服务器的RAID驱动,导致在物理机上启动介质时光纤卡、SAS控制器根本没被识别,自然看不到磁盘。
解决办法是给rear加入RAID厂商提供的驱动。例如某厂商的RAID卡使用的是megaraid_sas模块,直接在配置里加:
bash复制MODULES_LOAD+=( megaraid_sas )
这一条原则同样适用于NVMe控制器、多路径软件等环境。在真实物理机上做恢复演练前,一定要先在终端里用modprobe确认驱动能被正确加载,不要等到灾难发生时再来研究这些。
另外,如果业务环境使用了多路径存储,一定要在配置里显式加入多路径支持:
bash复制REAR_INITRD_NEW_MODULES=(
"dm_multipath"
"dm_round_robin"
)
多路径环境下如果没有启用对应模块,恢复后的系统可能无法识别被多路径软件管理的磁盘,表现出的现象就是启动时找不到根分区。
5.5 定时备份与审计:让rear真正可落地
手动备份永远无法形成真正的灾备体系。我建议把rear接入cron,按业务需求设定备份周期。一个典型的定时任务是每天凌晨2点执行:
bash复制30 2 * * * /usr/sbin/rear mkbackup >/var/log/rear-backup.log 2>&1
但仅仅是定时执行还不够,必须添加执行后的校验机制。我通常会在cron任务后面加一条检查命令,判断本次备份是否成功生成新的归档,并发送到监控系统。例如检查归档目录里的文件时间戳是否更新,超过48小时没有新归档就告警。
另外,备份介质和归档的体积会随着系统变化而增长。建议在配置里启用rear的自动清理机制,控制保留的备份数量。NETFS_KEEP_OLD_BACKUP=yes配合RETENTION相关参数,可以只保留最近几份备份,避免存储空间被无限撑爆。
还有一项重要工作是定期做恢复演练。不要只在系统坏了才第一次跑恢复流程,半年或一年做一次实际恢复演练,把ISO启动、NFS挂载、分区恢复、系统启动完整走一遍,能提前发现很多配置过期、驱动缺失、依赖变化的问题。我见过太多“备份一直在跑,恢复时才发现原来一直没备份上”的悲剧,就是因为缺少演练这一环节。
6. 备份过程中可能干扰到业务的处理技巧
rear在备份大量文件时会占用CPU和磁盘I/O,尤其当系统文件比较碎片化时,备份进程会对生产环境造成可感知的影响。对于线上业务,我建议错峰执行,并限制备份进程的系统资源占用。
可以用ionice和nice降低优先级:
bash复制ionice -c 2 -n 7 nice -n 19 /usr/sbin/rear mkbackup
这样备份任务让出大部分I/O带宽给业务使用。如果你的业务压力确实很高,但又需要频繁备份,可以考虑使用快照存储(比如LVM快照)配合rear。具体思路是:先在LVM层做一份系统逻辑卷的快照,然后从快照中导出数据再交给rear打包,这样业务系统完全不受影响。这个方法在窄I/O环境下实测非常有效,但配置复杂度会上升,需要你在具体环境里权衡。
另一个容易踩的坑是备份过程中恰好有文件被修改,导致tar读取文件时出现警告或错误。rear默认对这类情况有一定容错,但为了保险起见,备份前最好通过服务自身的机制先做一次系统文件缓存刷新或者短暂锁库。不用追求绝对一致性,因为rear更多是系统级灾备,不是数据库事务级备份工具。
7. 一些配置上的细节补充
7.1 OUTPUT=ISO与PXE的选择
如果你有几十台服务器需要灾备,每一台都用ISO介质恢复,运维成本会比较高。这种情况下可以配置PXE启动方式,让所有服务器的恢复介质统一由PXE服务器下发,备份出现问题时只需在BIOS里选择网络启动,就会自动加载对应主机的恢复环境。
配置PXE输出时,local.conf大体如下:
bash复制OUTPUT=PXE
BACKUP=NETFS
BACKUP_URL=nfs://nfs-server/data/rear
PXE_TFTP_URL=tftp://tftp-server/var/lib/tftpboot
PXE_CONFIG_URL=tftp://tftp-server/var/lib/tftpboot/pxelinux.cfg
PXE模式下,每台主机生成的启动文件会被拷贝到TFTP目录,恢复时通过PXE菜单选择对应主机即可。这种方式在批量场景下省去了所有来回插光盘的麻烦,恢复速度明显提升。不过PXE对网络环境有强依赖,管理网络不稳定时反而添乱,所以要不要上PXE,取决于你基础设施的网络可靠性。
7.2 恢复后的时间同步和系统标识
恢复完成后,你会发现系统时间可能停留在备份时刻,或者与NTP失联。这是因为恢复环境没有继承原系统的时间状态。重启进入系统后,第一时间确认时间同步是否正常,运行:
bash复制timedatectl
chronyc tracking
如果时间偏差过大,很多依赖票据和证书的服务会直接不可用。另外,如果原系统有SSH主机密钥、机器ID等唯一标识,恢复后这些文件也会被还原。从安全角度考虑,我建议恢复完成后重新生成SSH主机密钥,避免多台恢复出来的机器拥有相同密钥导致中间人风险:
bash复制rm -f /etc/ssh/ssh_host_*
systemctl restart sshd
同理,/etc/machine-id也可以考虑重新生成,尤其当你使用systemd相关的基于机器标识的功能时,重复的machine-id会带来各种莫名其妙的冲突。
7.3 备份归档的加密与权限
NFS共享目录如果权限控制不当,任何能访问NFS的人都能下载到你的完整系统归档,这等于把服务器的所有数据拱手送人。我建议在NFS服务端做好严格的allow列表,并且只允许运维IP访问。如果归档数据属于高敏感级别,可以考虑在备份后对归档做加密处理,或者把rear的数据备份交给支持加密的备份存储方案。
同时,/var/lib/rear/output目录下的本地归档也要设置好权限,避免普通用户直接读取到系统敏感配置文件。在我实际管理中,这些备份归档的权限一律设置为700,归属于root,防止内部信息泄露。
8. 个人使用体验与建议
rear这个工具我实际用了几年,从最初只是用来做实验环境的快速重建,到后来真的在一台物理服务器硬盘损坏时把整个系统恢复到新机器上,整个过程虽然紧张,但最终有惊无险。那次经历让我确信,一个有效的灾难恢复方案,在关键时刻远比平时那些“高可用”宣传更值得信赖。
如果你想试试,不要等到生产系统出问题才行动。建议先在一台虚拟机里完整跑通备份、破坏、恢复、验证这个闭环,然后再逐步扩展到更复杂的场景。一旦掌握这套流程,你对Linux系统“重装一下就好了”的那份不安感就会少很多。
最后一个小建议:把rear生成的ISO和备份归档放在不同机房或至少不同故障域里。灾难恢复的本质是应对低概率但高破坏性的事件,如果你把所有鸡蛋放在同一个篮子里,那这个方案本身就不是真正的灾难恢复方案。
