LinuC Level1 v10.0 対策コース(パート2)23/29
スーパーサーバーとプロセスについて
今回は、スーパーサーバーや初期化プロセスについて解説します。
Linuxシステムには、デーモンという常駐プログラムがあります。
スーパーサーバー(スーパーデーモン)とは、その他のデーモンに代わってポートを監視し、クライアントからのリクエストがあるとすぐに対応するデーモンを起動するプログラムです。詳しくはこちらの記事で解説しています。
https://envader.plus/course/12/scenario/1147
初期化プロセスについて
ここからは、初期化プロセスに関するファイルとコマンドについて解説します。
init
Linuxでは多くのプロセスが実行されますが、全てのプロセスの親プロセスがinitというプロセスです。
カーネル起動後、まずinitが起動します。その後initが他の子プロセスを起動し、システムを管理します。
ps
コマンドでinitを調べると、PID: 1
と表示されます。PID: 1
は最初に起動・実行されたプロセスのIDを表します。
ps 1
PID TTY STAT TIME COMMAND
1 ? Sl 0:02 /init
/etc/init.d/
/etc/init.d/
ディレクトリには、サービス(デーモン)の起動とその後の動作を制御するシェルスクリプトが格納されています。
initでは、まず /etc/rc.d
ディレクトリの下にある/etc/init.d/
の中のサービスを起動するためのシンボリックリンクを読み込みます。シンボリックリンクはSやKから始まる名前で、S
はサービスの開始(start)、K
はサービスの停止(stop)を表します。
# /etc/rc2.dの例を見てみます。
l /etc/rc2.d │yusuke 17900 0.0 0.0 2612 576 pts/7 T May31 0:00 vimtu
total 8.0K │yusuke 17905 0.0 0.1 21376 6804 pts/7 T May31 0:00 vim
drwxr-xr-x 2 root root 4.0K May 14 12:23 . │yusuke 18104 0.0 0.0 2612 504 pts/7 T May31 0:00 vimtu
drwxr-xr-x 111 root root 4.0K May 15 04:36 .. │yusuke 18110 0.0 0.1 21376 7084 pts/7 T May31 0:00 vim
lrwxrwxrwx 1 root root 29 Mar 16 17:30 K01apache-htcacheclean -> ../init.d/apache-htcacheclean │yusuke 22348 0.0 0.0 16284 3712 pts/8 Ss May30 0:01 zsh
lrwxrwxrwx 1 root root 17 Mar 16 17:30 S01apache2 -> ../init.d/apache2
これらのシンボリックリンクは、chkconfig
(RedHat系ディストリビューション)やupdate-rc.d
(Debian系ディストリビューション)を使用し自動で生成することができます。
しかし、initの弱点としては、スクリプトを一つひとつ実行するためシステムの起動に時間がかかること、またスクリプトにミスがある場合に予想外の挙動を示す可能性があるということが挙げられます。
Upstart
Upstartでは、initを使用しますが、依存関係を設定しサービスの並列起動ができます。また、イベント駆動型であるため、システム起動時に必要のない処理を切り出すことができ、従来よりシステム起動時間が短縮されました。
ここでのイベント(event)とは、ファイルシステムのマウントやシステムの再起動など、何かしらの変化のことを指します。
イベント駆動とは、initなどイベントの発生をきっかけとし、処理を実行することを指します。
実行する処理は、サービス(デーモンなどの常駐プログラム)とタスク(実行後に終了する処理)があります。これらの処理をひとまとめにしジョブ(job)と言います。ジョブは並列実行が可能です。
しかしUpstartはサービス単位で処理を実行するため、それ以上に処理を細分化することができませんでした。そこで、その問題を解決するためにsystemdが開発されました。
systemd
systemdはinitの代わりにsystemdプロセスを初期化プロセスとして起動します。
# initのパスを調べます。
which init
init not found
systemdでは、以下のプロセスを起動します。
デーモン名 | 説明 |
---|---|
systemd-initd | メインプロセス |
systemd-journald | ログ(journal)を管理する |
systemd-logind | ユーザーのログインを管理する |
systemd-networkd | ネットワークを管理する |
systemd-resolved | 名前解決を行う |
systemd-timesyncd | システム時間やタイムゾーンを制御する |
systemd-udevd | デバイスマネージャで、デバイスの動的検知システムとして/dev配下の処理を行う |
systemdの特徴は、多数のUnitといった処理単位に分割し管理することです。
Unit
Unitは役割によって種類が分かれています。
Unit | 説明 |
---|---|
service | サービスを管理(起動・停止。再起動)する |
target | 複数のUnitをグルーピングする |
mount | ファイルシステムをマウントする |
automount | 自動的にマウントされるポイントを定義する |
device | 管理対象となるデバイスを定義する |
swap | スワップ領域を有効にする |
timer | 定期実行するような処理を管理(起動・停止・再起動)する |
socket | ソケットを作成しリッスンする |
path | 特定のファイルやディレクトリを監視し、イベント発生時(ファイルが作成されたとき)に特定のサービスを実行する |
systemdプロセスが起動されると、default.target
Unitが実行されます。default.target
は、システムの基本的なサービスを順次実行していきます。
また、Unitは依存関係とは別に起動順序が指定できます。
つまり、systemdを使用することで、細分化されたUnitによりさらに効率的に処理を実行でき、システムの起動時間を大幅に短縮できます。
systemctlコマンド
systemdの操作はsystemctl
コマンドで行ないます。systemctl
コマンドは、サブコマンドと組み合わせて実行します。
systemctl [サブコマンド] [Unit名] [Unitの種類(任意)]
サブコマンド
サブコマンド | 説明 |
---|---|
start | 指定したUnitを起動する |
stop | 指定したUnitを停止する |
restart | 指定したUnitを再起動する |
reload | サービスの設定ファイルをリロードし、新しい設定を適用する |
status | 指定したUnitの稼働状況を表示する |
is-active | 指定したUnitが稼働しているか否かを確認する |
enable | システム起動時に指定したUnitを自動的に起動する設定をする |
disable | システム起動時に指定したUnitが自動的に起動しないようにする設定をする |
mask | 指定したUnitが手動で起動(systemctl start)できないように無効化する |
unmask | 指定したUnitの手動起動無効化設定(マスク)を解除する |
list-dependencies | 指定したUnitの依存関係を表示する |
list-units | 起動している全てのUnitの状態を表示する |
list-unit-files | 全てのUnitを表示する |
get-default | default.targetのリンク先を表示する |
set-default | default.targetのリンク先を設定する |
reboot | システムを再起動する |
poweroff | システムをシャットダウンする |
serviceコマンド
service
コマンドは主にDebian系列やRed Hat系列などのディストリビューションでサービスを管理するために使われます。
service [Unit名] [サブコマンド]
サブコマンド
サブコマンド | 説明 |
---|---|
start | 指定したUnitを起動する |
stop | 指定したUnitを停止する |
restart | 指定したUnitを再起動する |
status | 指定したUnitの稼働状況を表示する |
新しいシステムでは通常、より強力な systemctl
コマンドが推奨されます。しかし、古いスクリプトや互換性を保つために、 service
コマンドも依然として広く使われています。
まとめ
この記事では、スーパーサーバーと初期化プロセスについて解説しました。スーパーサーバーは、他のデーモンに代わってポートを監視し、クライアントからのリクエストがあるとデーモンを起動するプログラムです。
初期化プロセスには、init
、 Upstart
、そして systemd
があり、それぞれがシステムの起動やデーモン管理に関する機能を持っています。 systemd
は、効率的な処理の実行を可能にし、システムの起動時間を短縮します。 systemctl
コマンドや service
コマンドを使用して、 systemd
を操作することができます。
記事の内容は理解できましたか?