![Kexec 进入新内核,但我无法访问 initramfs 提示符!](https://linux22.com/image/156301/Kexec%20%E8%BF%9B%E5%85%A5%E6%96%B0%E5%86%85%E6%A0%B8%EF%BC%8C%E4%BD%86%E6%88%91%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%20initramfs%20%E6%8F%90%E7%A4%BA%E7%AC%A6%EF%BC%81.png)
我使用 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。
答案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(使用gzip
和cpio
),更改 /init (或添加 /init_new 和 go rdinit=/init_new 作为引导选项),然后再次存档文件夹。这个cpio命令我以前没用过,但其实比tar简单。只是有点不同。
mkinitcpio
是一个工具。它一开始就提到了早期的用户空间和加密。我刚刚读到,这是一个 archlinux 的东西,并且也有晚期和早期的“钩子”。我猜与 initramfs-tools 的功能相同。