Kexec 进入新内核,但我无法访问 initramfs 提示符!

Kexec 进入新内核,但我无法访问 initramfs 提示符!

我使用 kexec 成功加载了我的内核,但它只是打印 dmesg 行。我如何摆脱这个进入 initramfs 提示符? Ctrl-Alt-F2 仅加载黑屏,而 ctrl-c 不执行任何操作。

这是我的 kexec 命令行:

kexec -l $kernel --initrd=$initrd --command-line="root=UUID=... acpi=off ro text earlyshell debug showerr debuginitrd"

Earlyshell 应该让我能够访问 shell,但事实并非如此。如果没有该命令行,我就会陷入脚本循环,即使使用 ctrl-c 也无法摆脱该循环。

答案1

解决了:

内核参数:

earlyshell

实际上并没有启动外壳???但是使用参数运行内核:

break=premount

给了我 initramfs shell。

该资源非常有帮助:https://wiki.debian.org/InitramfsDebug

答案2

你给 kexec 的值正确--initrd=吗?

我刚刚安装并尝试了 kexec。如果我去的话就有效

kexec -l /boot/vmlinuz --initrd=/boot/initrd.img --append=root=/dev/sda3 

进而kexec -e。 (我没有加密...)

我首先尝试遵循“使用”提示,/proc/cmdline但没有成功。对我来说,看起来你必须提供--initrd=额外的选择。

您需要“initramfs提示符”来提供密码(以便您可以挂载加密设备)?

通常我的/proc/cmdline样子是这样的

vmlinuz initrd=initrd.cpio.gz root=/dev/sda3

在上面的 kexec (和重新启动)之后/proc/cmdline看起来像这样

root=/dev/sda3

内核和initrd的名字不见了!只有- 附加剩下一部分。这甚至没有让我太困惑:只是为问题添加了一个新的方面:内核映像和 initrd 映像是吗?内核选项?它们是(内核)的一部分吗?命令行

我使用 uefi shell 启动。我知道这个“initrd=”有多重要。使用引导加载程序(grub)它应该工作相同。这只是选择内核、initrd(如果需要/想要)、根、init 和所有正常“内核选项”的不同方式(间接)

标准 initrd 执行以下操作:

  • 加载模块以访问根目录(我的情况:我的 SIMPLE SSD 驱动器为 sata、ahci)

  • 挂载该设备(由 root=/dev/xxx 给出)

  • “switch_root”到它(包括运行 /sbin/init)

在您的情况下,您需要密码提示(?),而不是SATA模块。但结果是一样的:root无法挂载。

了解引导加载程序如何成功引导,然后尝试使用 kexec 模仿它。


添加:

initrd(名称无关紧要...)默认使用脚本启动/init(查看rdinit=启动选项)。这是“early userspace”,对应earlyshell。看起来这样initramfs-tool你就有了足够的断点来控制 /init 和被调用的脚本。

否则,可以提取该 initrd(使用gzipcpio),更改 /init (或添加 /init_new 和 go rdinit=/init_new 作为引导选项),然后再次存档文件夹。这个cpio命令我以前没用过,但其实比tar简单。只是有点不同。

mkinitcpio是一个工具。它一开始就提到了早期的用户空间和加密。我刚刚读到,这是一个 archlinux 的东西,并且也有晚期和早期的“钩子”。我猜与 initramfs-tools 的功能相同。

相关内容