注意:我就这些捆绑包的版本 6 提出了类似的问题这里。请注意,7 使用 systemd 并且可能有不同的实现
在极少数情况下,RHEL 或 CentOS 7 系统因(例如)不当关闭或启动时强制 fsck 检查失败而无法启动,控制台将提示用户输入 root 密码。
如何禁用密码检查并直接进入 root-shell?
不可接受答案:
- 覆盖
init
内核命令行(即 grub) - 将 /sbin/sulogin 链接/替换为 /sbin/sushell。 (这可行,但会引发安全框架的危险信号)。
- 从其他设备启动
答案1
Systemd 正在与服务和目标。目标相当于运行级别,服务相当于初始化脚本。大多数 systemd 配置位于 中/usr/lib/systemd
,而标准 init 位于/etc/{init.d,rc*.d,inittab}
.
当启动过程中出现问题时(默认为盖蒂目标或者图形目标,你可以通过systemctl get-default
) systemd 切换到紧急目标。
这个“紧急”目标将依次加载文件emergency.service
。该服务包含多行,其中:
...
[Service]
Environment=HOME=/root
WorkingDirectory=/root
ExecStartPre=-/bin/plymouth quit
ExecStartPre=-/bin/echo -e 'Welcome to emergency mode! After logging in, type "journalctl -xb" to view\\nsystem logs, "systemctl reboot" to reboot, "systemctl default" to try again\\nto boot into default mode.'
ExecStart=-/bin/sh -c "/sbin/sulogin; /usr/bin/systemctl --fail --no-block default"
...
我们只需要将调用替换为/sbin/sulogin
:
ExecStart=-/bin/sh -c "/sbin/sushell; /usr/bin/systemctl --fail --no-block default"
我们将直接进入 shell,而不是通过 sulogin 提示输入密码。 (我们可以使用/bin/sh
,但/sbin/sushell
与 CentOS6/RHEL6 的答案一致。事实上,只需使用默认为 的sushell
exec 即可。)$SUSHELL
/bin/bash
要使此更改“永久”,即不受yum
更新影响,请对此文件的副本进行更改并将其放在/etc/systemd/system/
.另外,要使“救援模式”以相同的方式工作,请将 中的同一行替换为rescue.service
.这是一个用于简化该过程的 shell/sed 脚本:
for SERVICE in rescue emergency ; do
sed '/^ExecStart=/ s%"/sbin/sulogin;%"/sbin/sushell;%' /usr/lib/systemd/system/$SERVICE.service > /etc/systemd/system/$SERVICE.service
done
要测试这一点,请确保系统未在使用中,并告诉systemd
切换到rescue
目标:
systemctl rescue
这将关闭网络连接并在控制台打开 shell。您可以使用emergency
目标进行测试,但这并不能完全正常工作(出于某种原因),并且可能需要完全重新启动才能退出。
您还可以从引导菜单 (grub) 测试这些。测试紧急模式很简单。启动并在出现菜单时,按“e”进行编辑,然后使用方向键导航到以linux16
并追加开头的行(CTRL-A
按可到达行尾)emergency
:
linux16 ... emergency
对于测试救援模式,步骤与上面相同,但必须更明确:
linux16 ... systemd.unit=rescue.target
答案2
我用来绕过 root 密码并访问 root shell 的方法是编辑 grub 中的 init (内核行)。
init=/bin/bash