LINUX_REBOOT_CMD_RESTART2を使用してrestart()コマンド文字列argをいつ実行するには?

LINUX_REBOOT_CMD_RESTART2を使用してrestart()コマンド文字列argをいつ実行するには?

これrestart() マンページ説明する

LINUX_REBOOT_CMD_RESTART2

(0xa1b2c3d4; Linux 2.1.30以降)。 「 '%s'コマンドでシステムを再起動しています」というメッセージを印刷してすぐに再起動します(argで指定されたコマンド文字列を使用)。以前の同期(2)がないと、データは失われます。

シャットダウンプロセス中にargに指定されたコマンド文字列はどのように正確に実行されますか?

https://unix.stackexchange.com/a/489651/674について話すLINUX_REBOOT_CMD_RESTART2

reboot() ここでの追加の混乱は、システムコールが再起動を実行するプロセスを実行できるように見えるためです(ただしこれは機能します)。

argに提供されたコマンド文字列はカーネルが終了する前に実行されるため、カーネルが終了する前にコマンドがいくつかのクリーンアップ操作を実行できますか?

ありがとうございます。

ベストアンサー1

コマンドはいいえシャットダウン中に実行されます。これはシェルコマンドやそれと似ていません。machine_restart()一部のドライバ(watchdogなど)によってdo_kernel_restart()登録された再起動ハンドラにコールバックデータ(=>を介して)に渡す必要がある文字列。register_restart_handler()

ただし、このメカニズムはx86では使用されません。そこの「コマンド」は完全に無視されます。 ~からarch/x86/kernel/reboot.c:

void machine_restart(char *cmd)
{
        machine_ops.restart(cmd);

struct machine_ops machine_ops __ro_after_init = {
        ...
        .restart = native_machine_restart,

static void native_machine_restart(char *__unused)
{

この文字列は登録されたハンドラにも渡されます。register_reboot_notifier()。唯一の(虐待)使用されたドライバは次のとおりです。EFIブートローダ制御不揮発性設定です。LoaderEntryOneShotEFI変数を使用すると、一部のブートローダは次に起動する必要があるオペレーティングシステムを決定します。このドライバはAndroid以外で使用されたことがないようです。しかし、以前のlmlにも詳しく説明されているので、とにかく這いそうです。議論する以前のバージョンも同じです。

おすすめ記事