发现问题

昨儿接到一个事件工单,项目组说服务器root登陆不上了,其他用户sudo也用不了。最高权限没了? 臣等正欲死战,陛下何故先寄?

值班大哥进入服务器一看,他宝贝的大聪明,把/etc/passwd里面第一行root的配置信息删掉了

我第一行root呢.webp

正常应该是这样的,root在第一行

正常的passwd.webp

root用户没了,系统识别不到了,自然sudo也就用不了了。

寻思这下死局了,没root权限改不了/etc下的文件,但不把passwd改回来,root用户又回不来。

我当时的想法是,注意到/etc下所有文件的文件所有者是一个名为coupon的自建用户,而非root,便想着切换到coupon用户,去把passwd文件改回来。或者用u盘/镜像启动临时linux系统,挂载本地硬盘,把passwd改回来。但这种做法仅限物理机能用,云上虚拟机没法插U盘,从外置设备启动。

大哥的想法是从单用户模式启动,改回passwd文件。

事实证明,我——不行!大哥——行!

我的办法

我的想法其实比较简单,核心思路还是,系统内操作不了就借助系统外的方式。换个中二点的说法就是,"从世界之外取得否定世界的力量"。

在装linux系统时,无论是用u盘安装还是光驱安装,都会运行起一个在外置设备里临时的linux系统,供执行安装脚本以及用户试用。这时运行的系统不属于电脑硬盘,对硬盘上的分区可以随便读写。也就借此方式,恢复原系统里被损坏的文件,正常开机。

这种做法还是有一点麻烦,并且仅限物理设备可以这么干。若是云上的虚拟服务器,没办法插u盘,有些也不能挂载镜像启动,更没有bios来设置启动项。第一部分所述问题的机器就是虚拟服务器。

单用户模式

单用户模式,也被称为维护模式,超级用户可以在此模式下恢复/修复系统问题。

通常情况下,这类问题在多用户环境中修复不了。系统可以启动但功能不能正常运行或者你登录不了系统。

——摘自 Linux中国

单用户模式也是一种"世界之外的力量",但没那么外,毕竟运行的还是本地硬盘的系统,还在三界之内五行之中。虽然没那么外,但权限足够大,修理崩坏的系统已经够用了。

进入单用户模式的方法是,在系统开机后,进入grub启动引导界面时,选择一个正常的启动项,按e进入编辑模式,编辑这个启动项的信息。

在linux开头的一行末尾,空格,追加一点东西进入单用户模式。这个追加的东西...网上说法不一,有说加个1就行,因为1是单用户模式的系统运行等级;有说加single的;也有说加rd.break的。

加了后,按Ctrl+x,以编辑后的启动项启动。

我在CentOS上进行了尝试,加1和single进入的系统,是以root用户登录的,但这台出问题的机器root已经寄了,不行。所以这两种方式启动后,提示密码数据库读取失败,然后卡死。唯有第三种方式,加"rd.break"再启动能成功。

(因为已经操作完了,所以借网图一用)

进入单用户模式.webp

启动后的用户虽说是root用户,但并非系统里的root用户,根目录也并非真正的系统根目录。通过mount指令可以看到,真正的系统根目录其实挂载到了/sysroot目录下,并且是只读的。这里可以简单地认为单用户模式是系统之外的系统。

执行,重新挂载根目录可读写。

mount -o remount,rw /sysroot

然后就可以进入本机系统的根目录,将损坏的文件更改回来,救回本机系统了。如果能救的话

扩展思考

事实上这篇文章如果只是提供思路和方法的话,写到这里就已经差不多了。但我认为可以扩展思考一下,单用户模式是一种较为通用的,解决系统崩溃问题的方式。不单是应对修改配置文件这一种情况,还能解决链接错误,依赖混乱等一系列导致系统不正常的问题。

上一次我试图手动更新系统的ld-linux.so.2文件,这是个位于/usr/lib下的链接文件,用于动态链接库的加载。我的操作分两步,第一步是移除当前链接文件,第二步是创建新链接文件,链接到更新的ld-linux.so库。但执行完第一步的时候就寄了,移除后,啥指令都执行不了了,然后看着系统死掉。

我什么都做不到.webp

最后是通过U盘启动个linux系统,把本机系统里的文件链接改回去才救回的。如果那时知道可以用单用户模式来救的话,其实就不用这么麻烦了。