LinuxやUnix系OSではデーモンと呼ばれるプログラムが常に動作しています。デーモンとは、システムの起動時に開始され、システム運用中もバックグラウンドで継続して動作するプログラムのことを指します。
このようなプログラムは、ほとんどのOSに存在し、Windowsではサービスと呼ばれます。(※Linuxでもサービスと呼ばれることはありますが、本記事ではデーモンと呼ぶこととします。)
これらは、ユーザーが直接感じることは少ないかもしれませんが、ネットワーク機能、ファイル共有、プリンティングサービス、ログ記録、セキュリティ管理など、システムの根幹を支える多くの基本的なタスクを担っています。
本記事では、Linuxにおけるデーモンの基本的な仕組みについて解説します。
デーモンの役割と特徴
基本的な役割
デーモンの基本的な役割は、主に以下の3点です。
- サービスの提供
- システム管理と監視
- セキュリティの維持
サービスの提供
デーモンでは以下のような多様なサービスを提供します。
ネットワーク機能
ネットワーク接続やデータ転送、リモートアクセスなどのネットワーク関連サービスを管理します。例えば、sshdは、SSH接続を管理しリモートからの安全なアクセスを提供し、dhcpdはDHCPサービスを通じてネットワーク構成情報を配布します。
ファイル共有・データ管理機能
ファイルシステムの管理、ネットワーク経由でのファイル共有、データのバックアップと復元などを行います。例えば、smbdはWindowsベースのネットワークファイル共有を可能にします。
プリント機能
プリンターへのジョブ管理やキュー管理を行い、ユーザーに印刷サービスを提供します。cupsdは標準的なプリントサーバー機能を担います。
システム管理と監視
デーモンは以下のように、システムの健全性とパフォーマンスを維持する役割を担います。
ログ記録
システム活動、エラー、セキュリティイベントなどを記録し、問題の診断や監査に利用されます。syslogdやrsyslogdなどがログ管理を担当します。
システム監視
システムのパフォーマンスを監視し、資源の使用状況を追跡します。これにより、システムの健康状態を保ち、問題が発生した際に迅速に対応できます。snmpdでは、SNMPを使用してネットワークデバイスの監視と管理を行います。
ジョブスケジューリング
定期的なタスクやジョブを自動的に実行させ、システムのメンテナンスや効率的な運用に重要な役割を果たします。crondでは、特定の時間や日付にタスクを実行するように設定できます。
セキュリティの維持
デーモンは以下のように、システムのセキュリティを保つ機能を提供します。
ファイアウォールとネットワークセキュリティ
外部からの不正アクセスを防ぎ、ネットワークトラフィックを監視・制御します。firewalldなどがこれらの機能を提供します。
認証とアクセス制御
ユーザー認証、アクセス権限の管理を行い、システムの安全な使用を保証します。sshdはSSH接続におけるセキュアな認証を管理します。
主な特徴
デーモンには以下のような特徴があります。
- バックグラウンドで実行
- 長期実行
- 自律性
- イベント駆動または要求駆動
- 設定と管理の柔軟性
バックグラウンドで実行
デーモンはバックグラウンドで動作し、ユーザーの直接的な操作や介入なしにタスクを実行します。そのため、ユーザーインターフェースに影響を与えることはありません。
長期実行
デーモンはシステム起動時に開始され、シャットダウン時まで継続して実行されます。これにより、サービスが中断することなく、常に利用可能な状態を維持します。但し、ユーザーがデーモンを中断したり、再実行することは可能です。
自律性
デーモンは自律的に動作し、プリセットされた条件やスケジュールに基づいてタスクを実行します。
イベント駆動または要求駆動
デーモンは通常、特定のイベントが発生した場合、外部からのリクエストがあった場合にのみ活動します。それ以外は待ち状態となります。
設定と管理の柔軟性
多くのデーモンはカスタマイズ可能な設定を持ち、システム管理者によって特定のニーズに合わせて調整されます。例えば、httpdの設定は、サイトの要件に基づいてカスタマイズできます。
デーモンを管理するプログラム(initプロセス)
Linuxでは、各デーモンはinitプロセスによって管理されています。initプロセスはシステムの最初のプロセス1であり、システム起動時にカーネルによって起動されます。
特徴・役割
initプロセスの主な特徴と役割は以下の通りです。
- 最初のプロセス
- システムの初期化
- デーモンプロセスや他プロセスの起動
- プロセスの管理
- シャットダウン・再起動の管理
最初のプロセス
initプロセスは、システムで最初に実行されるプロセスで、プロセスID 1(PID 1)を持ちます。
システムの設定・初期化
initプロセスは、システムの起動時に基本的な設定や初期化(ネットワーク設定、ファイルシステムのマウントなど)を行います。
※ファイルシステムについては以下の記事で解説しているので、もし興味あれば読んでみてください。
デーモンプロセスや他プロセスの起動
initプロセスは、システム起動時に各デーモンプロセスやシステム起動時に起動するように設定されているプロセスを起動します。
プロセスの管理
initプロセスは、システム上で実行される他のプロセスを監視し、それらが適切に機能しているかを管理します。
他のプロセスが終了し、その子プロセスが孤立した(親プロセスがなくなった)場合、initプロセスがこれら孤立プロセスの親となります。
initはこれらの孤立プロセスを適切に処理し、終了させることで、孤立プロセスがシステム上でゾンビプロセス(終了したがプロセステーブルからクリアされていないプロセス)となるのを防ぎます。
シャットダウン・再起動の管理
initプロセスは、シャットダウン・再起動の要求を受けると、以下の処理を行います。
- シグナルの送信:initプロセスは、シャットダウン・再起動の要求を受け取ると、システム上の全てのプロセスに対して終了シグナルを送信します。
- シグナルの送信とサービスの停止:initプロセスは、シャットダウン要求を受け取ると、システム上の全てのプロセスに対して終了のシグナルを送信し、プロセスを停止します。このとき各プロセスは、データの書き込み、ネットワーク接続の閉鎖、その他のクリーンアップ作業を行います。
- ファイルシステムの同期:データがディスクに書き込まれ、ファイルシステムが同期されます。
- シャットダウン・再起動処理:最後に、initプロセスはカーネルにシャットダウン処理を指示し、システムは電源を切るか、停止します。
initプロセスの種類
Linuxにはいくつかの異なるinitプロセスが存在します。主なinitプロセスの種類には以下3種類があります。
- systemd
- SysVinit
- Upstart
systemd
systemdは、現代のLinuxシステムで広く採用されているinitシステムです。高い機能性と効率性およびモダンな要件への対応能力により、多くの主要なLinuxディストリビューションで標準のinitシステムとなっており、最も広く使用されているinitプロセスです。
systemdは以下のような特徴を持ちます。
- 高度な依存関係の管理:systemdは、サービス間の依存関係を効率的に管理し、サービスが正しい順序で起動することを保証します。
- 並列処理:システムの起動時に複数のプロセスを並列で起動することができ、システムの起動時間を短縮します。
- 統合されたシステムログ:systemdはシステムログとサービスログを統合し、ログ管理を容易にします。
SysVinit
1980年代初頭、SysVinitはAT&TのUNIX System Vで導入され、初期のUnixシステムの標準的なinitプロセスとなりました。
1990年代~2000年代初頭にかけて、Linuxディストリビューションの多くがSysVinitを採用しました。SysVinitは長らく標準的なinitシステムとして使用されてきましたが、より高度な機能を備えたsystemdやUpstartなどに徐々に置き換わっています。
シンプルな作りとなっており、今でも特定の環境やシナリオでは依然として利用されています。SysVinitは以下のような特徴を持ちます。
- シンプルさと透明性:SysVinitは比較的シンプルで、設定や動作が容易に理解できます。スクリプトは読みやすく、カスタマイズもしやすいです。
- シーケンシャルなサービス起動:サービスは一つずつ順番に起動されるため、システムの起動時間は依存関係を並列に処理するより現代的なシステムに比べて長くなりがちです。
Upstart
2006年にUbuntuはSysVinitの代替としてUpstartを導入しました。Upstartはイベント駆動型アプローチを採用し、大規模なデスクトップやサーバーシステムでの起動時間の短縮と効率的なサービス管理に貢献しました。
しかし、後にさらに進んだ機能を備えたsystemdに多くのディストリビューションが移行したため、現在ではそれほど広く使われていない状況にあります。Upstartは以下のような特徴を持ちます。
- イベント駆動型アプローチ:Upstartはイベント駆動型のアプローチを採用しており、システムや環境の変更に応じてタスクやサービスを開始または停止します。これにより、より柔軟で迅速なサービス管理が可能になります。
- 並列処理:サービスやタスクの並列起動をサポートしており、システムの起動時間を短縮します。これは特に依存関係が少ないサービスに有効です。
まとめ
デーモンはLinuxシステムの根本的な部分を支えており、systemdなどのデーモンの使い方を理解することでLinux活用の幅が大きく広がると思います。Linuxを扱うエンジニアの方はぜひ深く学んでみることをお勧めします。
脚注
- プロセスとは、実行中のプログラムの単位のことを指す。 ↩︎