Reset Password in Systemd

现在基本是用 ssh key 来登录系统了。之前可以直接在 GRUB 直接进单用户改密码。使用了 systemd 的系统,后已经不可以这么使用了。原因是 Systemd 的单用户模式使用了 /usr/sbin/sulogin 这个 shell, 也必须输入密码才可以。

# /usr/lib/systemd/system/rescue.service
[Unit]
Description=Rescue Shell
Documentation=man:sulogin(8)
DefaultDependencies=no
Conflicts=shutdown.target
After=sysinit.target plymouth-start.service
Before=shutdown.target

[Service]
Environment=HOME=/root
WorkingDirectory=-/root
ExecStartPre=-/bin/plymouth --wait quit
ExecStartPre=-/bin/echo -e 'You are in rescue mode. After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" or ^D to\\nboot into default mode.'
ExecStart=-/bin/sh -c "/usr/bin/sulogin; /usr/bin/systemctl --job-mode=fail --no-block default"
Type=idle
StandardInput=tty-force
StandardOutput=inherit
StandardError=inherit
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes

自 systemd 215 版本后,新加了一个 systemd.debug-shell 的内核参数,内容如下:

# /usr/lib/systemd/system/debug-shell.service
[Unit]
Description=Early root shell on /dev/tty9 FOR DEBUGGING ONLY
Documentation=man:sushell(8)
DefaultDependencies=no
IgnoreOnIsolate=yes
ConditionPathExists=/dev/tty9

[Service]
Environment=TERM=linux
ExecStart=/bin/sh
Restart=always
RestartSec=0
StandardInput=tty
TTYPath=/dev/tty9
TTYReset=yes
TTYVHangup=yes
KillMode=process
IgnoreSIGPIPE=no
# bash ignores SIGTERM
KillSignal=SIGHUP

# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=

[Install]
WantedBy=sysinit.target

可以看到,systemd 直接在 tty9 上面开了一个 sh, 不用密码就可以登录。

使用方法很简单,在 GRUB 界面上,输入 e 进入编辑模式,找到 linux16 那一行,在后面加入 systemd.debug-shell 就可以了。之后 Ctrl + x 继续启动就可以了。启动完成后,Ctrl + Alt + F9 进入 tty9, 就可以欢快的改密码了

Comments