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 也無法擺脫。
解決了:
核心參數:
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(使用
gzip
andcpio
),更改 /init(或添加 /init_new 並轉到 rdinit=/init_new 作為引導選項),然後再次歸檔文件夾。這個cpio命令我以前沒用過,但其實比tar簡單。只是有點不同。
mkinitcpio
是一個工具。它在一開始就提到了早期的使用者空間和加密。我剛剛讀到,它是一個 archlinux 的東西,並且也有晚期和早期的“鉤子”。我猜,與 initramfs-tools 的功能相同。