glibc 误删恢复

除了 rm -rf /,还有一个 rpm -e glibc --nodeps 也是一键吃牢饭的那种。

起因

隔壁组的小哥哥执行软件安装操作时,要升级 glibc,可是执行时,却先来了个一个删除操作 rpm -e。当然,结果可想而知,除了当前的 SSH 会话还能保持,其他的都不能连接,各种内置命令比如 lscp 等也失效了。嗯,允许干掉核心包的系统让人觉得不可思议,但是执行这个操作的人也是匪夷所思,无知者无畏。

方案

知道了原委,开始寻找解决方案:

重装

这肯定是最快,最好,也是最稳妥,但是后续的工作也是比较麻烦的,特别是上面跑着很多的业务或者数据量比较大一时间难以备份。

busybox

搜索到了一篇文章:如何拯救一台glibc被干掉的Linux服务器?,说是用此工具还是可以的,后续可以装上 dropbear 进行 ssh 等操作,但是这里的前提是 ssh 会话没有断开。在文章以及评论中的方法都很受教。采用将 busybox 文件转为 16 进制字符串的形式,然后开始用脚本输出到文件进行恢复,不过还是因为 chmod 不能执行,导致命令没有 +x 的权限。最后的解决方案也是很有意思,覆盖系统原始的 cp 命令:printf '...' > /bin/cp,因为它是由 x 权限的,所以 cp 就是 busybox 了。之后的操作就很神奇了,具体可参考这篇文章以及评论。

别忘了,argv[0]为cp时,busybox就是在做cp的事情!

arg[0]参数就是你在shell里运行这个程序时敲入的程序的名字。比如运行cp x x.bak,那么arg[0]是”cp”,比如运行rm -rf x,arg[0]就是”rm”。而busybox是一个神奇的东西…..通过传给他的arg[0]参数确定自己要干什么。arg[0]是cp就会干一切cp该干的事情,arg[0]是ln就会摇身一变变成ln,以此类推。你可以当他是百变怪…….如果你在shell里把busybox重命名成cp,busybox就开始做cp该做的事情,重命名成mv,就变成了mv。除了重命名,软连接/硬连接应该也可以。

救援模式

因为是物理机器,也没有什么备份,但是系统也进不去了,所以本着死马当活马医的心态,重启后尝试进入系统自带的救援模式,但是残念,所以只好用系统镜像引导。这里用 rufus 进行制作,但是需要注意的一点就是完成后,U 盘的卷标(label)应该是 CentOS 7 x86_64,如果不是修改成一个任意的名字,比如 centos7

上述工作完成后,设置从 U 盘启动,然后进入菜单,进行如下操作:

rescue mode

注意图片中绿色字体处,此处按 TAB 可以编辑启动菜单,指定启动位置和卷标,如果这里和上面制作的 U 盘卷标没有对应,那么回车进入的界面就不是 shell 界面,而是 dracut。如果进入 dracut,我们可以进行如下操作:

1
cd dev && ls

找到 sd 开头的,U 盘一般为 sdb4

sdb4 指是我的电脑设备上的 U 盘,sda 指第一个挂载盘,sdb 指第二个挂载盘,sdc 指第三个挂载盘,依此类推。每台电脑上的 USB 挂载名称不一样,要视情况而定选择挂载盘。通常情况下,我们不知道 U 盘挂载名称,这时候,可以将文字改为
vmlinuz initrd=initrd.img linux dd quiet
回车后,屏幕会出现挂载盘选择的的界面,该界面会显示,挂载盘名称(DEVICE)、类型(TYPE)、标识(LABEL)等信息,通常情况下选择标识为 CentOS 的就 OK,也可以一个一个试。这时候记下挂载盘名称,重启电脑,启动进入 U 盘,出现系统安装选择界面,按 Tab 键,修改
vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet

vmlinuz initrd=initrd.img inst.stage2=hd:/dev/挂载盘名称 quiet

最后按 Enter 就能进入 CentOS 安装界面了。

重启,进入图中绿色字体所指示的界面时,按 TAB 编辑,会有类似的行:

1
inst.stage2=hd:LABEL=CentOS\x207\x20x86_64 rd.live.check quiet

\x20 对应的字符为空格,所以这里有几种改法:

  • 修改 U 盘的卷标为 CentOS 7 x86_64,这里搜索到说系统原因可能超长
  • 替换 LABEL 为 U 盘的卷标,如 centos7,前提是得设置了
  • 前述我们在 dracut 中已经查找到设备的序号 sdb4,所以此处可以此处可以改为 inst.stage2=hd:/dev/sdb4 quiet,然后回车即可

进入到 shell,就好办了,参考链接

1
2
3
4
5
6
mkdir media
mount /dev/sdb4 media
cd media/Package
rpm -ivh glibc*.rpm --root /mnt/sysimage --nodeps --force

reboot
-------------本文结束感谢您的阅读-------------