【LPIC101】システムアーキテクチャ:システムの起動①
LPICの勉強を兼ねて、Ping−tで学習したことをまとめています✍️
システムアーキテクチャ
システムの起動
ブートプロセス
一般的なLinuxシステムでは、
BIOS
→ ブートローダ
→ カーネル
→ init
の順にブートプロセスが進行する。
BIOS
- コンピュータの電源を入れると最初に起動する。
- 記憶装置等に対して最低限の認識をし、起動デバイスの優先順位を決定する。
- 優先順位に従い、各デバイスの先頭セクタにあるMBRを読み込み、得られたブートローダに制御を移す。
- 起動デバイスの優先順位はBIOSセットアップ画面で任意の順序に変更可能。
ブートローダ
- 起動されると、記憶装置(HDD)内のカーネルをロードし、制御を移す。
- BIOSの次に起動される。
- Linuxシステムでは
GRUB
が該当する。 - MBR に格納されている 第一段階部分 と、 記憶装置内 の別の場所に格納されている 第二段階部分 がある。
- 厳しいサイズ制限があるためこのように分かれている。
- 記憶装置内のカーネルをロードし、カーネルに制御を移す役割を果たす。
カーネル
- 起動されると、高度にハードウェアを認識・制御し、ルートファイルシステムのマウントなど様々な初期化処理を行う。
初期RAMディスク(initramfs)
/boot
ディレクトリに格納される。- 展開してイメージ内のディレクトリ・ファイルを参照できる。
lsinitrd
コマンドで格納されているディレクトリ・ファイルを参照できる。- カーネルの各バージョンに対応する初期RAMディスクが存在する。
init
- 最初に起動されるプロセス。PID(プロセスID)は必ず
1
。
SysVinit
- 従来のinitプログラム。
/sbin/init
が起動される。 - initプロセスは設定ファイル
/etc/inittab
の記述に基づいて、自動起動すべきプロセスを立ち上げるなど、アプリケーションレベルの初期化を行う。 - 以降、initプロセスは全てのプロセスの先祖(直接・間接的な呼び出し元)として存在し続ける。
- 最近のシステムでは初期化処理を高速化した
Upstart
やsystemd
を採用している場合がある。- その場合は基本的に
etc/inittab
ファイルは使用されない。
- その場合は基本的に
Upstart
- SysVinitを改善した新しい仕組み。現在はsystemdへの置き換えが進められている。
- サービスやタスクを ジョブ という単位で扱う。
- 各ジョブの実行に必要な前提条件を イベント で管理し、前提条件が全て成立した時点でジョブを実行する イベント駆動型 。
- イベントはシステム上の変化を検知するだけではなく、
initctl
コマンドで発行することもできる。 - サービスの起動に必要な条件が成立した時点で起動処理が行われるため不要な待機時間がなくなる。
- イベントはシステム上の変化を検知するだけではなく、
- 各ジョブの実行がパラレルに行われるため、関連のない独立したサービスは同時に起動できる。
systemd
- 各サービスを並列起動することができる。
- 順次起動していくSysVinitに比べて高速なシステム起動や停止が行える。
cgroups
というLinuxカーネルの機能によってプロセスのリソースを管理できる。- SysVinitではPIDで管理していた。
- Unitという単位で管理される。
systemctl list-unit-files
コマンドで利用可能なUnit一覧を表示する。- 各機能ごとに拡張子が割り当てられている。
- 拡張子を見ることでどういった機能のためのUnitか判別できる。
拡張子 | 機能 |
---|---|
device | 各種デバイスを管理するUnit |
mount | ファイルシステムのマウントを管理するUnit |
service | サービスを制御するUnit |
swap | スワップ領域を管理するUnit |
target | 複数のサービスを一つのグループにするためのUnit |
systemctl
コマンド
- 各サービスの稼働状況や起動設定を管理する。
- コマンドの書式:
systemctl サブコマンド [Unit名]
- Unit名に拡張子がない場合は
.service
の拡張子を持つUnitが選択されたとみなす。
- Unit名に拡張子がない場合は
主なサブコマンドの一覧
サブコマンド | 用途 |
---|---|
disable | サービスの自動起動を無効にする |
enable | サービスの自動起動を有効にする |
get-default | 次回起動時のターゲットを表示する |
halt | システムを停止しhalt状態にする |
is-active | サービスが稼働しているかを表示する |
list-unit-files | すべてのUnit定義ファイルを一覧表示する |
reboot | システムを再起動する |
reload | サービスの設定ファイルを再読み込みする |
restart | サービスを再起動する |
set-default | 次回起動時のターゲットを設定する |
start | サービスを起動する |
status | サービスの状態を表示する |
stop | サービスを停止する |
poweroff | システムを停止し電源を切断する |
journalctl
コマンド
systemd-journald
のログを表示する。systemd-journald
が書き込むログファイルはバイナリ形式のためcat
やless
では正常に表示できない。
- コマンドの書式:
journalctl [オプション] [検索文字列]
-k
または、--dmesg
オプションでdmesg
コマンドと同じ情報(起動時にカーネルが出力したメッセージ)が出力できる。