Lesson 12

Linux上でシステム管理をしてみよう

Lesson 12 Chapter 1
はじめに

このレッスンでは、詳細なシステム管理をすることが出来るLinuxコマンドについて学んでいきます。
具体的には以下のことが出来るようになります。

  • 自身のコンピュータ上で起動しているプロセスの確認
  • プロセスの設定ファイルの記述や設定反映
  • 自身のコンピュータ上で起動しているサービスの起動・停止

まずはコマンドの実行方法よりも先に、Linux上で行われるシステム管理の概念から学んでいきましょう。

Lesson 12 Chapter 2
プロセス管理の親であるsystemd

systemd(システムディー)とはLinux上で一番最初に起動するプロセスであり、あとに続くシステムやサービスを管理するための仕組みです。様々なサービスやデーモンの起動順序を管理しています。

デーモンについて

デーモンとはシステムの機能を提供するために、各システムに常に起動しているバックグラウンドプロセスです。 デーモンは、各システムに対して行われるリクエストなどを検知し、それらを受け取る"門番"のような立ち位置にいます。

例えば、Webサーバーでは、HTTPリクエストを受け取り、Webページを返すために、Webサーバーのデーモンが常に起動しています。また、Eメールサーバーでは、Eメールを受信したり、Eメールを送信するために、Eメールサーバーのデーモンが常に起動しています。 実際にデーモンを管理するには、後述するsystemdのsystemctlコマンドを使用することで出来ます。

まずは、サービス(Unit)の定義や管理方法などについて学んでいきましょう。

Unit定義ファイル

systemdはUnit(ユニット)という単位でサービスを管理しており、各Unitに定義ファイルが存在します。 また、systemdによって管理されるサービスやタイマーなどの設定情報を記述するためのファイルには、サービス、タイマー、ソケット、デバイスなどのさまざまなタイプがあります。

これらのUnit定義ファイルは保存先が決まっており、以下の場所に保存されています。

1. /usr/lib/systemd/system
2. /etc/systemd/system

1のパスは標準で設定されているUnit定義ファイルが保存されており、2のパスは自作した定義ファイルの保存先となっています。
自作の定義ファイルは既存のUnit定義ファイルの設定を上書きすることも出来るため、1と2に重複した内容の設定があった場合、2の方を優先します。(基本的に1に保存されている標準のUnit定義ファイルは変更しません。)

Unit定義ファイルの書き方

Unit定義ファイルの記述方法はini形式(イニ形式)で記述されます。ini形式ではセクションという単位で設定をカテゴリ分けしていきますが、セクションには以下の3つがあります。

セクション名 説明
Unit サービスやデーモンを起動するために必要な情報を記述する。
Service サービスを起動するために必要な情報を記述する。
Install サービスをインストールするために必要な情報を記述する。

以下が実際のUnit定義ファイル(INIファイル)の例となります。

[Unit]
Description=uWSGI
After=syslog.target

[Service]
ExecStart=/usr/local/pyenv/versions/3.9.16/bin/uwsgi
Restart=always
Type=notify

[Install]
WantedBy=multi-user.target

基本的には設定項目=設定値の形で記述していきます。いくつか設定項目の説明をします。

設定項目名 説明
Description ユニットの説明
After 自身(ユニット)の前に起動するユニット
ExecStart 起動時に実行するコマンド(コマンドが記述されたファイルのパスを指定することも出来る)
Restart プロセスが停止した時の動作
Type プロセス起動完了判定の条件
WantedBy プロセスの自動起動設定が有効になった際に、wantsディレクトリに自身のリンクを作成

このチャプターでは主にサービスの定義について学習してきました。次は実際に存在するサービスの起動管理の方法について学習していきましょう。

Lesson 12 Chapter 3
systemctl(システムコントロール)

systemctlコマンドはsystemdに含まれるサービス管理コマンドです。サービスの起動や停止、再起動、自動起動の設定などを行うことができます。

以下が基本的なsystemctlコマンドの例です。

$ systemctl [オプション] [Unit(サービス)名]

オプション一覧

systemctlコマンドで使用できるオプションには以下のものがあります。

オプション名 コマンド例
サービス起動 systemctl start [Unit名]
サービス停止 systemctl stop [Unit名]
サービス再起動 systemctl restart [Unit名]
サービスリロード systemctl reload [Unit名]
サービスステータス表示 systemctl status [Unit名]
サービス自動起動有効 systemctl enable [Unit名]
サービス自動起動無効 systemctl disable [Unit名]
サービス自動起動設定確認 systemctl is-enabled [Unit名]
サービス一覧 systemctl list-unit-files --type=service
設定ファイルの再読み込み systemctl daemon-reload

これらのオプションを使用することで、サービスの管理をすることが出来ます。また、ログの表示、システムの再起動やシャットダウン、その他のシステム管理作業にもよく使われます。

それでは、新しいサービスを作った際にsystemctlコマンドを利用してサービス管理をする流れを学んでいきましょう。

各種サービスの起動管理

まず、Unit定義ファイルの作成・編集をしたら、systemdに読み込ませるために、以下のコマンドを実行します。ここではexample.serviceという仮のサービスを例に挙げています。

$ systemctl daemon-reload

上記コマンドの処理が終わったら、サービスを起動をします。

$ systemctl start example.service

また、システム起動時に自動的にサービスを起動させたい場合は以下のコマンドで自動起動設定を有効化できます。

$ systemctl enable example.service

最後に、サービスの停止には以下コマンドを実行します。

$ systemctl stop example.service

また、.service拡張子は省略することが出来ます。これがsystemctlを利用した基本的なサービス管理の流れになります。

ここまでお疲れさまでした。 以上がsystemdを用いたシステム管理と方法になります。実務では主に、自分たちが作ったWebサービスをサーバーに実装する際に必要となる各種システムの設定や起動管理などに使われます。
難しい内容ですが、ここではまず概念だけでもある程度理解できるように頑張ってみましょう。