重置 root 用户密码
忘记 root 密码是 Linux 用户常遇到的麻烦。好在只要能物理接触到机器,几乎总有办法把它改回来。下面按从简到繁的顺序介绍四种方法。
一、使用 sudo
如果系统里还有一个带 sudo 权限的普通用户,事情就好办了。登录进去,执行:
sudo passwd root
只有当没有这样的用户、或者所有能用的账号都登不进去时,才需要往下看。
二、使用 debug shell
systemd 自带一个调试用的 shell,可以借它来改密码。
第一步,在启动加载器(通常是 GRUB)里,给内核参数追加 systemd.debug_shell。
第二步,正常启动。开机后,debug-shell.service 会在 tty9 挂一个 root shell,按 Ctrl-Alt-F9 切过去。
第三步,运行 passwd,输入新密码。
第四步,改完记得关掉这个服务,否则以后任何人只要物理接触到机器,都能拿到 root。
systemctl stop debug-shell.service
三、用 Bash 作为 Init
思路是跳过 systemd,让内核直接把 Bash 当 1 号进程跑起来。这样系统还来不及要求登录,你就已经是 root。
第一步,在启动项的内核参数里追加 init=/bin/bash。
第二步,启动后会直接掉进 Bash 提示符。此时根文件系统是只读的,要重新挂载成可读写:
mount -n -o remount,rw /
第三步,用 passwd 改密码。
第四步,强制重启。别用 reboot,因为 systemd 没跑起来,正常流程走不通:
reboot -f
这个方法有个坑。系统只加载了 Bash,很多硬件驱动没初始化,某些键盘(笔记本内置键盘、无线键盘尤其常见)在提示符后可能敲不了字。遇到这种情况,只能换别的方法。
四、使用 LiveCD
前三招都不行时,就用一张 LiveCD 或 U 盘启动盘。任何发行版都行,架构对得上就好。
用 LiveCD 也有几种玩法:直接编辑 /etc/shadow 清空密码字段,或者 chroot 进去跑 passwd。前者手快容易改坏,所以这里只讲后者。
第一步,用 LiveCD 启动,把原系统的根分区挂到 /mnt。
第二步,执行下面的命令。--root 参数让 passwd 直接作用于挂载点下的系统,不用真的 chroot,也不问旧密码。
passwd --root /mnt 用户名
第三步,卸载,重启,用新密码登录。
umount /mnt
reboot