ここではLinuxの基礎知識として、PCに電源が入ってからLinuxが起動するまでのプロセスと登場人物について解説します。
1.全体の流れ
①ファームウェア(BIOS・UEFI)の起動
↓
②ブートローダ(GRUB Legacy・GRUB2)の起動
↓
③カーネル(vmlinuz)
↓
④Linuxのプロセス初期化(SysVinit・systemd)
①ファームウェア(BIOS・UEFI)
電源を入れるとすぐに起動するソフトウェアで、PC周りのデバイスの初期化や次プロセスのブートローダ起動を行うもの。BIOS(バイオス)は、ファームウェアの一種でBasic Input Output Systemの略。その名の通りデバイスの動作や基本的な入出力の制御を行う。UEFI(読み方がないためこっちもバイオスと呼ぶことが多い)は、BIOSの後継機で現在の主流。
②ブートローダ(GRUB Legacy・GRUB2)
Linuxのカーネルを実行するためのプログラム。ブートローダの主流はGRUB(グラブ)というプログラムで、GRUB LegacyとGRUB2の2バージョンがある。どちらかはLinuxのディストリビューションによる。どちらもコマンド「grub-install」でインストールできる。LegacyではGRUBの設定は設定ファイルから直接修正する必要があったが、2ではコマンド「grub-mkconfig(grub2-mkconfig)」で修正できるようになった。
③カーネル(vmlinuz)
OSの中核を担い、起動時のメモリの初期化や時刻設定などOSの初期設定を行い、次プロセスのinit・systemdを呼び出すプログラム。Linuxの主流はvmlinuz(特に呼び方は無いらしい。ブイエムリナズで大体通じる)。呼び出されるとカーネルの部品となるプログラム(カーネルモジュール)を読み込んでカーネルを組み立てていく。カーネルモジュール一覧はコマンド「lsmod」で確認できる。カーネルモジュールの追加はコマンド「modprobe(-rオプションで削除)」で行う。
④Linuxのプロセス初期化(SysVinit,systemd)
SysVinitやsystemdは、ユーザーによるLinuxの操作や、サービスの提供に必要なプロセスを起動して、最後にログインプロンプトを表示するプロセス。Linuxの初期化システム。SysVinitは古く一部のディストリビューションでしか採用されていない。現在の主流はsystemd。
❶SysVinitの動作
カーネルから呼び出されたSysVinitはinitプロセスという初期化プロセスを実行する。このプロセスの動作は以下の通り。なお、initプロセスは最初に呼び出されるプロセスのためPID=1。
ⅰ init が /etc/inittab を読み込む(ランレベル決定)
↓
ⅱ /etc/rc.d/rc.sysinit を実行(ユーザースペース初期化)
↓
ⅲ /etc/rc.d/rc を実行(ランレベルに応じたスクリプト選定)
↓
ⅳ /etc/rc.d/rc3.d/S* を順に実行(各サービス開始)※「S*」はSが起動・Kなら停止で動作する。「*」の部分は2桁の数字で起動・停止の順番を指す。
↓
ⅴ /etc/rc.d/init.d/ 内のスクリプトが呼ばれ、デーモン(httpdなど)を起動
※サービス…PCやソフトウェアがユーザーに提供する機能のこと。
※デーモン…サービスを提供する実体のプログラム。常時バックグラウンドで動作している。
※ランレベル…OSの動作を制御する英数字のこと。OS起動時にどのサービス・デーモンを有効にするかを制御できる。現在のランレベルはコマンド「runlevel」で確認できる。変更はコマンド「init」。ランレベル
ランレベル | 説明 |
0 | システム停止・電源断。シャットダウンと同様。 |
1,S,s | rootによるシングルユーザーモード。メンテ用。 |
2 | マルチユーザーモード※ネットワーク無し |
3 | マルチユーザーモード※GUIなし |
4 | カスタム項目 |
5 | マルチユーザーモード |
ⅰ./etc/inittabの説明
initプロセスが最初にこのファイルを読み込んでシステムの起動順序やランレベルを制御する。デフォルトのランレベルはファイル内に記載の「id:ランレベル:initdefault:」に定義されている。
ⅱ./etc/rc.d/の説明
このディレクトリには起動スクリプト群が入っている。ランレベルと「/etc/rc.d/rcランレベル.d/」ディレクトリのランレベルの英数字が一致するスクリプトを実行している。
ⅲ.サービスの起動・停止
コマンド「service」でサービス名を指定し、空白の後に「start」か「stop」を指定することで、ランレベルにかかわらずサービスの起動・停止ができる。
❶systemdの動作
sysVinitと違いサービスファイルやランレベルは無く、Unitという管理サービスや設定ファイルが変わりに存在する。また、sysVinitではカーネルからの起動後にinitプロセスが起動したが、systemdではsystemdプロセスが起動する。Linuxシステムの起動、サービス管理、デバイス管理、マウント管理等を柔軟に制御できる。
Unitには以下のようなタイプがある。※もっとあるがLPIC1の範囲だけ説明する。
Unitタイプ | 説明 |
target | 複数のUnitをグループにまとめる。これでサービスの起動や停止に必要なUnitをまとめている。 |
service | デーモンやサービスの起動や停止その他設定を定義。 |
socket | プロセス間の通信用出入口(ソケット)の管理。 |
timer | サービスを指定した時刻や間隔で実行する。 |
systemdプロセスの動作は以下の通り。
ⅰ /etc/systemd/system/default.targetに記載のデフォルトのターゲットにアクセスする。
↓
ⅱ アクセス先が/lib/systemd/system/multi-user.targetだった場合、このファイルに記載のサービスを起動。※従来のランレベル3と同様の環境。
※ターゲット…OSの動作モードのこと。従来のランレベルとほぼ同じ意味。ランレベルとの対応表は以下。
ランレベル | ターゲット名 | 説明 |
---|---|---|
0 | poweroff.target | シャットダウン |
1 | rescue.target | シングルユーザーモード(メンテナンス用) |
2 , 3 , 4 | multi-user.target | GUIなしのマルチユーザーモード(ネットワークあり) |
5 | graphical.target | GUIありのマルチユーザーモード |
6 | reboot.target | 再起動 |
S (またはsingle ) | rescue.target | シングルユーザーモード(1 と同じ) |
– | emergency.target | システム修復等で使用するrootのみログイン可能な最小限の特殊な環境。緊急モードのこと。 |
ⅰ.default.targetの説明
Linux起動時にsystemdが最終的に到達するデフォルトターゲットを指すシンボリックリンクのこと。ターゲットはこのファイルのリンク先で決まる。従来のデフォルトランレベルと同じ。
リンク先の変更はコマンド「systemctl サブコマンド [対象Unit]」で変更できる。以下はターゲット関連のサブコマンド。
サブコマンド | 説明 | 例 |
---|---|---|
get-default | 現在の default.target を確認 | systemctl get-default |
set-default | デフォルトターゲットを変更 | sudo systemctl set-default graphical.target |
isolate | 指定ターゲットに即座に切り替え | sudo systemctl isolate multi-user.target |
ⅱ.ターゲット変更をせずにサービスを起動・停止する方法
コマンド「systemctl」のサブコマンドでターゲットの変更を伴わずにサービスの起動・停止が可能。
sysVinitと違い、サービスの起動・停止の実行結果は出力されないため、「status」「is-active」による結果確認が必要となる。
サブコマンド | 説明 | 例 |
---|---|---|
start | サービスを起動 | sudo systemctl start sshd |
stop | サービスを停止 | sudo systemctl stop sshd |
restart | サービスを再起動 | sudo systemctl restart sshd |
reload | 設定を再読み込み(プロセス再起動なし) | sudo systemctl reload nginx |
enable | 起動時に自動起動させる(永続化) | sudo systemctl enable nginx |
disable | 自動起動を無効化 | sudo systemctl disable nginx |
status | サービスの状態表示 | systemctl status sshd |
is-active | 現在起動しているか確認 | systemctl is-active cron |
is-enabled | 自動起動が有効か確認 | systemctl is-enabled cups |
is-failed | サービスが異常終了したか確認 | systemctl is-failed sshd |