web-dev-qa-db-ja.com

PID = 1のスプラッシュ

Linuxでのプロセスについて学び始めたところです。

私は-と呼ばれるこのコマンドを回避しました

ps -ef(実行中のすべてのプロセスを表示します)

このような出力が得られます

UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
root         1     0     1  0    1 Apr17 ?        00:00:18 /sbin/init splash

splashはここで何を表していますか? initは、コンピューターを起動したときに最初に実行されるプロセスです。しかし、スプラッシュとは何ですか?それは何をするためのものか ?

また、誰かがinitが最初に実行されるプロセスと呼ばれていることを教えてもらえますが、それはコンピュータを起動したときに最初に実行されるBIOSまたはUFEIプログラムです。では、なぜBIOSやUFEIではなく、最初のプロセスとしてinitを呼び出したのでしょうか。

1
Thelostcause

ここでスプラッシュは何を表していますか? initは、コンピューターを起動したときに最初に実行されるプロセスです。しかし、スプラッシュとは何ですか?それは何をするためのものか ?

まず、起動中にsystemdを使用するubuntuを実行しています。これにより、起動中にスプラッシュ画面を表示できます。これがスプラッシュ引数を持っている理由です。 splash.c ソースコードを参照してください。

[編集]あなたのコンピューターはsystemdを実行しています。なぜなら、afaik、systemdがスプラッシュパラメーターをサポートする唯一のinitであるためです。他にもあるかもしれませんが、Ubuntuのデフォルトでもあるので、安全な推測だと思います。 Ubuntuでは、デフォルトで、/sbin/init/usr/lib/systemd/systemdへのシンボリックリンクであり、カーネルにロードされた/sbin/init splashpsはプロセスのコマンドラインを使用します。これは/sbin/init splashになり、これが表示されます。

また、initは最初に実行されるプロセスと呼ばれますが、コンピューターの起動時に最初に実行されるのはBIOSまたはUFEIプログラムです。では、なぜBIOSやUFEIではなく、最初のプロセスとしてinitを呼び出したのでしょうか。

わかりやすくするために、BIOS/UEFIはブート時にロードされるプログラムであり、システムをさらにブートするための構成データが含まれています。最終的には、ブートマネージャー(grubなど)などのブートする次のプログラムを見つけて、カーネルを起動できるようにします。ここではシンプルにしようとしていますが、読むことができます。 LinuxおよびUNIXシステムでは、initはカーネルによって生成された最初のプログラムであるため、PID1を取得します。

あなたはもっと読むことができます ここ 、実際、その記事はかなり古いです。以下が100%正確であるとは主張しません。

bootstrapまたはx86コンピュータを起動するために最初に行うことは、電源ボタンを押すことです。電源装置はマザーボードに電源を投入し、SMPS(スイッチングモード電源装置)からの十分な電力の信号を待ちますたとえば、PCIeグラフィックスカードが十分な能力を発揮し、CPUとRAMが存在することを確認します。

Intel Management Engine (IME)/ AMD Secure Technology この時点で開始します。IMEは、難読化されたminix 3オペレーティングシステムを備えた別個のIntel CPUであり、AMDの同等機能は、 ARMコアは中央のCPUに組み込まれています。これら2つについてはほとんど知られていません。

マザーボードがSMPSを受信すると、CPUのリセットを常に停止し、CPUはROM内のアドレスを読み取ります。これは通常FFFF:0000hです。ファームウェアコードへのジャンプ(ショートカットのような)が含まれています。

このファームウェアは、BIOSと呼ばれる1つのモノリシックコードブロックであり、キーボードでのみ使用できました。 [〜#〜] uefi [〜#〜] を使用すると、これは現在、ミニファイルシステムを備えた完全なOSになっています。今日、ジャンプポイントは、UEFIを解凍するブートストラップコード(おそらくBIOSと呼ぶことができます)です。 UEFIはミニオペレーティングシステムが好きで、マウスサポート、ネットワークブート、SCSI、RAID、ディスクおよび/またはメモリチェッカー、およびその他の多くの機能を備えている場合があります。

UEFIは、ロードされると、すべてのハードウェアに問題がないかどうかを確認する電源投入時自己診断(POST)を実行します。

完全なPOSTは、CMOS、ビデオROM、コントローラなどの多くのデバイスをチェックします、DMA(デバイスがRAMに直接アクセスできるようにします)、CPU、メモリ、その他のデバイス。PCをリセットするとき、つまりリセットボタンを押すか、再起動コマンドを実行すると、単純なPOSTが実行され、たとえば、CMOSに問題があるかどうかはわかりません。 CMOSは、揮発性メモリ(電源を切るとメモリが失われる)とクロックのマザーボード上の小さなチップであり、小さなバッテリーで駆動され、UEFIのすべての設定が含まれています。

UEFIはこれらの設定を読み取り、必要なシステムに変更を加え、システムのブートストラップを続行します。 UEFIは、ドライブ上のブートレコードを検索してレガシーブートを実行するか、より最新のUEFIブート方法を使用できます。これには、 Linuxカーネルブートマネージャー (Windows)またはgrubなどのブートローダーをロードできるUEFIブートストラップコードを備えたFAT32フォーマットのパーティションが必要です。

UNIXシステムのカーネルは、必要なすべてのデバイスドライバーをロードしてから、initプロセスをロードします。 Initはsystemdまたはbashなどの他のプログラムにすることができます。カーネルパラメータで設定します。カーネルをUEFIで直接ロードすることを選択した場合、カーネルパラメータを設定するのがはるかに困難になることに注意してください。一度ロードされると、initはPID 1を取得し、ユーザーランド(システムシェル、およびオプションでグラフィカルユーザーインターフェイス)をロードします。

1
thecarpy

ここでスプラッシュは何を表していますか?

これは、起動されたカーネルイメージ/ファイルの名前です。または、あなたが得るように、カーネルコマンドラインの最初の引数

cat /proc/cmdline

これは通常私に3つの議論を与えます:

[カーネル名] [initrd = ...] [root = ...]

カーネルのデフォルト名はvmlinuzです。スプラッシュスクリーンが組み込まれているカーネルのスプラッシュはubuntuの名前に違いないと思います。

これ(「スプラッシュ」を示す)はsystemdの機能であり、sysvinitでは「/ sbin/init」でした。 initはカーネルイメージではなく、カーネルによって呼び出され、残りのブートパラメータで呼び出されるため、これは素晴らしいことですが、少しごまかしです。

そして/ sbin/initは(systemdの下でpid#1として)systemdバイナリ/ lib/systemd/systemdへのリンクです。

では、なぜBIOSではなく最初のプロセスとしてinitを呼び出すのか[〜#〜] ufei [〜#〜]

[UEFI! UE-ファームウェア-インターフェース]

「Init」は単に最初のLinuxプロセスです。/sbin/initの開始は、カーネルが最後に行うことです。

Linuxは、386CPUのプロテクトモードを利用するというアイデアから始まったことを思い出してください。このモードがなければ、実際のプロセスはありません。

ある意味で、Linuxカーネル自体が効率的なプロセス生成システムをセットアップするだけです。どのようにするかはあなた次第です:init =/bin/bashを使用して、1 MBまたは2 MBのみのシステムで起動できます。その後、バックグラウンドでbashジョブを開始するか、必要に応じてフォークするバイナリを開始できます。または、最初のbashの「上」で別のbashを開始します。ただし、シェルで1つの「終了」が多すぎると、カーネルに戻ってすぐにパニックになります。

...または最初のプロセスとしてsysvinitを使用できます。この古典的なinitは、定義した各ttyのログインプロセスを開始します。そして、これは、あるプロセスから別のプロセスに切り替えるためのAltキーを取得する場所です。 ttyから他のプロセスを開始でき、/ etc/inittabはグラフィカルな「シェル」を直接開始するように構成できます。

...または、(2012年以降)systemdを「init」として使用して機能を追加することもできます。そのほとんどは他のsystemdバイナリによって行われます。

したがって、initは定義上、カーネルによって実行される最初のバイナリです。カーネルは1つのinitを開始し、次にこのinitは1つ以上のプロセス(ログイン、デーモン)を開始します。

プロセッサーがコードを処理していても、初期のCPUアクティビティは、ビジュアルUEFI-BIOSとUEFIシェル(もちろん同時にではありません)でさえ、プロセスとは呼ばれません:-)

@スティーブン:

Initrd =、rdinit =、およびinit =ブートパラメーターがあります。 initrd =はramdiskのファイル/イメージに名前を付けます。rdinit=を使用すると/ init(ramdiskが最初に実行するファイル)を変更でき、init =を使用すると/ sbin/initを変更できます。

これはリンクでかなり混同していると思います。 initrd-fsの/ initはrdinit =によって制御され、sbinのinit =はinit =によって制御されているためと考えられます

最近、これらのオプションをいじくり回しました-ディストリビューションやブートローダーに依存しません。私は、ブートローダーのように機能するUEFIシェルから始めますが、EFIシステムパーティション内にある限り、任意のカーネルとinitrdをオンザフライで選択できる点が異なります。

だから:

Fedora\vmlinuz root=/dev/sda2

私はFedora 29のカーネルを正常に起動できます-initrdなしで。

私が試した他のすべてのカーネルには、sata/scsiモジュールがないため、initrdが必要です。

Arch5\vmlinuz-linux initrd=Arch5\initramfs-linux.img root=/dev/sda3 init=/usr/bin/sysvinit

これは私が今いるシステムを正確に起動する方法ですが、/ sbin/init(/ lib/systemd/systemdへのリンク)の代わりに古いsysvinitを使用します。ここでは、root =を使用して/ dev/sda3にswitch_rootし、init =を使用して/ sbin/init以外のものを開始するのはarchlinuxの/ initです。

また、/ initを操作して再起動し、起動して起動しました。

Arch\vmlinuz.4.20.6 initrd=Arch\archsam.cpio

/ initにルートパーティションをハードコーディングしたため、root =はありません。

PS:

[    0.000000] Linux version 5.1.12-Arch1-1-Arch (builduser@heftig-24809) (gcc version 9.1.0 (GCC)) #1 SMP PREEMPT Wed Jun 19 09:16:00 UTC 2019
[    0.000000] Command line: Arch5\vmlinuz-linux initrd=Arch5\initramfs-linux.img root=/dev/sda3

これらは私の最初の2つのカーネルメッセージ行です。繰り返しますが、Arch5\vmlinuz-linuxのバックスラッシュに注意してください!

そしてpsaxfは私にこれを与えます(カーネルスレッド2から約200なしで):

    1 ?        Ss     0:01 /sbin/init Arch5\vmlinuz-linux
  291 ?        Ss     0:00 /usr/lib/systemd/systemd-journald
  304 ?        Ss     0:00 /usr/bin/lvmetad -f
  315 ?        Ss     0:00 /usr/lib/systemd/systemd-udevd
  321 ?        Ss     0:00 /usr/lib/systemd/systemd-networkd
  453 ?        Ssl    0:00 /usr/lib/systemd/systemd-timesyncd
  456 ?        Ss     0:05 /usr/lib/systemd/systemd-resolved
  466 ?        Ss     0:02 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only
  467 ?        Ss     0:00 /usr/lib/systemd/systemd-logind
  469 ?        Ss     0:00 login -- root
  484 tty1     Ss     0:00  \_ -bash
  922 tty1     S+     0:00      \_ xinit fvwm
  923 tty2     S<sl+   8:08          \_ /usr/lib/Xorg :0
  930 tty1     S      0:00          \_ xterm -geometry +1+1 -n login fvwm
  932 pts/0    Ss+    0:08              \_ fvwm
  937 pts/0    S+     0:00                  \_ /usr/lib/fvwm/2.6.8/FvwmButtons 9 4 none 0 8 RightPanel
  938 pts/0    S+     0:00                  \_ /usr/lib/fvwm/2.6.8/FvwmEvent 11 4 none 0 8 EventNewDesk
  939 pts/0    S+     0:00                  \_ /usr/lib/fvwm/2.6.8/FvwmPager 13 4 none 0 8 *
  940 pts/0    S+     0:01                  \_ /usr/lib/fvwm/2.6.8/FvwmIconMan 15 4 none 0 8
  941 pts/0    S+     0:04                  \_ /usr/lib/fvwm/2.6.8/FvwmScript 17 4 none 0 8 FvwmScript-DateTime
  955 pts/0    Sl    22:28                  \_ /usr/lib/firefox/firefox
 1049 pts/0    Sl    18:08                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 1 -isForBrowser -prefsLen 1 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
 1129 pts/0    Sl     0:46                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 2 -isForBrowser -prefsLen 5850 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
 8411 pts/0    Sl     0:24                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 5 -isForBrowser -prefsLen 7065 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
31147 pts/0    Sl     0:00                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 10 -isForBrowser -prefsLen 9059 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
32497 pts/0    Sl     0:04                  |   \_ /usr/lib/firefox/firefox -contentproc -childID 11 -isForBrowser -prefsLen 9059 -prefMapSize 179366 -parentBuildID 20190620195126 -greomni /usr/lib/firefox/omni.ja -appomni /usr/lib/firefox/browser/omni.ja -appdir /usr/lib/firefox/browser 955 true tab
11810 pts/0    S      0:00                  \_ xterm
11812 pts/1    Ss     0:00                      \_ bash
  406 pts/1    R+     0:00                          \_ ps axf

私はubuntuとsplashをチェックしました... splashはgrubパラメーターであり、それ自体でいくつかの問題を引き起こします。私に

/ sbin/initスプラッシュオプション

意味がありませんが

/ sbin/initコマンドラインの最初の部分

理にかなっています。

ところで、LILOがどういうわけかコマンドラインに「auto」を渡すことについてのinit/main.cのこのコメントを知っていますか?ブートローダー、カーネル、initrd/initおよび/ sbin/init(ランレベルまたはsystemd-targetの場合)によるこのコマンドライン解析はそれほど単純ではありません。

追加:

「男ps」は言う:

   args        COMMAND   command with all its arguments as a string.
                         Modifications to the arguments may be shown.
                         The output in this column may contain spaces.
                         A process marked <defunct> is partly dead,
                         waiting to be fully destroyed by its parent.
                         Sometimes the process args will be unavailable;
                         when this happens, ps will instead print the
                         executable name in brackets.

これが、pid 2とその子プロセスを使用した[kthreadd]がブラケットを取得する方法です!なぜ「論拠の修正」が示されるのか疑問に思うだけです。

0
user359065