第一个解决方案

第一个解决方案

在启用 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-generator:

如果指定了systemd.debug_shell1rd.systemd.debug_shell2选项,则调试 shell 服务“ debug-shell.service”将被拉入引导事务,并且将在早期引导期间生成调试 shell。默认情况下,/dev/tty9使用 ,但也可以设置特定的 tty,带或不带前缀/dev/。 [...] rd.systemd.debug_shell仅在初始 RAM 磁盘 (initrd) 中受到尊重,而systemd.debug_shell仅在主系统中受到尊重。

因此,您可以做的第一件事就是将以下参数添加到内核命令行中:single systemd.debug_shell。这将从(默认)开始bashtty9您可以通过按 键移动到那里F9

您可以在内核参数中指定不同的 tty。例如,systemd.debug_shell=tty1shell 将出现在第一个虚拟终端上(而不是第 9 个,因此您无需进行切换。

1请注意,在旧版本的 systemd 中,systemd.debug_shell实际上被命名为systemd.debug-shell(注意连字符而不是下划线)。要检查该参数在您的计算机上的具体命名,请阅读systemd-debug-generator您计算机上的手册页。
2我还将在此答案中进一步提及rd.systemd.debug_shell(或rd.systemd.debug-shell,因为之前的评论也适用于此处)。

第二种解决方案

如果你想修改你自己的解决方案并使其工作,你需要使用init=/bin/bashand 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。

关于第二种解决方案的说明

再次注意initrdinit 进程和主持人的初始化进程。有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.

相关内容