Fedora15 から採用された systemd。これによりサービスの設定などは事実上、GUI での設定が不可能になった。サービスの起動や終了などは GUI からでも行えるのだが、ランレベルなどを考量した場合、コマンドの知識が必要不可欠である。

 

今回は、サービスの設定方法などを簡単に説明する。

 

サービスダイアログ

まずは、Fedora15 でのサービスダイアログを見てもらおう。

Fedora15 でのサービスダイアログ

お気づきだろうか?

Fedora14 で存在していた「カスタム」ボタンが消えています。
これは、GUI でのランレベルでの設定が不可能になっているのを意味します。
しかも多くのサービスでは有効/無効の設定さえ 変更する事はできません。

もちろん、systemd 自体に SysVInit (従来の起動方法)との互換がありますので起動や終了などは行えますが、GUI では自動での起動や終了は行えないと思った方が良いでしょう。

 

サービスの自動起動での設定は、スーパーユーザーで以下のようなコマンドを発行する必要があります。

 

コマンド系列
# chkconfig --level 345 httpd onsystemvinit
# systemctl enable httpd.servicesystemd

 

Systemd系では、ランレベルで使用していた数字は、徐々に使わなくなってきているようです。(runlevel3 → multi-user.target)
詳しくは、このページをご覧下さい。(英語のページですが、表は参考になるハズです)

 

また、上記の systemd コマンドでサービスを有効にする場合、ランレベルの指定が無い事にも注目してください。
これは systemd 系の設定では、サービスの設定ファイル自体にターゲットを指定するため、有効/無効を行う場合には指定の必要が無くなった事を意味します。

 

※ SystemVInit で指定されているサービスを 「systemctl」コマンドで「enable」にした場合は、すべてのランレベルで有効になります。
※ 「systemd」と「SystemVInit」の両方で指定されている場合、「systemd」が優先されます。
※ 完全に「systemd」に移行されたサービスでは、「chkconfig」コマンドではアクセスできません。

 

オプション意味
start開始systemctl start httpd.service
stop停止systemctl stop httpd.service
status状態確認systemctl status httpd.service
enableシステム起動時に自動起動systemctl enable httpd.service
disableシステム起動時に自動起動しないsystemctl disable httpd.service
reload設定ファイルの再読み込みsystemctl reload httpd.service
isolateシステムのランレベルを変更systemctl isolate multi-user.target
set-defaultシステム起動時のランレベルを変更systemctl set-deault graphical.target

 

systemd ダイアログ

systemd では、ユニット全体を管理しており、その中の一分としてサービスを管理しています。

まずは、ユニット関連を操作できるダイアログをインストールしましょう。

 

※ Fedora22 からは DNF を用いてインストールを行います。詳しくはコチラをご覧下さい。
Fedora22 では「systemd-ui」(旧systemd-gtk)が廃止されました。Fedora 21 用の rpm などを利用するはインストールする事は可能ですが、基本的にはコマンドで行う事になりました。

 

systemd ダイアログのインストール

「systemd-ui」(旧systemd-gtk)と入力し、systemd ダイアログをインストールします。(検索項目を指定する場合は、事前に虫眼鏡アイコンにする事)

ココで注意してもらいたいのですが、「systemd ダイアログ」 はメニュー項目には追加されません。


※ 『システムツール』>『services』に追加されましたが、一般ユーザーとして起動されるため、閲覧以外の操作は行えません。

 

端末からスーパーユーザーになった状態で「systemadm&」と入力して起動します。

 

$ su
password:
# systemadm &
[1] 10518
#

 

すると、次のようなダイアログが表示されます。

 

systemd ダイアログでサービスを表示

systemd ダイアログでユニットを選択

サービスのみを表示する場合は、左上のポップアップで選択して下さい。

 

ここで、ウェブサービス(httpd.service)について見てみましょう。

httpd サービスの状態

これは、LSB(SystemVInit)経由で実行されている項目ですので、かなり大雑把な印象ですが、赤字の項目に注目して下さい。

※ 現在では Systemd に移行されていますので表示は異なります。

 

  1. 実行するのに必要なユニット
    例えば「service httpd start」や「systemctl start httpd.service」とした場合に要求される項目です。本来なら、「network.target」などが入るべきかと思われますが、LSB経由であるため、基礎サービスなどが指定されています。
  2. 「有効」にした場合に要求されるユニット
    「multi-user.target」はランレベル3を意味します。また、「graphical.target」はランレベル5を意味します。つまり、「有効」にした場合に組み込まれるランレベルを表しています。
  3. ユニットの有効/無効
    有効/無効を表すもので、実際に実行中かどうかは関係ありません。
  4. ユニットの状態
    「running」:実行中、「exited」:終了、「faild」:起動失敗などがあります。例えば、起動時に1回だけ実行が必要な初期化処理などは、「exited」と表示されます。

 

※ ユニットにはデバイスやソケットなども含まれます。これは、あるサービスが特定のデバイスやソケットとの依存関係が存在する場合等に利用します。例えば、DVD関連のサービスが存在する場合、「/dev/dvd」などのデバイスが必要になる事がありますが、デバイスの準備完了を待つ場合などに重宝します。そういった依存関係などを管理するものが「systemd」だと理解すれば良いでしょう。

 

Fedora18 systemsdm systemd-gtk 起動アイコン

Fedora18 になってようやく起動アイコンが設定されました。『アプリケーションの表示』>『システムツール』>『Services』

 

※ 従来のサービスダイアログは 『アプリケーションの表示』>『その他』>『サービス』で起動できます。

 

 

systemd.service の記述

ここで、サンプルとして作成した「mysqld.service」の設定ファイルを掲載します。

 

[Unit]
# 説明文
Description=MySQL Server
# このサービスを起動するのに必要なユニット
After=network.target syslog.target# このサービスを必要とするユニット
Before=postfix.service dbmail-imapd.service dbmail-lmtpd.service dbmail-pop3d.service dbmail-timsieved.service
#===============================================================

[Service]
# 起動方法
Type=simple# 起動/終了コマンド
ExecStart=/usr/bin/mysqld_safe
ExecStop=/bin/kill -15 $MAINPID# 実行ユーザー
user=mysql# プロセスIDファイル
PIDFile=/var/run/mysqld/mysqld.pid# 終了時(起動失敗も含む)の再起動指定
Restart=always
#===============================================================

[Install]
# 有効にした場合の組み込み先(ランレベルの指定も含む)
WantedBy=multi-user.target

 

何となく分かるかとは思いますが、文法は「man systemd.unit」「man systemd.service」などで確認して記述して下さい。

 

※ man コマンドさえよく知らない場合は、まずはココをご覧下さい。 

 

上のようなサービス設定ファイルを記述した場合は、「/lib/systemd/system」に作成したファイルを置くようにして下さい。決して「/etc/systemd/system」に置いてはいけません。
また、「/lib/systemd/system」配下のファイルを変更した場合は、スーパーユーザーで「systemctl daemon-reload」コマンドを発行するようにして下さい。

 

※ ファイルのインストール先はデストリビューションによって違います。「pkg-config systemd –variable=systemdsystemunitdir」で確認して下さい。
※ LSB を systemd に移行する目的でサービス設定ファイルを作成した場合には、「rm -i /etc/rc*.d/*サービス名*」として、LSB のシンボリックファイルは削除しておいた方が、混乱しなくて良いでしょう。

 

Fedora15 から Fedora16 へのアップグレード

Fedora15 から Fedora16 へアップグレードを行うと、幾つかのサービスがデフォルト(システムブート時の起動)では起動しなくなります。大半は起動設定が外れてしまうからですが、先ずはその原因から見ていきましょう。

まずは、『ls /etc/rc[0-6].d/』を実行してみ下さい。多くのリンク切れが発生していないでしょうか?

 

シンボリックリンクのリンク切れ

※ このマシンはある程度対応済であるため、これでも少なくなっています。

 

これは、多くのサービスが Systemd に移行された事を意味します。
ここで、リンク切れになっている項目で起動設定を行いたい場合は、Systemd の設定を行う必要があります。

 

ここでは例として、Fedora16 からsystemd に移行された httpd (apache web サービス)で設定を行います。

 

$ #スーパーユーザーになります。
$ su
パスワード:
#
# # サービスファイルの確認。
# ls -l /lib/systemd/system/httpd.service
-rw-r--r--. 1 root root 383 9月 13 21:23 /lib/systemd/system/httpd.service
#
# # デフォルトでの起動設定を行います。
# systemctl enable httpd.service
#
# # 起動してみます。
# systemctl start httpd.service
#
# # 確認してみます。
# systemctl staus httpd.service
httpd.service - The Apache HTTP Server (prefork MPM)
      Loaded: loaded (/lib/systemd/system/httpd.service; enabled)
       Active: active (running) since Mon, 21 Nov 2011 07:27:37 +0900; 3h 29min ago
     Process: 1029 ExecStart=/usr/sbin/httpd $OPTIONS -k start (code=exited, status=0/SUCCESS)
    Main PID: 1099 (/usr/sbin/httpd)
       CGroup: name=systemd:/system/httpd.service
        ├ 1099 /usr/sbin/httpd -k start
        ├ 1603 /usr/sbin/httpd -k start
        ├ 1604 /usr/sbin/httpd -k start
        ├ 1605 /usr/sbin/httpd -k start
        ├ 1606 /usr/sbin/httpd -k start
        ├ 1607 /usr/sbin/httpd -k start
        ├ 1608 /usr/sbin/httpd -k start
        ├ 1609 /usr/sbin/httpd -k start
        ├ 1610 /usr/sbin/httpd -k start
        └ 26294 /usr/sbin/httpd -k start
#
# # SystemVInit(LSB) のシンボリックリンク削除を行います
# rm -i /etc/rc[0-6].d/*httpd

 

※ Systemd に移行されたサービスでは、『/etc/init.d/』自体に起動スクリプトが存在しないケースが多く、リンク切れが発生しています。また、依存関係から幾つかのサービスは SystemVInit からは起動しなくなっています。

 

これでシステムブート時に起動される様になりました。

 

多くのサービスでは systemd の起動設定を行うだけで問題は解決しますが、これだけでは Postfix は起動しませんでした。理由を調べてみましょう。

 

まずは『systemctl start postfix.service』を実行すると Postfix は起動しますが、『/var/log/maillog』には起動しようとした形跡はありますがエラーさえ出さずに終了しています。そこで『/var/log/boot.log』を見てみると『Sendmail』が起動している事が分かります。

 

# systemctl status sendmail.service
sendmail.service - Sendmail Mail Transport Agent
Loaded: loaded (/lib/systemd/system/sendmail.service; disabled)
Active: inactive (dead)
CGroup: name=systemd:/system/sendmail.service
# alternatives --config mta
2 プログラムがあり ‘mta’ を提供します。 選択 コマンド
———————————————–
* 1 /usr/sbin/sendmail.sendmail
+ 2 /usr/sbin/sendmail.postfixEnter を押して現在の選択 [+] を保持するか、選択番号を入力します:
#

 

Sendmail 自体が起動しない設定になっているにも関わらず起動している事になります。つまり、依存関係で起動している可能性が強いと思われます。

 

原因1.

『/etc/NetworkManager/dispatcher.d/10-sendmail』が存在していた。
※ NetworkManager が起動された場合に、再起動される項目です。

 

対策1.

『/etc/NetworkManager/dispatcher.d/10-sendmail』を削除または移動する。

 

原因2.

『sm-client.service』が起動項目に設定されていた。
※ 『/lib/systemd/system/sm-client.service』は名前の通り、『Sendmail』のクライアントで『Wants=sendmail.service』が設定されています。

 

対策2.

サービスを自動起動しない様にする。

『systemctl disable sendmail.service sm-client.service』

 

以上の方法で、Postfix が正しく起動するようになりました。(当然、Sendmail は起動されなくなりました。)

 

ご覧頂いた様に、たとえデフォルトの起動設定が行われていなくても、依存関係から起動する項目があります。
Systemd は便利である反面、依存関係が起こす弊害がある事も理解しておく必要があります。