はじめに (対象読者・この記事でわかること)

この記事は、Linuxを学び始めたばかりの方や、システムの起動プロセスについて理解を深めたい中級者の方を対象にしています。特に、Linuxのランレベルという概念が初めての方や、従来のランレベースからsystemdへの移行に興味がある方に向けています。

この記事を読むことで、Linuxのランレベルの概念と役割、ランレベルの確認と変更方法、そして現在主流となっているsystemdへの移行とその利点について理解を深めることができます。また、実際にランレベルを操作する方法やサービス管理の基本についても学ぶことができます。

前提知識

この記事を読み進める上で、以下の知識があるとスムーズです。 - Linuxの基本的なコマンド操作(ls, cd, catなど) - シェルの基本的な知識 - Linuxのファイルシステムの基本構造

Linuxランレベルの概要と歴史的背景

Linuxのランレベルとは、システムの起動後にどの状態で動作するかを定義する概念です。ランレベルは、システムが提供するサービスのセットを切り替えるための仕組みとして、従来のUnix系システムで広く使われてきました。

Linuxでは一般的に0から6までの7つのランレベルが定義されています。各ランレベルは以下のような意味を持っています。

  • ランレベル0:システムの停止(シャットダウン)
  • ランレベル1:シングルユーザーモード(管理者のみでログイン)
  • ランレベル2:マルチユーザーモード(ネットワーク機能なし)
  • ランレベル3:マルチユーザーモード(ネットワーク機能あり、GUIなし)
  • ランレベル4:未使用(カスタマイズ用)
  • ランレベル5:マルチユーザーモード(ネットワーク機能あり、GUIあり)
  • ランレベル6:システムの再起動

ランレベルの概念は、System V initシステムに由来します。System V initは、Unixシステムで広く使われていた伝統的なinitシステムで、ランレベルをベースにシステムの起動とサービス管理を行っていました。しかし、この方式は起動時間が長く、並列処理が難しいといった課題がありました。

ランレベルの具体的な操作とsystemdへの移行

ランレベルの確認方法

現在のランレベルを確認するには、以下のコマンドを使用します。

Bash
runlevel

または

Bash
who -r

これらのコマンドは、現在のランレベルと前のランレベルを表示します。また、/etc/inittabファイルを確認することでもランレベルを知ることができます。

ランレベルの変更方法

ランレベルを変更するには、initコマンドを使用します。例えば、ランレベル3(マルチユーザーモード、GUIなし)に変更するには以下のように実行します。

Bash
init 3

また、telinitコマンドも同じ機能を提供します。

Bash
telinit 3

systemdの基本概念

systemdは、Linuxのinitシステムおよびサービスマネージャーで、2010年にリリースされて以来、ほとんどのLinuxディストリビューションで採用されています。systemdは、従来のSystem V initの多くの課題を解決するために設計され、並列起動、ソケットベースの起動、依存関係の自動解決などの機能を提供しています。

systemdでは、ランレベルの代わりとして「ターゲット」という概念が導入されています。ターゲットは、システムの状態を定義する単位で、複数のサービスやマウントポイントをグループ化したものです。

systemdへの移行手順

systemdを採用しているディストリビューションでは、ランレベルとターゲットの間には以下のような対応関係があります。

  • ランレベル0 → poweroff.target
  • ランレベル1 → rescue.target
  • ランレベル2 → multi-user.target
  • ランレベル3 → multi-user.target
  • ランレベル4 → multi-user.target
  • ランレベル5 → graphical.target
  • ランレベル6 → reboot.target

systemdでは、systemctlコマンドを使用してシステムを管理します。現在のターゲットを確認するには以下のように実行します。

Bash
systemctl get-default

ターゲットを変更するには、以下のように実行します。

Bash
systemctl isolate multi-user.target

systemctlコマンドの使い方

systemctlコマンドは、systemdでサービスを管理するための主要なコマンドです。以下に基本的な使い方を示します。

サービスの状態を確認:

Bash
systemctl status [サービス名]

サービスを起動:

Bash
systemctl start [サービス名]

サービスを停止:

Bash
systemctl stop [サービス名]

サービスを再起動:

Bash
systemctl restart [サービス名]

サービスを自動起動に設定:

Bash
systemctl enable [サービス名]

サービスの自動起動を無効化:

Bash
systemctl disable [サービス名]

サービスの管理方法

systemdでは、サービスはユニットファイルとして定義されます。ユニットファイルは通常、/etc/systemd/system/ディレクトリまたは/usr/lib/systemd/system/ディレクトリに配置されます。

ユニットファイルを作成または編集した後は、systemdに設定をリロードする必要があります。

Bash
systemctl daemon-reload

ハマった点やエラー解決

systemdへの移行中によく遭遇する問題の一つは、従来のランレベースのスクリプトがsystemdと互換性がないことです。特に、/etc/rc.localのようなカスタム起動スクリプトは、systemdではデフォルトで有効になっていません。

また、サービスの起動順序の定義方法も従来と異なります。systemdでは、After=Before=Wants=Requires=などのディレクティブを使用して依存関係を明示的に定義する必要があります。

解決策

/etc/rc.localを使用したい場合は、以下の手順で有効にできます。

  1. /etc/systemd/system/rc-local.serviceファイルを作成し、以下の内容を記述します。
Ini
[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=oneshot ExecStart=/etc/rc.local TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes [Install] Alias=rc-local.service
  1. systemdに設定をリロードします。
Bash
systemctl daemon-reload
  1. サービスを有効にします。
Bash
systemctl enable rc-local.service
  1. /etc/rc.localファイルに実行権限を付与します。
Bash
chmod +x /etc/rc.local

まとめ

本記事では、Linuxのランレベルの概念と役割、ランレベルの確認と変更方法、そしてsystemdへの移行とその利点について解説しました。

  • ランレベルはシステムの起動後にどの状態で動作するかを定義する概念
  • systemdは従来のSystem V initの課題を解決するために開発され、現在の主流
  • systemdではランレベルの代わりにターゲットという概念が導入されている
  • systemctlコマンドを使用してサービスを管理する

この記事を通して、Linuxシステムの起動プロセスとサービス管理の基本について理解を深めることができたと思います。今後は、systemdの高度な機能やカスタムユニットファイルの作成方法についても記事にする予定です。

参考資料

参考にした記事、ドキュメント、書籍などがあれば、必ず記載しましょう。