这里的方法适用于你可以接触到机器bootloader(比如GRUB2)阶段的情况,比如你忘记了自己身边机器的密码,或者是vultr这类提供能看到启动过程的VNC画面的VPS,因为不知道密码要修改linux内核的启动参数,只能从这里下手。
不管你用什么方法接触到了bootloader,这里以常见的GRUB为例,在GRUB界面读秒的时候按下e
健,便可以中断读秒并进入当前启动项的编辑界面。
将光标移动到加载内核那一行的末尾,也就是一般内容为linux /boot/vmlinuz-xxxxxx root=xxxxx
那一行,然后在这里加入以下内核参数:
init=/bin/bash
init=
参数的作用是指定根文件系统中init程序的路径,而此处填写的/bin/bash则使linux内核在挂载根文件系统后不去执行真正的init程序,而是去启动bash,这样我们就可以得到一个root权限的shell
需要注意的是,有些环境下使用bash会在启动后卡死,如果你遇到了这种情况,请尝试使用init=/bin/sh
作为替代。
接下来按下F10来让GRUB启动这个修改后的启动项,一会后就能看到屏幕上出现了一个root的shell提示符,在这里我们就能以root权限来执行各种命令了,但此时的根文件系统往往还只是只读(ro)的状态,为对系统进行修改,我们需要使用下面的指令来以读写(rw)模式重新挂载根文件系统:
mount -o rw,remount /
接下来我们就可以对系统为所欲为了,使用passwd
指令即可直接更改root密码。
做完所有你想做的事后,由于没有真正的init进程,你无法通过shutdown
或reboot
等指令来重启系统,所以我们需要更加简单粗暴一些,在执行几次sync
指令确保文件缓存已写回磁盘后,使用exit
潇洒地结束掉bash——这个目前系统中唯一的进程,留下一个一脸蒙蔽的Linux内核在那里kernel panic。