ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

误删/usr后如何用CentOS U盘救援并恢复系统

误删/usr后如何用CentOS U盘救援并恢复系统

1. 误删 /usr 到底意味着什么

1.1 为什么 /usr 被删比想象中更致命

很多人第一次听到“误删 /usr”会觉得,不就是个放用户程序的目录吗,删了再装回来不就行了。这个理解偏差非常危险。在 CentOS 这类传统 Linux 发行版里,/usr 早已不是早期 Unix 那种“用户家目录”的概念,它承载的是整个系统绝大部分的可执行文件、库文件、共享资源、头文件、文档以及大量系统级工具。真正属于用户个人的数据通常在 /home 下,而 /usr 里装的是让系统“能跑起来”的东西。

我打个比方:如果把操作系统比作一家餐厅,/boot 是门锁和钥匙,/etc 是规章制度和菜单,/var 是仓库和流水账,那 /usr 就是整个后厨——灶台、刀具、锅碗、调料架全在里面。你把后厨整个搬空,餐厅还开着门,但什么都做不了。更麻烦的是,CentOS 的包管理器 yum/dnf、基础命令 ls、cp、vi、甚至 bash 本身,很多都依赖 /usr/bin 和 /usr/lib。一旦 /usr 被清空,你连“重新安装”这个动作都很难执行,因为执行安装的工具本身可能已经没了。

所以这类故障的核心矛盾不是“数据能不能找回来”,而是系统已经失去了自我修复的能力。你无法在系统内部完成修复,必须借助外部介质把系统“救活”,再谈恢复。这也是为什么标题里特意强调“包含制作系统 U 盘”——没有可引导的救援介质,后面所有操作都无从谈起。

1.2 误删之后系统通常表现成什么样

根据我处理过的类似情况,误删 /usr 后系统表现分几种典型状态,判断清楚处于哪种状态,直接决定你该走哪条恢复路线。

第一种是当前会话还活着,但新命令全部失效。因为已经加载进内存的进程还在跑,你当前的 shell 可能还能敲字,但一执行 ls、cp 就报 “command not found” 或者 “No such file or directory”。这种情况说明动态库和二进制已经被删,只是内存里的进程还没退出。

第二种是执行任何命令都提示库文件缺失,比如 “error while loading shared libraries: libc.so.6”。这是因为 /usr/lib64 下的核心库没了,连动态链接器都找不到依赖。

第三种是系统直接无法正常启动,卡在启动阶段,或者进入紧急模式(emergency mode)后依然无法操作。这通常是因为 systemd、基础服务依赖的二进制被删。

第四种最隐蔽:看起来还能用,但重启后彻底起不来。有些人删完发现当前还能操作,就以为没事,结果一重启才发现系统已经废了。所以我的第一条经验是:一旦确认 /usr 被删,不要抱侥幸心理,不要重启,先评估当前会话还能做什么,能抢救的信息先抢救。

1.3 恢复思路的整体框架

这类故障的恢复,本质上是一个“先救活、再修复、后验证”的三段式流程。我把它拆成四个阶段:

  • 阶段一:止损与评估。停止一切写操作,确认删除范围,判断当前系统是否还能执行基本命令,记录下重要的配置信息(如果还能读)。
  • 阶段二:制作可引导救援介质。用另一台正常机器制作 CentOS 安装 U 盘,这是整个恢复的“入场券”。
  • 阶段三:进入救援环境执行修复。通过 U 盘引导进入救援模式(rescue)或直接重装,把系统恢复到可用状态。
  • 阶段四:数据与配置的找回与验证。系统能起来之后,把之前备份或抢救出来的配置、数据放回去,逐项验证服务。

这里要提前说清楚一个现实:如果 /usr 是被 rm -rf 彻底删除且没有快照、没有备份,那么“原样恢复”几乎不可能,能做的通常是重装系统 + 恢复数据 + 重建配置。网上有些说法声称能“完整还原 /usr”,那基本都建立在有 LVM 快照、有备份、或者文件系统层面还能找回 inode 的前提下。对普通用户来说,务实的预期是:系统重装,数据尽量保住。

2. 制作 CentOS 系统 U 盘的关键细节

2.1 为什么必须用 U 盘而不是其他方式

有人会问,能不能用网络引导(PXE)、能不能用另一块硬盘引导。这些方式在特定环境下可行,但对绝大多数个人和小团队场景,U 盘是最可控、门槛最低的方案。PXE 需要你事先搭好 DHCP 和 TFTP 服务器,而故障机器现在连系统都进不去,你没法在它上面配这些。用另一块硬盘引导则需要你有一块已经装好系统的硬盘,且能挂到故障机器上,硬件兼容性也是问题。

U 盘方案的优势在于:制作一次,到处能用;引导兼容性好;容量要求低(CentOS 的安装镜像大约 8 到 10 GB,一个 16 GB U 盘足够)。而且制作过程在另一台正常机器上完成,完全不依赖故障机器。

2.2 镜像选择:DVD、Everything 还是 Minimal

CentOS 的安装镜像有好几种,选错了会在救援时抓瞎。我整理一个对照表:

镜像类型体积包含内容适用场景
Minimal约 1 GB最小安装包只做基础系统,救援时工具少
DVD约 4-10 GB完整安装包 + 救援工具推荐,救援模式工具齐全
Everything约 10 GB+全部软件包需要离线装大量软件时用
NetInstall约 700 MB仅引导,需联网网络好且能联网时用

做救援 U 盘,我强烈建议用DVD 版。原因是救援模式(rescue mode)下需要挂载系统、可能需要 chroot、可能需要重装基础包,DVD 里自带的 rpm 包和工具最全。Minimal 版虽然小,但救援时你会发现很多命令都没有,反而添堵。

另外要注意 CentOS 的版本演进。CentOS 8 之后官方重心转向 CentOS Stream,CentOS 7 也已停止维护。如果你手上是 CentOS 7,尽量用 7 的最后一个稳定版本镜像;如果是 CentOS 8 或 Stream,用对应版本。救援介质的大版本最好和故障系统一致或接近,跨大版本救援可能出现库不兼容。

2.3 制作工具的选择与实操

制作 U 盘的工具,Windows 下常用 Rufus、balenaEtcher,Linux 下直接用 dd 命令。我分别说下要点。

Windows 下用 Rufus:插入 U 盘,Rufus 会自动识别。分区类型选 GPT 还是 MBR,取决于故障机器的引导方式。较新的机器用 UEFI,选 GPT;老机器用 Legacy BIOS,选 MBR。文件系统选 FAT32 或 NTFS 都行,Rufus 写入时会按镜像要求处理。点击开始后它会提示会清空 U 盘数据,确认即可。整个过程大约 5 到 15 分钟,取决于 U 盘速度。

Linux 下用 dd:这是最“原教旨”的方式,也最可靠。先确认 U 盘设备名,用lsblk看清楚,千万别写错盘。假设 U 盘是 /dev/sdb,镜像文件是 CentOS.iso,命令是:

sudo dd if=CentOS.iso of=/dev/sdb bs=4M status=progress oflag=sync

这里有几个坑必须强调。第一,of=后面是整块磁盘设备(/dev/sdb),不是分区(/dev/sdb1),写错分区会导致 U 盘无法引导。第二,bs=4M是块大小,设大一点能加快写入,但别超过 U 盘和系统的承受范围,4M 是稳妥值。第三,oflag=sync保证数据真正落盘,避免拔盘时数据没写完。第四,执行前务必用lsblk反复确认设备名,我见过有人把系统盘当成 U 盘写了的,那场面相当惨烈。

提示:dd 命令没有任何“确认”步骤,回车即执行,写错设备名会直接覆盖目标盘数据。执行前把lsblk的输出截图或抄下来,确认无误再敲命令。

2.4 制作完成后的验证

U 盘做完不要直接拿去用,先验证一下。在制作机器上重新插拔 U 盘,看能否识别出镜像里的文件结构。更靠谱的方式是找一台可以随便折腾的机器,试着从 U 盘引导一次,看能不能进入 CentOS 安装界面。能进安装界面,说明 U 盘制作成功。

还有一个细节:有些机器 BIOS 里需要手动关闭 Secure Boot 才能从自制 U 盘引导,或者需要在启动菜单里选择 UEFI/Legacy 对应的 U 盘条目。这些在真正救援前最好心里有数,免得在故障机器前手忙脚乱。

3. 进入救援环境执行系统修复

3.1 引导进入救援模式的具体步骤

把 U 盘插到故障机器上,开机时按启动菜单键(常见的是 F12、F11、F10、Esc,不同品牌不一样),在启动设备列表里选择 U 盘。如果 U 盘同时有 UEFI 和 Legacy 两个条目,优先选和故障系统原本引导方式一致的那个。

进入 CentOS 安装界面后,第一个画面通常是语言选择。这里选中文或英文都行,不影响后续。接着会出现安装选项菜单,注意不要直接点“安装 CentOS”,那样会覆盖磁盘。要选择“Troubleshooting”(故障排除),然后在子菜单里选“Rescue a CentOS system”(救援 CentOS 系统)。

救援模式启动后,它会自动扫描硬盘上的系统分区,尝试找到已安装的 CentOS。找到后会提示你选择:

  1. Continue:挂载找到的系统到 /mnt/sysroot,进入可操作状态。
  2. Read-only mount:只读挂载,适合只想看不想改的情况。
  3. Skip to shell:跳过挂载,直接进 shell。
  4. Quit:退出重启。

如果系统分区还在、只是 /usr 被删,通常选 1 就能挂载。挂载完成后,救援环境会提示你可以 chroot 到 /mnt/sysroot 进行操作。chroot 是关键一步,它让你在救援环境里“假装”进入了故障系统,这样执行的命令、安装的包才会作用到故障系统上,而不是救援环境本身。

chroot /mnt/sysroot

执行后如果提示符变了,说明进入成功。这时候你面对的就是那个“半残”的系统,但因为你用的是 U 盘里的工具,所以命令都能跑。

3.2 判断 /usr 的损坏程度

chroot 进去之后,第一件事不是急着装东西,而是评估损坏范围。先看 /usr 目录还在不在:

ls -la /usr

如果目录整个没了,或者里面空空如也,那基本可以确认是彻底删除。如果目录还在但内容不全,可能是部分删除,恢复难度低一些。

接着看关键文件是否还在:

ls /usr/bin/bash /usr/bin/ls /usr/lib64/libc.so.6

这几个是系统运行的命脉。如果 bash 都没了,chroot 环境本身可能都不完整,这时候要考虑从救援介质里拷贝基础文件,或者干脆走重装路线。

还要检查文件系统本身有没有损坏。如果删除过程中伴随异常断电或强制操作,文件系统可能不一致。可以用:

fsck -y /dev/mapper/xxx

不过 fsck 要在未挂载状态下跑,所以这一步通常在救援模式挂载之前做,或者对未挂载的分区做。顺序上要小心,别在已挂载的分区上跑 fsck,那会造成二次损坏。

3.3 用 yum/dnf 重装基础包的正确姿势

如果 /usr 只是部分损坏,系统还能识别 rpm 数据库,那可以尝试用 yum/dnf 重装核心包。前提是 rpm 数据库(/var/lib/rpm)还在,且 yum 本身还能跑。

先确认 yum 能不能用:

yum --version

如果报错,说明 yum 依赖的 Python 或库也缺了,这条路走不通,得换方案。如果能跑,可以尝试重装基础包组:

yum reinstall bash coreutils glibc filesystem setup

但这里有个现实问题:yum 重装依赖网络或本地仓库。救援环境下网络可能没配好,本地仓库又可能因为 /usr 被删而失效。所以更稳妥的做法是从 DVD 镜像挂载本地仓库。把 U 盘里的镜像挂载到某个目录:

mkdir /mnt/cdrom mount -o loop /path/to/CentOS.iso /mnt/cdrom

然后配置一个指向它的 repo 文件,再执行重装。这样不依赖网络,包来源也可控。

不过说实话,如果 /usr 被删得比较彻底,yum 重装这条路成功率并不高,因为依赖链太复杂,经常是装了这个缺那个。我个人的经验是:如果 /usr 目录整个消失,直接走重装系统更省时间;如果只是部分文件丢失,yum 重装值得一试。

3.4 重装系统时如何保住数据

决定重装的话,核心原则是:只格式化系统相关分区,不动数据分区。CentOS 默认安装时,如果 /home 是独立分区,重装时只要不勾选格式化 /home,里面的数据就能保住。同理,如果有独立的 /data 分区,也保留。

重装步骤上,从 U 盘正常进入安装流程,到分区那一步时选择“手动分区”(Manual Partitioning)。然后:

  • 找到原来的 /boot、/、swap 分区,标记为格式化并挂载到对应挂载点。
  • 找到 /home 或其他数据分区,只挂载,不勾选格式化。
  • 确认分区方案后继续安装。

这里最大的坑是:有些人图省事选了自动分区,结果整个盘被重新划分,数据全没。所以重装前一定要清楚自己原来的分区布局。如果之前没记录,可以在救援模式下用lsblk、fdisk -l、blkid把分区信息抄下来,再决定怎么装。

另外,如果原来的系统用了 LVM,重装时也要注意 LVM 卷组的处理。LVM 的好处是可以在不破坏数据的情况下调整,但操作不当也可能误删逻辑卷。对 LVM 不熟的话,建议重装前先把数据分区挂载出来,把重要数据拷到外部存储,再动手。

4. 常见问题与排查技巧实录

4.1 救援模式找不到系统分区怎么办

这是很常见的情况。救援模式扫描硬盘时提示 “No Linux partitions found” 或者找到的分区挂载失败。原因通常有几类:

第一,硬盘用了 RAID 或特殊存储控制器,救援环境缺少对应驱动。这种情况需要在引导时加内核参数,或者进 BIOS 把 RAID 模式改成 AHCI(如果业务允许)。

第二,分区表损坏。可以用parted或testdisk尝试修复分区表,但这一步风险高,操作前最好对整盘做镜像备份。

第三,LVM 卷组没被激活。救援模式下可以手动激活:

vgscan vgchange -ay

激活后再看 /dev/mapper 下有没有逻辑卷设备。

第四,文件系统类型不被支持,比如用了较新的 XFS 特性或 Btrfs。CentOS 7 默认 XFS,一般没问题,但如果是从别的发行版迁移过来的盘,可能遇到兼容问题。

4.2 chroot 之后命令还是找不到

chroot 成功但执行命令报 “command not found”,说明故障系统的 /usr/bin、/usr/sbin 确实空了,或者 PATH 环境变量有问题。可以先检查 PATH:

echo $PATH

正常应该包含 /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin。如果 PATH 正常但命令还是没有,那就是文件真没了。这时候可以从救援介质里临时拷贝一些基础命令过来应急:

cp /bin/bash /mnt/sysroot/usr/bin/ cp /bin/ls /mnt/sysroot/usr/bin/

但要注意,拷贝单个二进制往往不够,它依赖的库也要一起拷。更省事的办法是用busybox,它是一个集成了大量常用命令的单一二进制,静态编译,不依赖外部库。救援介质里通常有 busybox,拷过去就能用。

4.3 重装后服务起不来怎么排查

系统重装完,数据也恢复了,但服务起不来,这是另一个高频问题。原因通常是配置文件没恢复全,或者权限、SELinux 上下文不对。

排查顺序我一般这样走:

  1. 看服务状态:systemctl status 服务名,先看报什么错。
  2. 看日志:journalctl -u 服务名 -n 100,看最近的错误。
  3. 检查配置文件:对比备份和现有配置,看有没有遗漏。
  4. 检查权限:ls -lZ看 SELinux 上下文,重装后文件上下文可能变成默认值,需要restorecon修复。
  5. 检查依赖:有些服务依赖其他服务或端口,用systemctl list-dependencies看依赖树。

SELinux 这个坑特别隐蔽。重装系统后 SELinux 默认可能是 enforcing,而恢复回来的文件上下文不对,服务就会被拒绝访问。临时可以setenforce 0验证是不是 SELinux 的问题,确认后不要长期关闭,而是用restorecon -Rv /path修复上下文。

4.4 常见问题速查表

现象可能原因排查方向处理建议
救援模式找不到分区驱动缺失/分区表损坏/LVM未激活vgscan、parted、dmesg激活LVM或修复分区表
chroot后命令缺失/usr/bin为空ls /usr/bin从介质拷贝busybox应急
yum重装报依赖错误rpm数据库损坏rpm -qa 是否正常考虑重装系统
重装后服务拒绝访问SELinux上下文错误ls -lZ、ausearchrestorecon修复
数据分区挂载失败文件系统损坏dmesg、fsck未挂载时fsck修复
U盘无法引导Secure Boot/引导模式不匹配BIOS设置关闭Secure Boot或换引导条目

4.5 几条用血换来的避坑经验

第一条,发现误删后第一件事是停止写操作。很多人慌了之后还在系统里乱敲命令,甚至尝试“恢复软件”,结果把本来还能找回的 inode 覆盖了。正确做法是立即停止对故障盘的一切写入,能关机就关机(如果确定要送专业恢复),或者直接进救援模式只读挂载。

第二条,平时一定要有备份,而且备份要能验证。我见过太多人说自己“有备份”,结果真出事时发现备份是几个月前的,或者备份文件根本恢复不了。备份的核心不是“备了”,而是“能恢复”。定期做恢复演练,比备份本身更重要。

第三条,/usr 和 /home 分区的规划很关键。如果当初装系统时把 /usr 独立分区,误删后影响面会小一些,恢复也容易。虽然现在很多人图省事全放一个分区,但从运维角度,关键目录独立分区是值得的。

第四条,制作救援 U 盘这件事,最好在系统正常时就做好。等出事了再找另一台机器、再下载镜像、再制作,时间成本很高。我自己的习惯是,每台重要服务器都配一个对应版本的救援 U 盘,放在机房抽屉里,关键时刻能省几个小时。

第五条,rm -rf 这类命令,永远不要用绝对路径通配符。比如rm -rf /usr/*这种写法,一旦手滑多打一个空格变成rm -rf /usr /*,后果不堪设想。更安全的做法是进到目标目录再用相对路径,或者用find配合-delete并加确认。有些团队会给 rm 加别名或包装脚本,强制二次确认,这个习惯值得推广。

5. 恢复之后的加固与预防

5.1 把关键目录纳入监控

系统恢复之后,别急着庆祝,先把预防措施补上。最基础的是对 /usr、/etc、/boot 这些关键目录做完整性监控。可以用 aide、tripwire 这类工具,定期生成文件指纹,一旦有异常变动就告警。这样即使有人误操作,也能第一时间发现,而不是等到系统崩了才知道。

监控的粒度上,/usr 可以只监控目录结构和关键二进制,不必对每个文件做哈希,否则开销太大。/etc 则建议全量监控,因为配置文件改动频繁且影响大。

5.2 权限收紧与操作审计

误删往往发生在有 root 权限的会话里。所以权限管理上,日常操作尽量不用 root,需要时用 sudo 并记录。sudo 的日志默认在 /var/log/secure,可以集中收集分析。对于生产环境,还可以配置命令审计,记录谁在什么时间执行了什么命令。

另一个实用技巧是给危险命令加保护。比如把 rm 替换成一个包装脚本,执行前打印目标路径并要求输入确认字符串。虽然有点麻烦,但能挡住大部分手滑。

5.3 备份策略的落地建议

备份这件事,我建议遵循“3-2-1”原则:至少 3 份数据,2 种不同介质,1 份异地存放。对个人用户来说,可以简化为:本地一份、移动硬盘一份、云端一份。对团队来说,要有定期的全量备份和增量备份,并且备份文件要加密、要能快速恢复。

备份工具上,CentOS 自带 rsync、tar,足够做基础备份。更专业的可以用 borgbackup、restic 这类支持去重和加密的工具。关键不是工具多高级,而是备份任务要自动化、要有人负责、要定期验证。

5.4 一份可复用的应急清单

最后我把整个应急流程整理成一份清单,贴在机房或存进团队知识库,真出事时照着做能少走弯路:

  1. 确认故障:/usr 是否真的被删,删除范围多大。
  2. 停止写操作:不要重启,不要乱敲命令。
  3. 准备救援 U 盘:用另一台机器制作对应版本 CentOS DVD 启动盘。
  4. 引导进救援模式:选 Troubleshooting -> Rescue。
  5. 评估损坏:挂载系统,检查 /usr、rpm 数据库、文件系统。
  6. 选择恢复路线:部分损坏走 yum 重装,彻底损坏走重装系统。
  7. 保住数据:重装时只格式化系统分区,保留数据分区。
  8. 恢复配置与服务:从备份恢复 /etc 和业务数据,逐项验证。
  9. 加固预防:上监控、收紧权限、完善备份。

这套流程我在不同环境里跑过几次,每次细节会有差异,但主干是稳的。真正决定恢复成败的,往往不是技术多高深,而是平时有没有准备、出事时有没有章法。误删 /usr 这种事,遇上一次就够记一辈子,但只要救援介质在手、数据有备份、步骤清晰,它就从“灾难”降级成“一次麻烦的维护”。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进