最初のソリューション

最初のソリューション

systemdが有効なシステムでシェルを起動するのと同等の方法は何ですか?

sysinit/grub では、ルートファイルシステムをマウントしてカーネルにrw渡し、オプションで実行レベル 1 に設定します。init=/bin/bash

systemd / bootdシステムには、ルート(luks、lvmなど)を正しくマウントするためのすべてのオプションがあり、インストールされていますが、カーネルに渡され、起動時に/sysroot「ルート切り替え」ステップで渡されることがわかります。init=/sysroot/bin/bash single失敗する。ドキュメントでinitの前に何が起こるべきか(後で発生した場合、シェルとしてのinitはプロセスを一時停止しませんか?)

答え1

最初のソリューション

マニュアルページからsystemd-debug-generator:

systemd.debug_shellオプション1またはrd.systemd.debug_shell2を指定すると、デバッグシェルサービスはブートdebug-shell.serviceトランザクションに含まれ、初期起動中にデバッグシェルが作成されます。デフォルトでは/dev/tty9これが使用されますが、プレフィックスの有無にかかわらず特定のttyを設定することもできます/dev/。 [...] rd.systemd.debug_shell初期RAMディスク(initrd)とsystemd.debug_shellメインシステムでのみ尊重されます。

したがって、最初にできることは、カーネルコマンドラインに次のパラメータを追加することですsingle systemd.debug_shell。これは(デフォルト)から始まり、bashキーtty9を押してその位置に移動できますF9

カーネルパラメータに異なるttyを指定できます。たとえば、シェルは最初の仮想端末(9番目ではないsystemd.debug_shell=tty1に表示されるため、切り替える必要はありません。

1以前のバージョンの systemd では、systemd.debug_shell実際に名前が付けられていましたsystemd.debug-shell(アンダースコアではなくハイフンに注目)。このパラメータの名前がコンピュータでどのように指定されているかを確認するには、systemd-debug-generatorコンピュータのマニュアルページをお読みください。
2また、この回答でより詳細に言及しますrd.systemd.debug_shell(またはrd.systemd.debug-shell以前のコメントがここにも適用されるため)。

2番目の解決策

自分のソリューションを修正して機能させるには、使用してinit=/bin/bash使用しないでくださいinit=/sysroot/bin/bash(説明が続きます)。

また、次の内容はすべてinit=コマンドの一部になります。これはinit=/bin/bash single、コマンドが実際に実行しようとしていることを意味します/bin/bash single。したがって、init=パラメータはコマンドラインの末尾になければなりません。

この点でカーネルコマンドラインで初期化を変更する場合は、singleパラメータをまったく追加する必要はありません。singleこのパラメータは次のように構成されています。マスター実際のsystemd(ini​​trdのsystemdとは逆)ですが、initを/bin/bash次に変更すると代わりにホストsystemdなので、singleこのパラメータはまったく使用されません。

singleシングルモード(「回復」モードと同じ)でシステムを起動する代わりに使用できますが、特定のinit=...システム実装に応じて実際のシェルを取得するにはルートパスワードが必要になる可能性があります。

2番目の解決策に関する注意事項

もう一度initrdinitプロセスと所有者初期化プロセス。initrd独自の初期化(あなたの場合)があり、systemd完了すると実行されます。所有者実際には初期化です。

この「初期化」ステップが発生します。後ろにinitrdが完了しました。systemd内部的に実行されるとき、initrdこれは正確に/root()をに切り替えるステップです/sysroot

マンページで見ることができます。systemctl:

switch-root[[内部に]]

別のルートディレクトリに切り替えて、その下で新しいシステム管理者プロセスを実行します。これはinitrd、システム管理者プロセスをinitrd(" init"プロセスとも呼ばれる、PID 1)から物理ホストのルートファイルシステムからロードされたデフォルトのシステム管理者プロセスに変換するために使用されます。この呼び出しには、新しいルート ディレクトリになるディレクトリと、その下に PID 1 で実行される新しいシステム マネージャ バイナリへのパスという 2 つのパラメータが必要です。両方とも省略するか、電子が空の文字列の場合、デフォルト値はです/sysroot/

だから実行しようとします。/sysroot/bin/bash 期間ルートディレクトリを切り替えるときの「ルートディレクトリの切り替え」ステップ到着 /sysroot(実際のファイルシステムが含まれます)その時点では、/sysrootルートファイルシステム()になるため、もはや存在しません/

自分で確認してください

直接デバッグして観察できます。カーネルコマンドラインにrd.systemd.debug_shellパラメータを追加すると、次のようになります。初期化プログラムログを表示できる仮想端末番号9()でF9シェルを実行すると、/run/initramfs/rdsosreport.txtどういう意味かがわかります(2行目を参照)。

[    4.673024] host systemd[1]: Starting Switch Root...
[    4.679521] host systemctl[509]: Failed to switch root: Could not resolve init executable /sysroot/bin/bash: No such file or directory
[    4.679968] host systemd[1]: initrd-switch-root.service: Main process exited, code=exited, status=1/FAILURE
[    4.680097] host systemd[1]: initrd-switch-root.service: Failed with result 'exit-code'.
[    4.680546] host systemd[1]: Failed to start Switch Root.

関連情報