除了 rm -rf /
,还有一个 rpm -e glibc --nodeps
也是一键吃牢饭的那种。
起因
隔壁组的小哥哥执行软件安装操作时,要升级 glibc
,可是执行时,却先来了个一个删除操作 rpm -e
。当然,结果可想而知,除了当前的 SSH
会话还能保持,其他的都不能连接,各种内置命令比如 ls
、cp
等也失效了。嗯,允许干掉核心包的系统让人觉得不可思议,但是执行这个操作的人也是匪夷所思,无知者无畏。
方案
知道了原委,开始寻找解决方案:
重装
这肯定是最快,最好,也是最稳妥,但是后续的工作也是比较麻烦的,特别是上面跑着很多的业务或者数据量比较大一时间难以备份。
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 盘启动,然后进入菜单,进行如下操作:
注意图片中绿色字体处,此处按 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 | mkdir media |