web-dev-qa-db-ja.com

Linux InitramFS "UserSpace"からのカーネルコマンドラインの変更/追加

組み込みLinuxデバイスを開発しています。起動後すぐに実行されるInitramFSCPIOアーカイブを正常に作成しました。ここで、最初のカーネルコマンドラインを変更して「quiet」パラメーターを含め、さらに高速に起動できるようにします。

ただし、スプラッシュ画面がInitramFSに表示されたら、カーネルのクワイエットオプションを削除して、ブートの残りの部分がクワイエットしないようにします。

どうすればこれを達成できますか? InitramFSに到達したら、最初の「静かな」カーネルコマンドラインオプションを元に戻すにはどうすればよいですか?

ありがとう。

2
PhilBot

起動後にカーネルコマンドラインを実際に変更することはできませんが、できることは、quiet他の手段によるコマンドライン。ここで達成したいことを達成する必要があります。

つまり、quietが不要になったときに冗長性を高めるには、次のコマンドを使用できます。

_# echo 7 >/proc/sys/kernel/printk
_

そして、quietが行うことをエミュレートするために、これを使用できます。

_# echo 4 >/proc/sys/kernel/printk
_

これにより、設定のカーネル側が処理されます...ただし、ユーザースペースがこのカーネルオプションに基づいて動作を変更する場合もあります。たとえば、systemdはカーネルコマンドラインのquietオプションを解析し、_ShowStatus=auto_が_/etc/systemd/system.conf_で使用されたかのように動作します。それを元に戻したい場合(デフォルトを強制し、quietオプションを無視するため)、その構成ファイルを編集し、そこで_ShowStatus=yes_行のコメントを外します。

このオプションを確認する他のシステムがユーザースペースにある可能性があるため、それらの動作を詳しく調べて、カーネルコマンドラインに存在するオプションの動作を再現(または元に戻す)する方法を確認する必要があります。 。

以下は、カーネルとsystemdのquietオプションの動作を説明するためのソースの詳細です。


カーネルは、 quiet_kernel()初期化関数 を呼び出すことによってquietオプションを解析します。これにより、次のことが行われます。

_static int __init quiet_kernel(char *str)
{
    console_loglevel = CONSOLE_LOGLEVEL_QUIET;
    return 0;
}

early_param("quiet", quiet_kernel);
_

_console_loglevel_疑似変数は実際には _console_printk_配列の最初の要素

_extern int console_printk[];

#define console_loglevel (console_printk[0])
_

ログレベル "quiet"は4として定義されます

_#define CONSOLE_LOGLEVEL_QUIET   4 /* Shhh ..., when booted with "quiet" */
_

以下の数行で、 デフォルトのログレベル はカーネル構成によって定義されています。

_/*
 * Default used to be hard-coded at 7, we're now allowing it to be set from
 * kernel config.
 */
#define CONSOLE_LOGLEVEL_DEFAULT CONFIG_CONSOLE_LOGLEVEL_DEFAULT
_

そして、そのカーネル構成は Kconfig.debugで設定され、デフォルトは7のままです

_config CONSOLE_LOGLEVEL_DEFAULT
    int "Default console loglevel (1-15)"
    range 1 15
    default "7"
_

(カーネルがデフォルトの構成を使用していることを_/boot/config-*_または_/proc/config.gz_で確認することをお勧めします。)

また、_/proc/sys/printk_の使用の詳細については、 カーネルのドキュメント を参照してください。ただし、要するに、単一の数値のみを書き込むことができます。その場合、配列の最初の要素のみが更新されます。これは、ここで必要なことです。


systemdはカーネルコマンドラインも解析し、通常は_systemd.*_という名前のエントリを探しますが、 systemdはquietカーネルコマンドラインも認識します であり、 ShowStatusを設定します。

_    } else if (streq(key, "quiet") && !value) {

            if (arg_show_status == _SHOW_STATUS_UNSET)
                    arg_show_status = SHOW_STATUS_AUTO;
_

この場合、以前に設定されていない場合にのみ設定され(__SHOW_STATUS_UNSET_)、「自動」に設定されます(_SHOW_STATUS_AUTO_。)

ShowStatusを設定する別の方法は 構成ファイルを介して

_            { "Manager", "ShowStatus",                config_parse_show_status,      0, &arg_show_status                       },
_

この行は、_ShowStatus=_の_[Manager]_セクションの下にある_system.conf_という名前の構成オプションについて説明しています。 このオプションのパーサー は「auto」文字列(この場合は_SHOW_STATUS_AUTO_に設定)またはブール値(「yes」、「true」、または「 1」で有効にするか、「no」、「false」、「0」で無効にします。

_--show-status=_ のsystemdドキュメントもここで非常に役立ちます。 _ShowStatus=_構成も引用しています(systemdコマンドライン引数を直接渡すのは必ずしも簡単ではないため、構成ファイルを更新する方が、この設定を構成するためのより簡単な方法です)。


これがお役に立てば幸いです。また、特定のユースケースに適した冗長性を実現するのに役立つことを願っています。

2
filbranden