ps axf は PID1 の「/sbin/init スプラッシュ」を表示します。

ps axf は PID1 の「/sbin/init スプラッシュ」を表示します。

私はThelostcauseが提起した非常に興味深い質問をもう一度言いたいと思います(「PID = 1のときのスプラッシュ"):

どうやってどうすればいいですか? 「/sbin/initを起動する」現れるpsコマンド

私も尋ねます:私たち(「Linuxシステム」を運営している私たち)はどの国出身ですか?

"init [2]"               in old sysvinit, to

"/sbin/init vmlinuz"     in new systemd init ?

ここで、[2]はsysv実行レベルを表し、vmlinuzはカーネルコマンドライン(KCL)の最初のパラメータを表します。

psコマンドを使用してシステムのinitプロセスに対してPID = 1(別名またはクールな名前)を見た人はいますか?

注意してください:「ps」はとてもトリッキーです。ps -p1単に「systemd」をCMDとして提供し、ps p1「/sbin/init arch5 \ vmlinuz-linux」をCOMMAND出力フィールドに提供します。私はps axf概要を取得するために使用します。

私の質問についていくつかの仮定があることを認めます。 "splash"イベントはgrubとsystemdの間の問題です。これは、systemdが2番目の名前でps出力をきれいにすることを決定するまで、カーネルとinitrdで無視された初期(負、最初の)KCLパラメータでした(下記の3番目の例を参照)。 。


追加されました(Documentation / x86 / boot.rstから直接):

ブートローダ自体内で追加のコマンドラインオプションを必要とするブートローダの作成者は、現在または将来の実際のカーネルオプションと競合しないように、Documentation / admin-guide / kernel-parameters.rstにそのオプションを登録する必要があります。

  initrd=<file>
    An initrd should be loaded.  The meaning of <file> is
    obviously bootloader-dependent, and some boot loaders
    (e.g. LILO) do not have such a command.

さらに、一部のブートローダはカスタムコマンドラインに次のオプションを追加します。

  BOOT_IMAGE=<file>
    The boot image which was loaded.  Again, the meaning of <file>
    is obviously bootloader-dependent.

  auto
    The kernel was booted without explicit user intervention.

これらのオプションがブートローダによって追加された場合は、そのオプションを次の場所に配置することをお勧めします。最初、カスタムまたは構成指定コマンドラインの前に。それ以外の場合、「init = / bin / sh」は「auto」オプションと混同されます。

...またはinit = [link to systemd] "splash"オプションを介して!

boot.rstの近くでinitrd =とinit =がどのように言及されているかを確認してください。

kernel.org, boot-parameters.html:ここでinitrd=起動オプションは[BOOT](「起動ローダパラメータ」)として表示されます。これは[BOOT]以外に何もない唯一のオプションです(locktorture.xとrcuperf.xのいずれかを除く)。そしてvga=それは特別なケースのようです:

これは実際にはブートローダパラメータです。値は特殊プロトコルを使用してカーネルに渡されます。

一般的なカーネルパラメータには、[KNL]("カーネル起動パラメータ") が含まれます: root=, rw, init=, rdinit=, audit, debug など——でも「S」

Stephenと私が混乱していたのは当然です。 bootloader、initrd=、init=、そしてこの「スプラッシュ」は実際に密接に関連しています。

S               [KNL] Run init in single mode

これは私には理解できません。それともカーネルは「S」を検索して辞書にinitに渡しますか?

ご存知のように、私は(まだ)「S」に対してsystemdをテストしません。再起動後に重大なクラッシュ(メッセージなし)と「認証エラー」が発生しました(pacman -S pam少なくとも今回は簡単に修正できました)。私がしたことはrdinit=xxxxx(デフォルトは/ init)でした。カーネルが私に「必須RDINITが見つかりません」またはこれと同様のことを教えてはいけませんかinit=xxxx? 「NO INIT FOUND」もパニック状態ですが、メッセージを含む制御されたパニック状態です。


セクション追加終了


私の実際の質問の1つは次のとおりです。

これをどのように説明しますか?私の初期化は次の初期化を始めます!

(この質問は私のトピックとは少し異なりますが、これらすべての例を見たいと思いました。)

    1 ?        Ss     0:01 init [S]
  214 tty1     Ss     0:00 init [S]
  215 tty1     S      0:00  \_ bash
  238 tty1     R+     0:00      \_ ps axf
  239 tty1     R+     0:00      \_ tail

これがUefiシェルからNUCを起動する方法です。 「S」は、この特別な緊急sysvinit実行レベル(/ etc / inittabがない場合に入力されるinittabエントリなし)を示します。こんにちは、どこに行ったのか見たかったです。

fedora\vmlinuz root=/dev/sda3 init=/usr/bin/sysvinit S HELLO

このKCLは、dmesgおよび/proc/cmdlineで影響を受けていないようです。ここdmesg:

[    0.000000] Command line: fedora\vmlinuz root=/dev/sda3 init=/usr/bin/sysvinit S HELLO
[    0.000000] Kernel command line: fedora\vmlinuz root=/dev/sda3 init=/usr/bin/sysvinit S HELLO

今、私のカーネルには二重の「[カーネル]コマンドライン」は表示されません。これは「コマンドライン」だけです。もし意図的にこれを変えれば、私は彼らが正しいと言いたいと思います。 (Fedoraカーネルはアンティークではありません... 4.18に似ています)

これは4つのttyを持つ一般的なランレベルです。

    1 ?        Ss     0:00 init [2]
  286 tty1     Ss     0:00 /bin/bash -l
  303 tty1     R+     0:00  \_ ps axf
  304 tty1     D+     0:00  \_ /bin/bash -l
  287 tty2     Ss+    0:00 /sbin/agetty -J tty2
  288 tty3     Ss+    0:00 /bin/bash
  289 tty4     Ss+    0:00 /bin/bash

以前のsysvinitは「init [2]」と表示されます。 「2」はもちろん(デフォルト)ランレベルであり、/ sbin / initの引数ですが、見栄えが良く見えるようにするには、sysvinitに角括弧を追加する必要があります。このps出力では、「/bin/bash」と「/bin/bash -l」の違いを見ることができます。

initrdを使用するsystemd(archlinux):

    1 ?        Ss     0:01 /sbin/init arch5\vmlinuz-linux

    ...        ..     .... snip systemd-journald etc.
  469 ?        Ss     0:00 login -- root
  484 tty1     Ss     0:00  \_ -bash
  922 tty1     S+     0:00      \_ xinit fvwm
  ...                           ...

どこで救われた人はいますか?「天ぷら」、これは言えないことです。わかります"arch5\vmlinuz-linux"。 Arch5はEFIブートパーティションに作成したディレクトリ、vmlinuz-linuxはインストール後に/bootでカーネルを見つける方法です。私はinitrdファイルと一緒にArch5にコピーしました。

実際のブートローダ(grubなど)からsystemd initを起動する場合: "/ sbin / init"の後に何が得られますか?私のような他のカーネルファイル名はありますか?それとも水遊びや静かさ、それとも残りのものですか?


@Stephen:カーネルがパラメータを「消費する」ということはどういう意味ですか?私のinitrd =の例では、カーネルはまったく何も消費しません。カーネルは、initrdファイルとともにブートローダまたはUefi Shellによってロードされます。

(私はStephenが起動時にコマンドラインでinitrd =、root =、init =を処理するとここで議論しています。)

いいですね。この場合、initrd =はカーネル自体によってロードされますが(EFIスタブ、Uefiサポートを使用)パラメータは「使用」されますか?いいえ、まだそこにいます。すべてがまだ存在し、/proc/cmdlineに「終了」します。モジュールがそこからコマンドラインオプションを見つけるように指示されていませんか?


私の現在の結論は次のとおりです。sbin / init Splash?何が関係ない!ブート引数のルールがあります。 initが未使用の「スプラッシュ」を引数として取得すると、psはそれを表示します。

私の考えでは、この答えは完全に間違っていると思います...しかし、コマンドライン(別名ブートオプション)とbootloader / Uefiシェルから/ sbin / initまでのブートプロセスの良い説明があれば見つけることができます。


ところで、私がここにいる理由は次のとおりです。

初めてディスクから起動するのに問題がありました(私のNUCはキットなので、起動時に実際に空でした)。私はGPTパーティションで起動し、「レガシーBIOS」で起動できるようにこの「保護MBR」を取得しても、もちろんレガシー/ MBRを離れて純粋なUefi / GPTを使用したいと思います。しかし、GPTのgrubのインストールは私をとても混乱させます!私の「ビジュアル」BIOSに起動可能なエントリが表示されません。今わかります。 Uefiはデバイスを起動せずにBOOTX64.EFIなどのEFIアプリケーションを起動します。まず、efibootmgr(Linuxで)またはbcfg(Uefi Shellで)を使用して登録する必要があります。

SSDをMBRに再パーティションしようとしています。

次に、次の非常に短い投稿(ここまたはstackoverflow)を見つけました。

「Uefi BIOSがあれば、ブートローダは必要ありません」

私はそれがとても簡単だと信じられませんでした。起動オプションとして「Uefi Shell」を有効にして起動し、「fs0:」と入力して、実際に起動パーティションに「入った」と「vmlinuz」のみを入力しました。チャジャン、root=ミスでクイックカーネルパニックが発生しましたが、カーネルパニックを見てもっと嬉しかった人はいますか?

たぶん数日後に「初期化が見つかりません」を見つけたかもしれません。 (私は伝統を維持するために彼に/bin/bashを最初に与えた)。

ベストアンサー1

あなたが見ている(新しい)動作は、次の質問に対する回答に記載されています。すべてのカーネルパラメータは実際にカーネルで使用されますか?

Grubなどのブートローダで起動するとき、カーネルコマンドラインは通常次のようになります。

BOOT_IMAGE=/boot/vmlinuz-4.9.0-9-amd64 root=/dev/mapper/vg--fast-root ro single

/proc/cmdline後で処理する方法に関係なく、常にカーネル全体のコマンドラインを表示することでこれを確認できます。モジュールパラメータはここで解析されますmodprobe(参照カーネル文書詳細はこちら)。

rootroオプションはカーネルによって「消費」されます。値は環境で設定さBOOT_IMAGEれます(参照)。にパラメータとして渡されます。init/proc/1/environsingleinitカーネルのドキュメントで説明されています。:

カーネルはカーネルコマンドラインの引数を「--」に解析します。引数が認識されず、「.」が含まれていない場合、引数はinitに渡されます。 "="を持つ引数はinit環境に移動し、他の引数はコマンドラインパラメータとしてinitに渡されます。 "--"以降の内容はすべてinitにパラメータとして渡されます。

rootとはroカーネルに意味があるので、カーネルはそれを維持してに渡しませんinit

あなたの場合はUEFIシェルから起動します。 Archシナリオは上記の説明と正確に一致します。arch5\vmlinuz-linux initrd=arch5\initramfs-linux.img root=/dev/sda3コマンドラインの結果はinitrdカーネルによって消費され、root引数として渡されますarch5\vmlinuz-linuxinitinitrdは、ファイルを見つけるためにEFIサービスを使用してカーネル内のEFIスタブによってロードされます。 「カーネルからのものではないようです」エラーメッセージは、カーネルのEFIサポートによって生成されます。ここ「ファイルを開けません」とここ「より高いアドレスにファイルをロードしてみてください。」efi_printkEFIを使用してテキストを出力します。

を使用しているFedoraの場合、現在のランレベルを示すためにsysvinitコマンドライン(図を参照)が変更されます。ps

Thelostcauseの場合は、splashGrubビルド用のカーネルコマンドラインの一部であり、最終的にinit同じ規則に従います。

デュアルシナリオでは、2番目はシステム全体ではなくセッションマネージャであるinitようです。initinit

おすすめ記事