在启用 systemd 的系统下启动 shell 的等效方法是什么?
在 sysinit/grub 中,我只需将根文件系统挂载为rw
并传递init=/bin/bash
给内核,并可选择将其设置为运行级别 1。
在 systemd/bootd 系统上,我拥有正确安装我的根目录(luks、lvm 等)的所有选项,并且我看到它已安装到/sysroot
,但传递init=/sysroot/bin/bash single
到内核然后在启动时的“切换根目录”步骤中失败。文档中的哪个应该在 init 之前发生(如果它发生在之后,我的 init 作为 shell 不会暂停流程吗?)
答案1
第一个解决方案
如果指定了
systemd.debug_shell
1或rd.systemd.debug_shell
2选项,则调试 shell 服务“debug-shell.service
”将被拉入引导事务,并且将在早期引导期间生成调试 shell。默认情况下,/dev/tty9
使用 ,但也可以设置特定的 tty,带或不带前缀/dev/
。 [...]rd.systemd.debug_shell
仅在初始 RAM 磁盘 (initrd) 中受到尊重,而systemd.debug_shell
仅在主系统中受到尊重。
因此,您可以做的第一件事就是将以下参数添加到内核命令行中:single systemd.debug_shell
。这将从(默认)开始bash
,tty9
您可以通过按 键移动到那里F9。
您可以在内核参数中指定不同的 tty。例如,systemd.debug_shell=tty1
shell 将出现在第一个虚拟终端上(而不是第 9 个),因此您无需进行切换。
1请注意,在旧版本的 systemd 中,systemd.debug_shell
实际上被命名为systemd.debug-shell
(注意连字符而不是下划线)。要检查该参数在您的计算机上的具体命名,请阅读systemd-debug-generator
您计算机上的手册页。
2我还将在此答案中进一步提及rd.systemd.debug_shell
(或rd.systemd.debug-shell
,因为之前的评论也适用于此处)。
第二种解决方案
如果你想修改你自己的解决方案并使其工作,你需要使用init=/bin/bash
and not init=/sysroot/bin/bash
(解释将在后面)。
另请注意,后面的所有内容都init=
将成为命令的一部分。这意味着init=/bin/bash single
实际上将尝试运行该命令/bin/bash single
。所以init=
参数应该在命令行的末尾。
关于,如果你在内核命令行中改变你的init,则根本single
不需要添加参数。single
该参数由主人的实际的 systemd (与 initrd 的 systemd 相反),但是如果你将你的 init 更改为/bin/bash
,它将运行反而主机的systemd
,因此single
根本不会使用该参数。
您可以使用 justsingle
而不init=...
是以单一模式启动系统(与“rescue”模式相同),但根据您的特定 systemd 的实现,它很可能会要求您的 root 密码才能获得实际的 shell。
关于第二种解决方案的说明
再次注意initrd
init 进程和主持人的初始化进程。有initrd
它自己的 init (在你的情况下systemd
),当它完成时,它运行主持人实际上是 init.
这个“初始化”阶段发生后initrd 完成。当systemd
在内部运行时initrd
,这正是它将 root ( /
) 切换到 的阶段/sysroot
。
你可以在手册页中看到它systemctl
:
switch-root
[根[在里面]]切换到不同的根目录并在其下执行新的系统管理器进程。这旨在用于
initrd
,并将从 initrd 的系统管理器进程(也称为“init
”进程,PID 1)转换到从实际主机根文件系统加载的主系统管理器进程。此调用需要两个参数:将成为新根目录的目录,以及其下面要作为 PID 1 执行的新系统管理器二进制文件的路径。如果两者都被省略,或者前者是空字符串,则默认为/sysroot/
.
所以它会尝试运行/sysroot/bin/bash
期间“切换根目录”阶段,切换根目录时到 /sysroot
(其中包括实际的文件系统)。到那时,/sysroot
它将不再存在,因为它将成为根文件系统 - /
。
自己看吧
你可以自己调试、观察。通过在内核命令行中添加rd.systemd.debug_shell
参数,可以得到初始化程序在虚拟终端号 9 ( F9) 处运行 shell,您可以在其中查看/run/initramfs/rdsosreport.txt
日志,您将明白我的意思(注意第二行):
[ 4.673024] host systemd[1]: Starting Switch Root...
[ 4.679521] host systemctl[509]: Failed to switch root: Could not resolve init executable /sysroot/bin/bash: No such file or directory
[ 4.679968] host systemd[1]: initrd-switch-root.service: Main process exited, code=exited, status=1/FAILURE
[ 4.680097] host systemd[1]: initrd-switch-root.service: Failed with result 'exit-code'.
[ 4.680546] host systemd[1]: Failed to start Switch Root.