Initramfs

Kexec 進入新核心,但我無法訪問 initramfs 提示符!

  • July 1, 2019

我使用 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 也無法擺脫。

解決了:

核心參數:

earlyshell

實際上並沒有啟動外殼???但是使用參數執行核心:

break=premount

給了我initramfs shell。

這個資源非常有幫助:https ://wiki.debian.org/InitramfsDebug

你給--initrd=kexec正確了嗎?

我剛剛安裝並嘗試了 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

kernel 和 initrd 的名字不見了!只剩下**–append**部分。這甚至不會讓我太困惑:只是為這個問題增加了一個新方面:核心映像和 initrd 映像核心選項嗎?它們是(核心)命令行的一部分嗎?

我使用 uefi shell 啟動。我知道這個“initrd=”有多麼重要。使用引導載入程序(grub)它應該可以工作。選擇核心、initrd(如果需要/需要)、root、init 和所有正常的“核心選項”只是一種不同的方式(間接)

標準的 initrd 會這樣做:

  • 載入模組以訪問根目錄(我的案例:sata、ahci 用於我的 SIMPLE SSD 驅動器)
  • 掛載該設備(由 root=/dev/xxx 給出)
  • “switch_root” 到它(包括執行 /sbin/init)

在您的情況下,您需要密碼提示(?),而不是 sata 模組。但結果是一樣的:root 無法掛載。

找出您的引導載入程序如何成功引導,然後嘗試使用 kexec 進行模仿。


添加:

initrd(名稱無關緊要……)預設情況下使用/init腳本啟動(檢查rdinit=啟動選項)。這是“早期使用者空間”,對應於 earlyshell。看起來initramfs-tool你有足夠的斷點來控制 /init 和被呼叫的腳本。

否則,可以提取該 initrd(使用gzipand cpio),更改 /init(或添加 /init_new 並轉到 rdinit=/init_new 作為引導選項),然後再次歸檔文件夾。這個cpio命令我以前沒用過,但其實比tar簡單。只是有點不同。

mkinitcpio是一個工具。它在一開始就提到了早期的使用者空間和加密。我剛剛讀到,它是一個 archlinux 的東西,並且也有晚期和早期的“鉤子”。我猜,與 initramfs-tools 的功能相同。

引用自:https://unix.stackexchange.com/questions/527702