私はちょうど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
何ですか天ぷらここの代表ですか?私はinit
これがコンピュータを起動したときに実行される最初のプロセスであることを知っています。しかし、何ですかsplash
?それは何をしますか?
また、これが最初の実行プロセスと呼ばれる理由を教えてくれる人ですかinit
?ところで、コンピュータの起動時に最初に実行されるのはBIOSまたはUEFIプログラムです。それでは、BIOSやUEFIではなく、最初のプロセスをinitとして呼び出すのはなぜですか?
答え1
ここでスプラッシュとはどういう意味ですか?私はinitがコンピュータを起動したときに実行される最初のプロセスであることを知っています。しかし、スプラッシュとは何ですか?それは何をしますか?
まず、起動中にスプラッシュ画面を表示できるubuntuを使用して実行しているため、スプラッシュパラメータがsystemd
あります。よりスプラッシュ.cソースコード
[編集] 私が知っている限り、systemdは起動パラメータをサポートする唯一の初期化であるため、コンピュータでsystemdを実行しています。他にもあるかもしれませんが、Ubuntuでもデフォルト値なので、これが安全な推測であると仮定します。 。 Ubuntuには、デフォルトでロードされたカーネルであるものへの/sbin/init
シンボリックリンクがあります。ここでプロセスのコマンドラインを使用すると、これが表示されます。/usr/lib/systemd/systemd
/sbin/init splash
ps
/sbin/init splash
また、誰かがinitを実行する最初のプロセスだと言いますが、コンピュータを起動したときに最初に実行されるのはBIOSまたはUFEIプログラムと言えますか?それでは、BIOSやUFEIの代わりに最初のプロセスをinitとして呼び出すのはなぜですか?
簡単に説明すると、BIOS / UEFIは起動時にロードされるプログラムであり、追加のシステム起動用の設定データが含まれています。最終的には、ブートマネージャ(grubなど)で起動する次のプログラムを見つけてカーネルを起動できます。ここでは簡単に説明しようとしていますが、これについて読むことができます。 LinuxおよびUnixシステムでは、initはカーネルによって生成された最初のプログラムなので、PID 1を取得します。
もっと読むことができますここ、実際にその記事はかなり古いです。私は次の内容が100%正しいと主張しません。
x86コンピュータを起動するには、最初にすべきことは電源ボタンを押すことです。電源装置はマザーボードに電力を供給し、十分な電力を供給するためにスイッチモード電源装置(SMPS)からの信号を待ちます。たとえば、PCIeグラフィックカードの電力が十分であること、CPUとRAMがあることを確認します。
これインテル管理エンジン(私)/AMDセキュリティ技術この時点から、IMEは未知のminix 3オペレーティングシステムを備えた独立したIntel CPUであり、AMDの同等の製品は中央CPUに組み込まれているARMコアを使用しています。
マザーボードがSMPSを受信すると、CPUの継続的なリセットが中断され、CPUはROMのアドレスを読み取ります。これには通常、FFFF:0000h
ファームウェアコード(ショートカットなど)へのジャンプが含まれます。
ファームウェアは、キーボードでのみ使用できるBIOSというモノリシックコードブロックでした。そしてUEFIこれは、ミニファイルシステムを備えた完全なオペレーティングシステムです。現在のジャンプポイントは、解凍されたUEFIブートコード(おそらくBIOSと呼ばれます)です。 UEFIは、マウスサポート、ネットワークブート、SCSI、RAID、ディスク、および/またはメモリチェッカーなど、さまざまな機能を備えたミニオペレーティングシステムのようなものです。
UEFIがロードされたら、Power-On Self-Test(POST)を実行して、すべてのハードウェアが正常であることを確認します。
フルPOSTは、CMOS、ビデオROM、コントローラ、DMA(デバイスがRAMに直接アクセスできる)、CPU、メモリ、その他のデバイスなど、多くのデバイスをスキャンします。 PCを初期化するとき(つまり、リセットボタンを押すか再起動コマンドを実行する場合)、CMOSに問題があるかどうかなどの問題を認識せずに簡単なPOSTが行われます。 CMOSは、揮発性メモリ(電源が遮断されるとメモリが失われる)と時計を含むマザーボードの小さなチップです。このチップは小さなバッテリーで電力を供給され、UEFIのすべての設定が含まれています。
UEFIはこれらの設定を読み、システムに必要な変更を加え、システムの起動を続行します。 UEFI はドライブからブートレコードを検索し、既存のブートを実行するか、より近代的な UEFI ブート方法を使用できます。これには、ロードできるUEFIブートコードを含むFAT32形式のパーティションが必要です。Linuxカーネル、ブートマネージャ(Windows)またはブートローダgrub
(例:
UNIXシステムのカーネルは、必要なすべてのデバイスドライバをロードし、initプロセスをロードします。初期化systemd
は他のプログラムかもしれません。たとえば、bash
カーネルパラメータで設定できます。 UEFIを使用してカーネルを直接ロードすることを選択した場合、カーネルパラメータを設定する方がはるかに困難になります。ロードされると、initはPID 1を取得し、ユーザースペース(システムシェルとオプションのグラフィカルユーザーインターフェース)をロードします。
答え2
ここでスプラッシュとはどういう意味ですか?
起動したカーネルイメージ/ファイルの名前。あるいは、カーネルコマンドラインの最初の引数だけを使用してください。
cat /proc/cmdline
これは一般的に3つの主張を提供します。
[カーネル名] [initrd=...] [root=...]
カーネルのデフォルト名は vmlinuz です。スプラッシュはスタート画面が組み込まれたUbuntuカーネルの名前であるに違いないようです。
これは(「スプラッシュ」マーク)システム機能です。 sysvinit の場合は「/sbin/init」です。これは素晴らしいですが、少しトリックがあります。これは、initがカーネルイメージを介して呼び出されるのではなく、カーネルと残りのブートパラメータを介して呼び出されるためです。
/sbin/initは、systemdバイナリ/lib/systemd/systemdへのリンク(systemdの下のpid#1)です。
それでは、BIOSの代わりに最初のプロセスをinitとして呼び出すのはなぜですか?UFEI?
[UEFI! UE-ファームウェア-インターフェース]
「Init」は最初のものです。Linuxプロセス。 /sbin/initを起動するのは、カーネルが実行する最後の操作です。
Linuxの元のアイデアは、386-CPUの保護モードを利用することでした。このモデルがなければ、実際のプロセスはありません。
ある程度までは、Linuxカーネル自体が効率的なプロセス生成システムを構築するだけです。使用方法はあなた次第です。 init = / bin / bashを使用して、サイズが1〜2 MBに過ぎないシステムで起動できます。その後、バックグラウンドでbash操作を開始するか、必要に応じて分岐するバイナリを起動できます。または、最初のbashの「上」から別のbashを起動します。しかし、シェルであまりにも「終了」すると、カーネルに戻ってすぐにパニックになります。
...またはsysvinitを最初のプロセスとして使用できます。この古典的な初期化は、定義した各ttyのログインプロセスを開始します。ここでは、Altキーを使用してあるプロセスから別のプロセスに切り替えることができます。その後、ttyから別のプロセスを起動でき、/ etc / inittabはグラフィカルな「シェル」を直接起動するように設定できます。
...または、アドインと共にsystemdを「init」として使用することもできます(2012年ベース)。この作業のほとんどは、他のシステムバイナリによって実行されます。
したがって、定義によると、initはカーネルによって実行される最初のバイナリです。カーネルはinitを起動し、1つ以上のプロセス(ログイン、デーモン)を起動します。
初期のCPUアクティビティにより、プロセッサがコードを処理しているにもかかわらず、Visual UEFI-BIOSとUEFI-Shell(もちろん同時にではありません)はプロセスとして呼び出されません。 :-)
@スティーブン:
initrd =、rdinit =、およびinit =開始パラメーターがあります。 initrd =は、RAMディスクのファイル/イメージ名を指定します。 rdinit= を使用すると /init (RAM ディスクが最初に実行する必要があるファイル) を変更でき、init= を使用すると /sbin/init を変更できます。
リンクでこれを混同しているようです。これは、initrd-fsの/ initがrdinit =によって制御され、sbinのinitがinit =によって制御されるためです。
私は最近、ディストリビューションやブートローダに関係なく、これらのオプションの多くを使用してきました。私はブートローダのように動作するUEFI-Shellから始めました。ただし、カーネルとinitrdがEFIシステムパーティション内にある限り、動的に選択できます。
だから:
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を使用してください。以下はArchlinuxの場合/initです。 root= switch_root root= を /dev/sda3 に使用し、init= を使用して /sbin/init 以外のエントリを起動します。
また、/initを実行してブートした後、再度アーカイブして入りました。
arch\vmlinuz.4.20.6 initrd=arch\archsam.cpio
/init にルートパーティションがハードコーディングされているため、ここには root= はありません。
添付:
[ 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でバックスラッシュを再確認してください!
ps axfは以下を提供します(カーネルスレッド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はいくつかの問題を引き起こすgrubパラメータです。私に
/sbin/init 起動オプション
言わないけど
/sbin/init cmd 行の最初の部分
言葉になりますね。
しかし、LILOがコマンドラインに "auto"を渡すことについてinit / main.cの説明を知っていますか?ブートローダ、カーネル、initrd/init、および/sbin/init(ランレベルまたはsystemd-targetの場合)を介したコマンドライン解析はそれほど簡単ではありません。
次に追加:
「男の追伸」が言った:
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]とその子プロセスが角かっこを取得する方法です!なぜ「引数の修正」が表示されるのか疑問に思います。