LPIC 勉強記録 第7章 システムアーキテクチャ

#第7章 システムアーキテクチャ

`Intel Coreマイクロアーキテクチャ`は、`プロセッサチップ`と`PCH(Platform Controller Hub)チップ`によるチップセットから構成される

`プロセッサチップ`は以下の機能を含む
・ マルチコアプロセッサ
・ メモリーコントローラ
・ ホストブリッジ(プロセッサ、メモリとPCIバス0を接続するブリッジ)
・ グラフィックスコントローラ
・ ディスプレイインタフェース(DP、eDP、DVI、HDMI、オーディオ)
・ PCI Express(外部グラフィックスデバイス用)
・ Local APIC(x2APIC)

`PCH(Platform Controller Hub)チップ`は、周辺装置を接続するためのハブで、以下の機能を含む
・ PCI-to-PCIブリッジ(PCIバス0と他のPCIバスを接続)
・ SATAコントローラ
・ USBコントローラ
・ オーディオコントローラ
・ イーサネットコントローラ
・ PCI Express
・ I/O APIC(x2APIC)

`プロセッサチップ`と`PCH`は`DMI(Direct Media Interface)`によって接続される
`DMI`は論理的には、`PCIバス0(バス番号：0)`と見なすことができる
プロセッサチップ内部とPCH内部のデバイスは、`PCIバス0`に接続される

プロセッサの情報は`/proc/cpuinfo`に格納されている
`lscpuコマンド`でも表示できる

`lspciコマンド`は、システムのすべての`PCIバス`と、接続されているデバイスに関する情報を表示する
`-sオプション`で、特定のバス、デバイス、機能を指定することができる
`-vオプション`で詳細情報を表示できる
`-nオプション`でベンダ名でなく、ベンダIDで表示できる

`lsusbコマンド`は、`USBバス`と、接続されているデバイスに関する情報を表示する
`-tオプション`で、USBでバウスの物理的な階層構造を表示できる
`-sオプション`で、`Bus番号：デバイス番号`により、表示するデバイスを指定できる
`-vオプション`で、詳細情報を表示することができる

`インタラプト(Interrupt)`は、デバイスがシステムに処理を要求するときに、割り込み要求`IRQ(Interrupt ReQuest)`を発行することにより起こる
ディスクの読み取りや書き込みの完了、キーボードやマウスの入力などをシステムに通知する際に、この`IRQ`を出す
IRQを発生したデバイスを識別するため、デバイスごとに`IRQ番号`が割り当てられる

`/proc/interruptsファイル`は、IRQなどインタラプトの情報を格納したファイル

`lsmodコマンド`は、現在システムにロードされているモジュールの状態を表示する
`/proc/modulesファイル`の内容が読み込まれて表示される

| コマンド | 説明 |
|:----------|:---------|
|lsusb|USBデバイスに関する情報を表示する|
|lsmod|カーネルのモジュールの状態を表示する|
|lspci|PCIバスに接続されたデバイスの情報を表示する|
|modprobe|カーネルへモジュールの追加や削除を行う|

`modprobeコマンド`は、指定されたモジュールの依存関係を確認し、必要なモジュールを自動的に追加、もしくは削除する
モジュールに対する設定を行う場合は、`/etc/modprobe.d/ディレクトリ`の下に、`.conf拡張子`を持つファイルを配置する

`ACPI`は、`PC/AT互換機`の電源制御の統一規格として採用された、ハードウェアコンポーネントの電源管理のための規格
電源ボタン、ノートPCのフタの開閉、バッテリーの充電状態、プロセッサの速度制御などにより、省電力化を行う

システムを立ち上げる処理を`ブート(boot)`という
`ブートシーケンス`とは、電源を入れてからログイン画面あるいはログインプロンプトが表示されるまでに、カーネルの初期設定、ファイルシステムのマウント、システムの様々な管理をするプログラム(デーモン)の起動、ネットワークの設定など、OSが稼働するために必要なすべての設定までの一連の流れのこと

電源を投入すると、`BIOS`が起動する
`BIOS`は、ハードディスクの先頭領域に書き込まれたブートローダをメモリに読み込み、起動させる
ブートローダは、ハードディスクに保存された`/boot`以下にある`vmlinuzファイル`(圧縮されたカーネルコードが格納されているファイル)からカーネルコードをメモリに読み込む

カーネルは自信を解凍して初期化処理を行う
カーネルは自身の初期化の最終段階で、1番目のユーザプロセスである`init(プロセスIDは1)`を生成する
実行されるプログラムは`/sbin/init`
initは起動すると、`/etc/inittabファイル`を読み込む
`/etc/inittab`には、システムのランレベルとinitが起動するプログラムが記述されている

`ランレベル`とは、システムの動作モードのことで、停止、再起動、稼働時のサービスの提供/享受などを定義する
ランレベル3のときは、`mingetty`と呼ばれるプログラムがコンソールにログインプロンプトを表示する
ランレベル5のときは、ディスプレイマネージャがログイン画面を表示する

`BIOS環境`の場合、ハードディスクの`ブートローダ`は`MBR(Master Boot Record)`と呼ばれるディスクの先頭ブロックに書き込まれている
`ブートローダ`の役割は、BIOSから呼び出されて、カーネルをメモリにロードし、カーネルに制御を渡すところまで
Linuxの主なブートローダとして、`GRUB`や`GRUB2`がある
`GRUB`は、GNUで開発されたブートローダで、GRUBの起動画面から起動OSの選択、エントリの編集、コマンドラインによる操作などを実行できる
GRUBのインストールは、rootユーザが`/sbin/grub-installコマンド`を実行して行う
引数にはインストールするディスクのデバイス名を指定する
GRUBの設定ファイルは、`/boot/grub/grub.conf`または`/boot/grub/menu.lst`ファイル

| 項目 | 説明 |
|:----------|:---------|
|kernel|カーネルのイメージファイルとカーネルオプションを指定する|
|initrd|初期RAMディスクのイメージファイルを指定する|

| オプション | 説明 |
|:----------|:---------|
|quiet|ほとんどのカーネルメッセージを抑制し、表示を行わない。指定しない場合は、起動処理の詳細情報が表示される|

起動時にカーネルに渡された引数を確認するには、`/proc/cmdlineファイル`で確認できる

`GPT(GUID Partition Table)`は、`MBR`に代わるハードディスクのパーティションの規格であり、`EFI`の機能の1つ
`MBR`は基本パーティションを4個、`GPT`はパーティションを128個利用できる
最大パーティションサイズとして、MBRは`2TiB(2.2TB)`、GPTは`8ZiB(9.4ZB)`

| 起動プログラム | 説明 |
|:----------|:---------|
|BIOS|ディスクの先頭ブロック(MBR)に書き込まれたブートローダをメモリにロードする|
|UEFI|UEFIブートエントリで指定されたEFIシステムパーティション中のブートローダをメモリにロードする|

`BIOS`は、PCノハードウェアに組み込まれている不揮発性メモリ(NVRAM)に格納されたプログラム(ファームウェア)
PCの電源を投入すると、`BIOS`は設定されたデバイスの優先順位に従って、ディスクの先頭ブロックにある`MBR`内のブートローダを検索し、最初に検知したデバイスのローダを起動する

`UEFI`からOSをブートするときは、`NVRAM`に設定された優先順位に従って、ディスクの`EFIパーティション`に格納されているブートローダを起動する

`GRUB2`は、`GRUB Legacy(GRUB1)`の後継として開発されたブートローダ
モジュールを動的ロードする機能を持ち、リカバリモードやメモリテストのメニューがある

|　主なディレクトリと設定ファイル | 説明 |
|:----------|:---------|
|/boot/grub/grub.cfg|設定ファイル。ディストリビューションによっては、/boot/grub2/grub.cfg|
|/usr/lib/grub/i386-pc|モジュールの置かれたディレクトリ。この下のモジュールがGRUB2のインストール時に、/boot/grubの下にコピーされて使用される|

`grub-mkconfigコマンド`は、設定ファイル`grub.cfg`を生成する
引数なしで実行すると、設定ファイルの内容を標準出力に出力する
作成された`grub.cfg`では、デバイス番号は`0`から始まり、パーティション番号は`1`から始まる

| ブートローダ | 説明 |
|:----------|:---------|
|shim.efi|EFIがブートエントリを参照して呼び出す第1ステージのブートローダ。第2ステージのブートローダであるgrubx64.efiファイルを呼び出す|
|grubx64.efi|第1ステージのブートローダshim.efiから呼び出される第2ステージのブートローダ。grub.cfgファイルを読み込んでGRUB2起動画面を表示する。grub.cfgの設定に従ってカーネルとinitramfsをメモリにロードし、カーネルを起動する|

| 主なGRUB2コマンド | 説明 |
|:----------|:---------|
|insmod|モジュールの動的ロード|
|initrd|カーネルが利用するinitramfsを指定|

BIOS環境の場合、GRUB2をインストールするには、`grub2-installコマンド`にデバイス名を指定して実行する
UEFI環境の場合、以下の2通りの方法がある
①`yum reinstall grub2-efi`を実行
　`grub2-efiパッケージ`から、`/boot/efi/EFI/centos/grubx64.efi`が再インストールされる
②`grub2-install`を実行
　`/boot/grub2/x86_64-efi/core.efi`が生成され、それが`/boot/efi/EFI/centos/grubx64.efi`にコピーされる
　この場合は、efiのモジュールの`grub2-efi-modulesパッケージ`を事前にインストールしておく必要がある

`initramfs`は、ディスク内に構築されたルートファイルシステムへアクセスするための、ディスクのデバイスドライバやファイルシステムモジュールを含むディレクトリ構成として作成され、それを`cpio`でアーカイブし、`gzip`で圧縮したファイル
ただし、ファイル内のサフィックスは`.gz`ではなく`.img`となっている
ディスク内の本来のルートファイルシステムをマウントするために、システム起動時にメモリ上に展開されて一時的に使われる小さなルートファイルシステム
`/run/initramfsディレクトリ`以下にログを記録する
`init`は`initramfs`の中に含まれ、最初に起動されるプログラム

カーネルは、起動すると初期化のための処理を実行するが、その過程でカーネル自身の情報や検知したハードウェアの情報を画面に表示する
システム起動時にカーネルが画面に表示するメッセージは、ログイン画面が表示されると消えてしまう
ログイン後に`dmesgコマンド`で閲覧可能
`dmesgコマンド`はカーネルのリングバッファの内容を表示・制御する
`--clearオプション`を指定すると、カーネルのリングバッファの内容を消去する
システム起動時に実行されるシェルスクリプトの中で、`dmesgコマンド`が実行されているため、これらのメッセージは`/var/log/dmesgファイル`に格納される

`SysV init`では、`/etc/inittabファイル`に記述されたランレベルを基に、`initプロセス`がサービスを起動する
`ランレベル`とはシステムの動作モードのことで、停止、再起動、稼働時のサービスの提供/享受などを定義する
システム起動後のデフォルトのランレベルは、`アクション`フィールドが`initdefault`であるエントリの`ランレベル`フィールドで指定する
起動時に使用するスクリプトをランレベルごとに、ディレクトリで管理している
システム起動時、`initプロセス`は、ランレベルに対応したディレクトリを使用して、サービスの開始や停止を行う
各スクリプトとファイル名は、ファイル名の先頭文字(`S`は開始する、`K`は停止する)でコントロールする
`initプロセス`は、各ファイル名の先頭が`S`の場合は、スクリプトファイルに`start`を付けて実行する
各ファイル名の先頭が`K`の場合は、スクリプトファイルに`stop`を付けて実行する
実行の順番制御に使用され、番号の低いものから順に実行されていく

`telinitコマンド`は`init`に指示を与えて、ランレベルを変更する
ランレベル1で`init(telinit)`コマンドを実行して、シングルユーザモードに移行することで、他のユーザがログインできないようにすることができる
`initコマンド`を実行すると、ログインユーザへの通知を一切行わず、直ちにシステムの変更を行うため、作業中のユーザがいたり、利用中のサービスがある場合は注意が必要
`initプロセス`に設定ファイルを再読み込みさせる際は、`telinitコマンド`に`qオプション`を指定して実行する

| 主なランレベル | サービス |説明|
|:----------|:---------|:---------|
|0|停止|システムの停止|
|1|シングルユーザ|rootだけログイン可能。システムのメンテナンスで使用される|
|3|マルチユーザ|rootだけでなく、一般ユーザもログイン可能。コンソールに表示されたログインプロンプトからログインする|
|5|マルチユーザ + GUI画面|ディスプレイマネージャのログイン画面からX Window Systemにログインする、[Ctl]+[Alt]+[Fn]キーの操作により、コンソールからもログインできる|
|6|再起動|システムの再起動|

`shutdownコマンド`は、ログインしているすべてのユーザに対し、システム状態の変更通知が行われ、さらに変更までの猶予時間の設定が可能
メッセージの出力も可能

現在のランレベルを調べるには、`runlevelコマンド`や、`whoコマンド`を使用する

`systemd`は`SysV init`に代わる仕組みで、ソケットとD-BUSを利用することにより並列処理の機能を強化し、依存関係を定義してサービスを管理する
`systemd`の中核となるデーモン`/usr/lib/systemd/systemd`は、`/sbin/init`とリンクされた同じプログラムで、`SysV init`の`init`と同じく、カーネルから起動される最初のユーザプロセスであり、`PID`には`1`が割り当てられる

`systemd`は`ユニット(unit)`によってシステムを管理する
`ユニット`にはハードウェア、ストレージデバイスのマウント、サービス、ターゲットなど、12のタイプがある
各ユニットは`/usr/lib/systemdディレクトリ`と`/etc/systemdディレクトリ`の下のファイルで管理されるが、ファイルを直接編集することはなく、`systemctlコマンド`によって設定や表示など、ほとんどすべての管理ができる
`ターゲット`は、起動プロセスやサービスなど、複数のユニットをグループ化したユニットであり、`SysV init`のランレベルに相当する

システムの起動時に、`systemd`は`default.target`をスタートする
通常、`default.target`は`graphical.target`または`multi-user.target`へのシンボリックリンク
`default-target`は、`systemctl`のサブコマンド`get-default`で表示、`set-default`で変更ができる
ブートローダのカーネルコマンドラインオプション`systemd.unit`によって、`systemd.unit=multi-user.target`のように指定することもできる

`サービス`は各種デーモンやサービスの起動に関するユニット
HTTP Webサービスである`httpd`は、`httpd.service`として管理されており、`httpdサービス`は`/usr/lib/systemd/system/httpd.serviceファイル`で管理されている

カーネルバージョンやマシンアーキテクチャなどのシステム情報を表示するには、`unameコマンド`を使用する

ホストを再起動するために、現在ログインしているユーザ全員の端末にメッセージを送るのは`wallコマンド`

| コマンド | 説明 |
|:----------|:---------|
|uptime|現在時刻、システム起動からの時間、システム上にいるユーザ数、システムの平均負荷が順に表示される|
|w|ログインしている人とその人がしていることを表示する。ヘッダにはuptimeと同じ内容が表示される|
|top|プロセスの情報を周期的にリアルタイムに表示する。1行目にはuptimeと同じ内容が表示される|

#終わりに
ついに3周目終了！！！