initd(systemV)

initd

はじめに

initは、Unix系オペレーティングシステムの初期化プロセスを担当する非常に重要なコンポーネントです。システムの起動時に最初に実行されるプロセスであり、プロセスID 1(PID 1)を持ちます。initは、システムの起動、ランレベルの管理、デーモンの起動と停止、システムのシャットダウンと再起動を担当します。本記事では、initの役割、構造、動作の詳細について詳しく説明します。

initの概要

initの役割

initは、システムの最初のプロセスとして、次のような役割を担います。

  • システムの起動: カーネルが起動すると、initプロセスが開始され、システムの残りの部分を起動するための基盤を提供します。
  • ランレベルの管理: initは、システムのランレベル(動作モード)を制御し、特定のランレベルに関連するサービスを起動または停止します。
  • デーモンの管理: initは、さまざまなシステムデーモン(バックグラウンドプロセス)を起動し、必要に応じて監視および再起動します。
  • システムのシャットダウンと再起動: initは、システムの安全なシャットダウンおよび再起動を管理します。

ランレベルとは

ランレベルは、システムの動作モードを示す数値であり、各ランレベルには特定のサービスが関連付けられています。一般的なランレベルは次のとおりです。

  • 0: シャットダウン
  • 1: シングルユーザーモード(メンテナンスモード)
  • 2: マルチユーザーモード(ネットワークなし)
  • 3: マルチユーザーモード(ネットワークあり、GUIなし)
  • 4: 未使用(カスタム用)
  • 5: マルチユーザーモード(ネットワークあり、GUIあり)
  • 6: 再起動

initの構造と設定

/etc/inittab

/etc/inittabファイルは、initの設定ファイルであり、システムのランレベルとそれに関連するアクションを定義します。各行は、次の形式で記述されます。

id:runlevels:action:process
  • id: 一意の識別子
  • runlevels: 適用されるランレベル
  • action: 実行するアクション(例:respawn、wait、onceなど)
  • process: 実行するコマンドまたはスクリプト

/etc/rc.dまたは/etc/init.d

これらのディレクトリには、各ランレベルで実行されるスクリプトが配置されています。各スクリプトは、サービスの起動、停止、再起動を管理します。

  • /etc/rc.d/rc*.d: 各ランレベルに対応するディレクトリ。例:/etc/rc.d/rc3.dはランレベル3に関連するスクリプトを格納。
  • /etc/init.d: サービススクリプトの実際の場所。各スクリプトは、startstoprestartの引数を受け取ります。

initの動作

システム起動時の動作

  1. カーネルの起動: システムの電源が投入されると、ブートローダーがカーネルをロードし、カーネルが起動します。
  2. initの起動: カーネルが初期化を完了すると、initプロセスがPID 1として起動されます。
  3. ランレベルの設定: initは、/etc/inittabファイルを読み取り、デフォルトのランレベルを設定します。通常、このランレベルは5(マルチユーザーモード、GUIあり)または3(マルチユーザーモード、GUIなし)です。
  4. サービスの起動: initは、設定されたランレベルに基づいて、関連するサービススクリプトを順次実行します。

システム運用中の動作

  • サービスの監視と再起動: initは、設定に従って特定のサービスを監視し、必要に応じて再起動します。例えば、respawnアクションが指定されたサービスは、終了すると自動的に再起動されます。
  • ランレベルの変更: システム管理者は、initコマンドを使用してランレベルを変更できます。例えば、init 3コマンドでランレベル3に切り替えることができます。

システムシャットダウンと再起動

  • シャットダウン: init 0コマンドを実行すると、システムはランレベル0に切り替わり、シャットダウンプロセスが開始されます。これにより、すべてのサービスが安全に停止され、システムの電源がオフになります。
  • 再起動: init 6コマンドを実行すると、システムはランレベル6に切り替わり、再起動プロセスが開始されます。

initのメリットとデメリット

メリット

  • シンプルな構造: initはシンプルなスクリプトベースのシステムであり、理解しやすくカスタマイズが容易です。
  • 広範な互換性: initは、ほとんどのUnix系システムで利用可能であり、長い歴史を持つため、既存のスクリプトやツールが豊富です。

デメリット

  • 起動時間が長い: initはサービスをシーケンシャルに起動するため、システムのブート時間が長くなることがあります。
  • 手動依存関係管理: サービスの依存関係は手動で管理する必要があり、複雑な環境では管理が難しくなることがあります。

まとめ

initは、LinuxおよびUnix系システムの初期化プロセスを担当する重要なコンポーネントです。シンプルなスクリプトベースのアプローチを採用しており、システムの起動、ランレベルの管理、サービスの起動と停止、システムのシャットダウンと再起動を行います。initには、シンプルで理解しやすいというメリットがありますが、起動時間が長い、手動での依存関係管理が必要というデメリットもあります。適切に設定し、管理することで、安定したシステム運用を実現できます。