🚀 ニフティ’s Notion

【サーバ運用入門2024 #6】systemd

デーモン(サービス)とは

主にバックグラウンド(標準入出力から切られている状態)で動作しているプロセス(プログラム)のことです。

常に動かすプロセスはデーモンにするのが一般的です。

OS上では様々なプロセスがデーモンとして起動していて、有名なプロセスだと名前の最後に d が付いているのがお決まりです。

  • httpd
  • sshd
  • crond
  • named

Unix, Linuxではデーモン、Windowsではサービスと呼ばれることが多いです。指してるものは同じです。

initとは

私たちがターミナルでコマンドを叩いてプロセスを起動するのと同様に、プロセスを起動するためのプロセスが必要です。

そのため、一番最初に起動するプロセスをきめ、それが他のプロセスを起動していきます。

OSが起動する際は

  1. ブートローダがカーネルを起動
  2. カーネルがinitデーモンを起動
  3. initデーモンが各種プロセスを起動

という流れになっています。

initシステムの1つであるSysVinitは昔から使われており、仕組みが単純であるため今でも使われていることも多いです。また、一部のOSでは互換性のためにsystemdとinitの両方が使えるようになっていることもあります。

/etc/init.d/ ディレクトリに起動や停止の処理を書いたシェルスクリプト(hoge.sh)を作成し、 /etc/init.d/hoge start コマンドを叩くとサービスが開始されます。

実行したい内容をシェルスクリプトで書くため、挙動を自由度高く制御できます。一方、起動スクリプトに問題がある際に気付きにくい等の問題があります。

また、実行順序設定に従い1つずつ実行していく(並列起動できない)ため、systemdに比べて諸々の起動に時間がかかるという問題もあります。

systemdとSysVinitは基本部分から大きく違いますが、設定ファイルを作り、サービス登録し、startコマンドを叩くという操作の流れは変わりません。

systemdとは

SysVinitに様々な問題点があるため、新たに開発されたソフトウェアの集まりです。

initデーモンだけではなく、ログ管理デーモンなど、様々なソフトウェア全体のことを指します。

最近はデフォルトでsystemdが有効になっているディストリビューションが多数派になってきています。

  • システムおよびサービスの管理  systemctl コマンド
  • ログ管理  journalctl コマンド
  • システムユーザ、グループ管理
  • ログインセッション管理
  • デバイス管理

などなど多くの機能があり、解説だけで本が書けます。

サービス管理では並列化機能による高速化などのメリット、ログ管理では高速かつ検索しやすいなどのメリットがあります。

systemdでは各種リソースをunitという単位で考えます。unitは扱うものによって11種類のタイプに分類されています。

systemctl list-units -a コマンドで現在扱っているunitの一覧を見ることができます。

語尾についている .service .socket などがタイプです。

※ここで出るserviceはWindowsのサービスとは別物です。unitのタイプの一つにserviceという名前がついているだけです。

今回の講義では、システムの起動・停止、サービスの登録について軽く触れます。

systemdでサービス登録・起動・停止(演習)

systemdで扱うサービスはシステム管理者(root)で扱う必要があり、すべてのコマンドにsudoをつける必要があります。

今回は付け忘れによる権限付与ミス等を防ぐため、rootユーザで操作します。

※ログや誤操作の観点から、本来はrootユーザでの操作は望ましくないです。演習なので許してください。

最初に、rootユーザになります。

% sudo su -

ユーザとカレントディレクトリを確認してください。

# whoami
root
# pwd
/root

まず、/root/date_memory.shをルートユーザで作成します。

# vim date_memory.sh
#!/bin/bash

while true
do
	var1=`date`
	var2=`cat /proc/meminfo | grep "MemFree"`
	echo ${var1} ${var2} >> /tmp/date_memory.txt
	sleep 3
done

実行権限を付けます。

どうやって?
# chmod +x date_memory.sh

今回は作成したdate_mamory.shをサービスとして登録します。

Unit定義ファイルを作成します。 /etc/systemd/system/date_memory.service

# vim /etc/systemd/system/date_memory.service
[Unit]
Description = date_memory daemon

[Service]
ExecStart = /root/date_memory.sh
Restart = always
Type = simple

[Install]
WantedBy = multi-user.target

中身の説明は省略します。適切にUnitファイルを書けばサービスとして認識されることが理解できれば良いです。

Unitがサービスとして認識されたかを確認します

# systemctl list-unit-files --type=service

量が多いので、date_memoryという文字列で絞り込みをしてください

どうやって?
# systemctl list-unit-files --type=service | grep date_memory

自動起動、起動設定します。

# systemctl enable date_memory
# systemctl start date_memory

ステータスを確認すると実行されているのが見えます。

# systemctl status date_memory

書き込み先の /tmp/date_mamory.txt を見てください。

常に動いているので、3秒以上待つと書き込み先も更新されるはずです。

今回の設定では Restart = always と記述したので、再起動後も自動で実行されるはずです。

再起動後にもう一度 /tmp/date_mamory.txt を見てください。

# reboot

(再起動後、もう一度ssh接続したあとにrootになっておく)

% sudo su -

余談  /tmp ディレクトリ

一時的なファイルを置くためのディレクトリで、再起動すると中身がすべて消えます。

再起動後に /tmp/date_mamory.txt を見ると、再起動後の時間からのデータしか無いはずです。これは、システムを落としたタイミングでファイルごと消えているからです。

他にも特殊な性質を持つディレクトリなので、名前くらいは覚えておいて損はないです。

サービスを止めます。

# systemctl stop date_memory

ステータスを確認すると停止しているのが見えます。

# systemctl status date_memory

systemd-journald(ちょっと演習)

systemdのログ管理を行うプロセスです。systemdとは独立しています。

systemd-journaldが様々な場所(カーネル・syslog・systemd各unitの標準(エラー)出力など)からログ情報を収集し、journalとして蓄積・管理します。

journalから人間が読める形式でログを見るコマンドが journalctl です。試しに叩いてください。

% journalctl

当然ですが、大量のログが出てきます。

先ほど作ったdate_memoryデーモンのログを見てみます。

※力技で絞り込む方法

% journalctl | grep date_memory  

-f オプションをつけるとリアルタイムでログを追いかける事ができます。

date_memoryサービスをもう一度動かして 、以下コマンドでログを見てみてください。

※オプションとして絞り込みを指定する方法

% journalctl -f -u date_memory.service

journalctlの様々な引数、journaldそのものの設定など、便利に使う機能は沢山ありますので、業務内外で使うとなった時は調べてみてください。

※systemdパートの内容は時間等の制約のため、かなり大雑把な説明になっています。この内容だけで「俺はinit / systemd完全に理解してます!」なんて言うと多方面からしっかり怒られます。
今回の講義では、systemdの概略、systemctlコマンドを使ってサービスの登録、起動、停止が行えることを理解できれば良いです。

今回は説明しませんが、cronのように時間設定をして起動等もできます(timer unit)。興味が出たら・業務で詳しく使うことになったら、この資料内容を足掛かりに詳しく調べてください。

systemdの思想と機能 ―Linuxを支えるシステム管理のためのソフトウェアスイート
systemd(システムディー)はLinuxの基本的な構成要素を提供するソフトウェア群です。システムやサービスの管理機能を中心として,ハードウェアの管理,ログの管理などを行う多数の独立したソフトウェアからなっています。 Linuxでシステム管理を行うときにはsystemdの知識が必要になります。systemdに関するオンラインマニュアルなどは充実しているものの,systemdがどんな機能を提供しているかを知らなければ「どのドキュメントを読めばいいのか」「何を探すべきなのか」の見当がつかないでしょう。 本書はsystemdの概要をつかみ,マニュアルなどを適切に参照できるようになることを目的としています。systemdの設定変更や,設定ファイル(unit file)の解釈/作成/変更,systemdが記録したログの読解などのシーンで役立つトピックを解説します。また,systemdの機能に対応するLinuxカーネルの機能を知ることができます。Red Hat Enterprise Linux 8と9を題材にして解説しますが,多くの内容は他のディストリビューション(Debian,Ubuntu,openSUSEなど)でも活用できます。 ※本書は雑誌『Software Design』の2021年6月号~2022年11月号に掲載された連載記事「systemd詳解」を再編集した書籍です。
title
https://gihyo.jp
title