mgmmyBlog

Webエンジニア👩‍💻 Railsの話がメインです。

【LPIC101】システムアーキテクチャ:システムの起動①

f:id:mgmmy:20200503130258p:plain

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プロセスは全てのプロセスの先祖(直接・間接的な呼び出し元)として存在し続ける。
  • 最近のシステムでは初期化処理を高速化した Upstartsystemd を採用している場合がある。
    • その場合は基本的に 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が選択されたとみなす。
主なサブコマンドの一覧
サブコマンド 用途
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 が書き込むログファイルはバイナリ形式のため catless では正常に表示できない。
  • コマンドの書式: journalctl [オプション] [検索文字列]
  • -k または、 --dmesg オプションで dmesg コマンドと同じ情報(起動時にカーネルが出力したメッセージ)が出力できる。