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_shell
2を指定すると、デバッグシェルサービスはブート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(initrdのsystemdとは逆)ですが、initを/bin/bash
次に変更すると代わりにホストsystemd
なので、single
このパラメータはまったく使用されません。
single
シングルモード(「回復」モードと同じ)でシステムを起動する代わりに使用できますが、特定のinit=...
システム実装に応じて実際のシェルを取得するにはルートパスワードが必要になる可能性があります。
2番目の解決策に関する注意事項
もう一度initrd
initプロセスと所有者初期化プロセス。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.