initとは
initは他のプロセスを起動させる役割を持っており, 全てのプロセスの親である.
Linuxカーネルの起動後, 一番最初に起動される.
PIDは1が付与されている.
以下はPIDが1かどうかの確認と, 全てのプロセスの親になっているかどうかの確認.
$ ps 1
PID TTY STAT TIME COMMAND
1 ? Ss 0:01 /sbin/init maybe-ubiquity
$ pstree
systemd─┬─accounts-daemon───2*[{accounts-daemon}]
├─atd
├─cron
├─dbus-daemon
├─irqbalance───{irqbalance}
├─login───bash
├─lvmetad
├─lxcfs───2*[{lxcfs}]
├─networkd-dispat───{networkd-dispat}
├─polkitd───2*[{polkitd}]
├─rsyslogd───3*[{rsyslogd}]
├─snapd───11*[{snapd}]
├─sshd───sshd───sshd───bash───pstree
├─systemd───(sd-pam)
├─systemd-journal
├─systemd-logind
├─systemd-network
├─systemd-resolve
├─systemd-timesyn───{systemd-timesyn}
├─systemd-udevd
└─unattended-upgr───{unattended-upgr}
initの歴史
init | 説明 |
---|---|
SysVinit | 最初期のinit. プロセスの起動を並列処理できないといった欠点を持つ. |
launchd | 2005年に登場. macOSで採用されている. |
Upstart | 2006年に登場. SysVinitと完全な互換性を持ちながらも並列処理に対応していた. しかし, プロセスが起動する条件を設定ファイルに記述する必要があり, 条件が揃うと無条件で起動/停止されるため, 不必要な操作が行われる可能性があった. |
Systemd | RedHat社のLennart Poettering, Kay Sieversらによって2010年にリリースされた. 起動を高速にし, 設定をシンプルにすることを設計思想としている. 批判的な意見もあったが, 2011年頃からFedoraを皮切りに主要なLinuxディストリビューションで採用され始めた. RHEL, CentOS, Debian, Ubuntu, Arch Linux等で採用されている. Upstartと違い, 必要なプロセスのみを起動できる作りになっている. 並列処理が可能. |
OpenRC | Gentoo Linuxで採用されているinit. |
SysVinit/Upstartの起動の流れ
SysVinit/Upstartではサービスと呼ばれる単位で処理を管理している.
起動の流れとしては, まず /sbin/init
がPID=1として実行され, その後, /etc/inittab
によって2つのファイルが実行される.
まず1つ目は, /etc/rc.d/rc.sysvinit
によってシステムの初期化(ファイルシステムの整合性チェック, マウント処理, スワップの有効化等)が行われる.
そして2つ目は, /etc/rc.d/rc
によって /etc/init.d/
以下に存在するファイルが順番に実行され, サービスが起動される.
また, SysVinit/Upstartは service
コマンドによって操作することができる.
Systemdの起動の流れ
SystemdはUnit(後述)と呼ばれる単位で処理を管理している.
Systemd環境でも /sbin/init
は存在するが, 大抵は /lib/systemd/systemd
へのシンボリックリンクとなっている.
起動の流れとしては, まず /usr/lib/systemd/systemd
が起動する.
その後, Unitの依存関係を検索し, 有効化すべきUnitの一覧が作成される.
一覧を基に, 順序関係に基づいてUnitを順番に有効化する.
順序関係を持たないUnitは並列に起動処理が行われる.
ちなみに設定ファイルは /usr/lib/systemd/system
と /etc/systemd/system
に配置されている.
前者はシステムが用意したデフォルトの設定ファイルで, 後者は管理者がカスタマイズするための設定ファイルである.
同名の設定ファイルがある場合, /etc/systemd/system
が優先される.
また, Systemdは systemctl
コマンドで操作することができる.
Unitとは
/usr/lib/systemd/system
と /etc/systemd/system
以下に配置されているファイルは, 拡張子が主に以下の5つのどれかになっており, 拡張子によってUnitの種類が判別される.
Unit | 説明 |
---|---|
service | サービス(デーモン) |
target | ターゲット(複数のUnitをグループ化したもの) |
mount | マウントポイント |
swap | スワップ領域 |
device | デバイス |
journald
journaldはSystemd環境で標準で提供されているログの管理サービスで, システムやサービスのログを収集している.
また, Linuxではrsyslogというログの管理サービスが存在するが, これはjournaldが必要に応じてrsyslogに転送している.
また, journaldは, journalctl
コマンドで操作することができる.