除了 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 |
