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はシェルへのアクセスを提供するはずですが、そうではありません。そのコマンドラインがないと、ctrl-cを使用しても抜け出せないスクリプトループが発生します。
解決済み:
カーネル引数:
earlyshell
実際にシェルを起動しませんでしたか?しかし、次の引数を使用してカーネルを実行します。
break=premount
initramfsシェルをくれました。
このリソースは非常に役に立ちました: https://wiki.debian.org/InitramfsDebug
Kexecに正しい--initrd=
を与えましたか?
Kexecをインストールして試しました。私が行けばそれは動作します
kexec -l /boot/vmlinuz --initrd=/boot/initrd.img --append=root=/dev/sda3
そしてkexec -e
。 (私には暗号がありません...)
最初に「use/proc/cmdline
」というヒントに従おうとしましたが、うまくいきませんでした。私には、--initrd=
オプションを追加する必要があるように見えます。
パスワードを入力するには「initramfsPrompt」が必要ですか(暗号化されたデバイスをマウントできるようにするため)?
通常、私の/proc/cmdline
は次のようになります
vmlinuz initrd=initrd.cpio.gz root=/dev/sda3
上記のkexec(および再起動)の後、/proc/cmdline
は次のようになります
root=/dev/sda3
Kernelとinitrdの名前はなくなりました! -appendの部分だけが残ります。これは私をあまり混乱させません:質問に新しいファセットを追加するだけです:カーネルイメージとinitrdイメージカーネルオプションですか?それらは(カーネル)コマンドラインの一部ですか?
UefiShellを使用して起動します。この「initrd =」がいかに重要かを知っています。ブートローダー(grub)を使用しても、同じように機能するはずです。カーネル、initrd(必要な場合/必要な場合)、ルート、init、およびすべての通常の「カーネルオプション」を選択するのは(間接的な)別の方法です。
標準のinitrdはこれを行います:
ルートにアクセスするためのモジュールのロード(私の場合:sata、SIMPLE SSDドライブのahci)
そのデバイスをマウントします(root =/dev/xxxで指定)
それへの「switch_root」(/ sbin/initの実行を含む)
あなたの場合、sata-moduleではなく、パスワードプロンプト(?)が必要です。ただし、結果は同じです。ルートをマウントできません。
ブートローダーがどのように正常に起動するかを調べてから、kexecでそれを模倣してみてください。
追加:
initrd(名前は関係ありません...)は、デフォルトで/init
スクリプトで開始されます(rdinit=
ブートオプションを確認してください)。これは、earlyshellに対応する「earlyuserspace」です。このinitramfs-tool
を使用すると、/ initと呼び出されるスクリプトを制御するのに十分なブレークポイントが得られたようです。
それ以外の場合は、そのinitrdを抽出し(gzip
およびcpio
を使用)、/ initを変更し(または/ init_newを追加してブートオプションとしてrdinit =/init_newに移動し)、フォルダーを再度アーカイブすることができます。このcpioコマンドは、これまで使用したことがありませんが、実際にはtarよりも単純です。少し違います。
mkinitcpio
はそのためのツールです。冒頭で、初期のユーザースペースと暗号化の両方について言及しています。これは、私が読んだばかりのarchlinuxのものであり、後期および初期の「フック」もあります。 initramfs-toolsと同じ機能だと思います。