Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Linux女子部 systemd徹底入門!
1
ver1.5 中井悦司
Twitter @enakai00
オープンクラウド・キャンパス
Linux女子部
systemd徹底入門!
Open Cloud Campus
2
Linux女子部 systemd徹底入門!
自己紹介
 中井悦司(なかいえつじ)
– Twitter @enakai00
 日々の仕事
– Senior Solution Architect and
...
Open Cloud Campus
3
Linux女子部 systemd徹底入門!
Contents
 SysVinit & Upstartの復習
 systemdによるシステム起動処理
 systemdの操作方法
 journaldに...
Linux女子部 systemd徹底入門!
4
SysVinit & Upstartの復習
Open Cloud Campus
5
Linux女子部 systemd徹底入門!
Linuxの起動プロセス (1)
 「システムBIOS」が起動ディスクからブートローダ(GRUB)をメモリに読み込んで実行。
 GRUBは起動カーネル選択画...
Open Cloud Campus
6
Linux女子部 systemd徹底入門!
Linuxの起動プロセス (2)
 「initスクリプト」は、必要なデバイスドライバを読み込んで、ルートファイルシステムを
マウントした後に、最初のプロセスと...
Open Cloud Campus
7
Linux女子部 systemd徹底入門!
SysVinitの動作
 SysVinit / Upstartは、ユーザレベルのサーバ初期設定やサービス起動処理を行います。
 RHEL5の「/sbin/i...
Open Cloud Campus
8
Linux女子部 systemd徹底入門!
Upstartの動作
 RHEL6の「/sbin/init」はUpstartと呼ばれるイベントベースのジョブ管理システムに変更
されています。
– 「/etc...
Open Cloud Campus
9
Linux女子部 systemd徹底入門!
サービス起動スクリプトの仕様
 サービス起動スクリプト「/etc/init.d/<service名>」は、最低限、次の3つのオプションを
受け付る必要がありま...
Open Cloud Campus
10
Linux女子部 systemd徹底入門!
systemdが目指したもの
 システム起動時間を短縮
– シェルスクリプトはシリアルに実行されるので効率が悪かった。シェルスクリプト内の処理を個別
に分割...
Linux女子部 systemd徹底入門!
11
systemdによるシステム起動処理
Open Cloud Campus
12
Linux女子部 systemd徹底入門!
systemdの最小処理単位 ー Unit
 SysVinitの初期化スクリプトにまとめて含まれていた個々の処理を抜き出して、個別の
「Unit」として定義...
Open Cloud Campus
13
Linux女子部 systemd徹底入門!
Unitの種類
 Unitはいくつかのタイプに分かれており、拡張子で識別されます。主要なUnitには次のよ
うなものがあります。
– .service:サー...
Open Cloud Campus
14
Linux女子部 systemd徹底入門!
Unit定義ファイルの場所
 Unitの定義ファイルは、次の2箇所にあります。
– /etc/systemd/system/以下:管理者がカスタマイズする内...
Open Cloud Campus
15
Linux女子部 systemd徹底入門!
Unitの依存関係と順序関係
 Unit間には「依存関係」と「順序関係」が定義されます。
– 依存関係は、「AというUnitを有効化するなら、BというUni...
Open Cloud Campus
16
Linux女子部 systemd徹底入門!
主要な依存関係の整理
multi-user.target
シンボリックリンク
graphical.target
rescue.target
runlevel ...
Open Cloud Campus
17
Linux女子部 systemd徹底入門!
依存関係と順序関係の設定 (1)
 systemdが起動すると、Unit間の「依存関係」を元に、全体として有効化されるUnit群を
決定します。
– ただし...
Open Cloud Campus
18
Linux女子部 systemd徹底入門!
依存関係と順序関係の設定 (2)
 「<Unit名>.wants」ディレクトリは、サービ
スの自動起動を設定する際に利用されます。
– systemctlコ...
Open Cloud Campus
19
Linux女子部 systemd徹底入門!
依存関係と順序関係の設定 (2)
 順序関係は、次の方法で設定します。
– Unit設定ファイルの[Unit]セクションにおいて、「After=」オプション...
Open Cloud Campus
20
Linux女子部 systemd徹底入門!
依存関係と順序関係の設定 (3)
 現在有効なUnitの依存関係、順序関係は次のコマンド確認できます。
– # systemctl list-depende...
Open Cloud Campus
21
Linux女子部 systemd徹底入門!
動的生成Unitについて (1)
 /usr/lib/systemd/system-generators/以下のgenerator群は、システム環境に応じて...
Open Cloud Campus
22
Linux女子部 systemd徹底入門!
動的生成Unitについて (2)
 udevがデバイスを認識した際に「systemd」というudevタグをつけると、対応するdevice
タイプのUnitが...
Linux女子部 systemd徹底入門!
23
systemdの操作方法
Open Cloud Campus
24
Linux女子部 systemd徹底入門!
Unitの一覧表示 (1)
 # systemctl list-unit-files
– 定義されているすべてのUnitとその状態(下表)を一覧表示します。...
Open Cloud Campus
25
Linux女子部 systemd徹底入門!
Unitの一覧表示 (2)
 # systemctl list-units (「list-units」は省略可)
– 現在有効な(有効であるべき)Unitと...
Open Cloud Campus
26
Linux女子部 systemd徹底入門!
Unitの基本操作 (1)
 # systemctl enable/disable <Unit名>
– Unitの自動起動を有効化/無効化します。
– 実際...
Open Cloud Campus
27
Linux女子部 systemd徹底入門!
Unitの基本操作 (2)
 # systemctl daemon-reload
– Unitの設定ファイルを変更した際に、変更内容をsystemdに認識さ...
Open Cloud Campus
28
Linux女子部 systemd徹底入門!
Cgroupsの確認
 systemdは、Cgroupsを利用して、Unitごとに関連するプロセスを分類します。
– # systemd-cgls : Cg...
Open Cloud Campus
29
Linux女子部 systemd徹底入門!
プロセスグループへのシグナル送信
 Cgroupsの同じグループに属するプロセスにまとめてシグナルを送信することができます。
– 例:
– # system...
Linux女子部 systemd徹底入門!
30
journaldによるログ管理
Open Cloud Campus
31
Linux女子部 systemd徹底入門!
systemdのログ管理機能
 systemdは、Unitとして起動したデーモンプロセスの標準出力、および、rsyslogdへの出力
内容を独自のロギングサ...
Open Cloud Campus
32
Linux女子部 systemd徹底入門!
imjournalモジュールについて
 最近のrsyslogdには、journaldのデータベースから直接にログ情報を取得するモジュール
「imjourna...
Open Cloud Campus
33
Linux女子部 systemd徹底入門!
journaldのログ検索
 journalctlコマンドの主要なオプションは次のとおりです。
– -u <Unit名> : 指定Unitに関係するログのみ...
Linux女子部 systemd徹底入門!
34
Unit設定ファイルの書き方
Open Cloud Campus
35
Linux女子部 systemd徹底入門!
Unit設定ファイルの内容 (1)
 Unitの設定ファイルは、[Unit]、[Install]などのセクションに分かれます。
– [Unit] : Uni...
Open Cloud Campus
36
Linux女子部 systemd徹底入門!
Unit設定ファイルの内容 (2)
 Installセクションの主要オプション
– 「WantedBy/RequiredBy」は、「systemctl en...
Open Cloud Campus
37
Linux女子部 systemd徹底入門!
serviceタイプの設定項目 (1)
 serviceセクションの主要オプション (1)
– 「ExecXXX」オプションは、サービスを起動、リロード、停...
Open Cloud Campus
38
Linux女子部 systemd徹底入門!
serviceタイプの設定項目 (2)
 serviceセクションの主要オプション (2)
– Typeオプションは、サービスの起動完了を判定するタイミング...
Open Cloud Campus
39
Linux女子部 systemd徹底入門!
serviceタイプの設定項目 (3)
 systemdは、サービスに関連するプロセス群の中で最初に実行された「メインプロセス」の
PIDを認識しており、E...
Open Cloud Campus
40
Linux女子部 systemd徹底入門!
serviceタイプの設定項目 (4)
 systemdは、起動したサービスに関連するすべてのプロセスをCgroupsの個別のグループに
入れて管理していま...
Open Cloud Campus
41
Linux女子部 systemd徹底入門!
serviceタイプの設定項目 (4)
 「Type=forking」はメインプロセスの追跡にPIDファイルが必要となることか
ら、systemdのサービス...
Open Cloud Campus
42
Linux女子部 systemd徹底入門!
serviceタイプの設定項目 (5)
 serviceセクションの主要オプション (3)
– User/Groupは、「ExecXXX=」で指定されたコマ...
Linux女子部 systemd徹底入門!
43
知っておくと便利な機能
Open Cloud Campus
44
Linux女子部 systemd徹底入門!
Unitの無効化
 # systemctl mask/unmask <Unit名>
– 指定のUnitを無効化/有効化します。「mask」で無効化した場合は...
Open Cloud Campus
45
Linux女子部 systemd徹底入門!
テンプレートタイプの設定ファイル
 「hogehoge@.service」という設定ファイルは、「hogehoge@<任意の文字列>.service」
とい...
Linux女子部 systemd徹底入門!
46
参考資料
Open Cloud Campus
47
Linux女子部 systemd徹底入門!
参考資料
 freedesktop.org - systemd System and Service Manager
– systemdのプロジェクトページ...
Open Cloud Campus
48
Linux女子部 systemd徹底入門!
参考資料
 systemd入門(1)〜(5):enakai00のブログ記事
– Unitの概念を理解する
• http://d.hatena.ne.jp/e...
Open Cloud Campus
49
Linux女子部 systemd徹底入門!
QA
Linux女子部 systemd徹底入門!
50
中井悦司
Twitter @enakai00
オープンクラウド・キャンパス
FedoraでLinux最新技術を
学びましょう!
Upcoming SlideShare
Loading in …5
×

Linux女子部 systemd徹底入門

95,746 views

Published on

Linux女子部 「Fedora最新技術情報&Systemd勉強会」
http://connpass.com/event/3859/
で使用した資料です。

変更履歴
2013/11/04 ver1.0 初版
2013/11/05 ver1.1 誤植修正、少し追記
2013/11/06 ver1.2 daemon-reload,mask,テンプレート機能を追記
2013/11/12 ver1.3 User/Groupオプションの説明追加
2013/11/24 ver1.4 誤植修正
2014/05/05 ver1.5 imjournalモジュールの説明追加

Published in: Technology
  • Be the first to comment

Linux女子部 systemd徹底入門

  1. 1. Linux女子部 systemd徹底入門! 1 ver1.5 中井悦司 Twitter @enakai00 オープンクラウド・キャンパス Linux女子部 systemd徹底入門!
  2. 2. Open Cloud Campus 2 Linux女子部 systemd徹底入門! 自己紹介  中井悦司(なかいえつじ) – Twitter @enakai00  日々の仕事 – Senior Solution Architect and Cloud Evangelist at Red Hat K.K. 企業システムでオープンソースの活用を希望される お客様を全力でご支援させていただきます。  昔とった杵柄 – 素粒子論の研究(超弦理論とか) – 予備校講師(物理担当) – インフラエンジニア(Unix/Linux専門) 「Linux独習書の新定番」 書きました! 読者の声より ―― 「今はインターネット上に情報が溢れているけど、質の高い入門書が少なく   なっているのは不幸なことだと思う。そんな中、この本はすごくいい」 「平易な言葉でありながら、決して足りなくはない。慎重に選ばれています。  脳みそに染みこんで来ます」
  3. 3. Open Cloud Campus 3 Linux女子部 systemd徹底入門! Contents  SysVinit & Upstartの復習  systemdによるシステム起動処理  systemdの操作方法  journaldによるログ管理  Unit設定ファイルの書き方  知っておくと便利な機能  参考資料 (*) 本資料の説明はFedora 19を前提としています。
  4. 4. Linux女子部 systemd徹底入門! 4 SysVinit & Upstartの復習
  5. 5. Open Cloud Campus 5 Linux女子部 systemd徹底入門! Linuxの起動プロセス (1)  「システムBIOS」が起動ディスクからブートローダ(GRUB)をメモリに読み込んで実行。  GRUBは起動カーネル選択画面を表示して、指定されたカーネルと初期ラムディスクをメモ リに読み込んだ後に、カーネルを実行。  カーネルは、初期ラムディスクの内容をメモリ上のラムディスク領域に展開して、「initス クリプト」を実行。 – 初期ラムディスクには、ルートファイルシステムへのアクセスに必要なデバイスドライバと「init スクリプト」が含まれます。 ブートローダ (GRUB) /bootファイルシステム ② ブートローダが   読み込み ③ ラムディスク領域   に展開 起動ディスク物理メモリ Linuxカーネル 初期ラムディスク Linuxカーネル 初期ラムディスク ラムディスク領域 ・デバイスドライバ ・initスクリプト ・その他コマンド類 ① システムBIOSから起動
  6. 6. Open Cloud Campus 6 Linux女子部 systemd徹底入門! Linuxの起動プロセス (2)  「initスクリプト」は、必要なデバイスドライバを読み込んで、ルートファイルシステムを マウントした後に、最初のプロセスとなる「/sbin/init」を実行。 – 正確には、execコマンドにより、initスクリプトのプロセスが/sbin/initに置き換えられます。  ここで実行される「/sbin/init」が、これまでのSysVinit / Upstartの本体です。systemd では、ここで実行されるものが「/usr/bin/systemd」に変わります。 ※ 初期RAMディスクはcpio+gzipアーカイブファイルなのでpaxコマンドで展開可能です。 – # pax -rzf /boot/initramfs-2.6.32-131.0.15.el6.x86_64.img #!/bin/sh # # Licensed under the GPLv2 # # Copyright 2008-2009, Red Hat, Inc. # Harald Hoyer <harald@redhat.com> # Jeremy Katz <katzj@redhat.com> (中略) # start up udev and trigger cold plugs udevd --daemon –resolve-names=never (中略) exec switch_root "$NEWROOT" "$INIT" $initargs || { warn "Something went very badly wrong in the initramfs. Please " warn "file a bug against dracut." emergency_shell } fi udevで必要なドライバをロード execで/sbin/initに実行を切り替え RHEL6のinitスクリプトの例
  7. 7. Open Cloud Campus 7 Linux女子部 systemd徹底入門! SysVinitの動作  SysVinit / Upstartは、ユーザレベルのサーバ初期設定やサービス起動処理を行います。  RHEL5の「/sbin/init」(SysVinit)は、設定ファイル「/etc/inittab」にしたがって次の 処理を行います。 id:5:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 (中略) # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon RHEL5の/etc/inittabの例 – 初期設定スクリプト「/etc/rc.d/rc.sysinit」を実行して、ファ イルシステムのfsckチェックとマウント処理、その他、もろも ろのシステム初期化を実施します。 – スクリプト「/etc/rc.d/rc」を実行して、起動時のランレベルに 応じたサービスを起動します。 • 実際の起動処理は、/etc/init.d/以下のサービス個別のスク リプトから実施します。 – コンソールログインの受付プロセス(mingetty)を起動します。 – ランレベル5の場合は、GUIのログイン画面を起動します。 mingetty prefdm rc.sysinit システム初期化 サービス起動 ログイン受付 rc # /etc/init.d/<service名> start
  8. 8. Open Cloud Campus 8 Linux女子部 systemd徹底入門! Upstartの動作  RHEL6の「/sbin/init」はUpstartと呼ばれるイベントベースのジョブ管理システムに変更 されています。 – 「/etc/inittab」はデフォルトのランレベル設定のみが記載されます。「/etc/init/」以下のジョブ 設定ファイルに従って、起動時に各種ジョブが実行されます。  ただし、実際にジョブとして実行される内容は、RHEL5とほぼ同じです。 "rcS"ジョブ起動 rc.sysinit telinit $runlevel "startup"イベント発行 /etc/init/rcS.conf "runlevel X"イベント発行 /etc/init/rc.conf "stopped rc"イベント発行 "start-ttys"ジョブ起動 initctl start tty TTY=$tty /etc/init/start-ttys.conf "prefdm"ジョブ起動 /etc/X11/prefdm -nodaemon /etc/init/prefdm.conf RUNLEVEL=5の場合 "tty"ジョブ起動 /sbin/mingetty TTY "rc"ジョブ起動 /etc/rc.d/rc $RUNLEVEL /etc/init/tty.conf /sbin/init起動
  9. 9. Open Cloud Campus 9 Linux女子部 systemd徹底入門! サービス起動スクリプトの仕様  サービス起動スクリプト「/etc/init.d/<service名>」は、最低限、次の3つのオプションを 受け付る必要があります。 – start : サービスを開始 – stop : サービスを停止 – status : サービスの起動状態を返り値で応答  中身はただのシェルスクリプトのため、独自のオプションを受け付けたり、サービス (デーモン)起動以外の目的で利用されるものなどもあります。 – PosgreSQLのデータベースクラスタ初期化(独自オプションの利用) • # service postgresql initdb – 初回起動時の設定ウィザードの実行(サービス起動するわけではない) • # service firstboot start
  10. 10. Open Cloud Campus 10 Linux女子部 systemd徹底入門! systemdが目指したもの  システム起動時間を短縮 – シェルスクリプトはシリアルに実行されるので効率が悪かった。シェルスクリプト内の処理を個別 に分割して、並列実行すれば、起動時間が短縮できる。  システム構成の動的変更に対応 – システム起動時だけではなく、システム構成の変更に応じて、動的に必要なサービスの起動・停止 を行いたい。  プロセス停止処理を標準機能として提供 – これまで、プロセスの停止処理は、サービススクリプト内で個別に実装されており、PIDファイルや プロセス名などを用いていた。systemd自身に、フォークしたデーモンプロセスをトラッキングし て、停止する機能を実装したい。  デーモンの実行環境を制御 – サービスごとに関連するデーモンの実行環境(Cgroupsによるリソース割り当てやアクセス可能な ディレクトリなど)を設定できるようにしたい。各デーモンのログ出力もまとめて管理したい。 http://0pointer.de/blog/projects/systemd.html
  11. 11. Linux女子部 systemd徹底入門! 11 systemdによるシステム起動処理
  12. 12. Open Cloud Campus 12 Linux女子部 systemd徹底入門! systemdの最小処理単位 ー Unit  SysVinitの初期化スクリプトにまとめて含まれていた個々の処理を抜き出して、個別の 「Unit」として定義します。 rc.sysinit rc systemd-remount-fs.service systemd-udevd.service ・・・ chronyd.service crond.service dbus.service irqbalance.service mdmonitor.service NetworkManager.service rngd.service rpcbind.service rsyslog.service sshd.service ・・・ console-getty.service systemd-logind.service dev-hugepages.mount proc-sys-fs-binfmt_misc.mount tmp.mount ・・・ mingetty prefdm # /etc/init.d/<service名> start sys-devices-pci00...0:00:03.0-virtio0-net-eth0.device sys-devices-pci00...4.0-virtio1-block-vda-vda1.device sys-devices-pci00...4.0-virtio1-block-vda-vda2.device sys-devices-pci00...:00:04.0-virtio1-block-vda.device dev-dmx2d1.swap ・・・ これら全てが 「Unit」
  13. 13. Open Cloud Campus 13 Linux女子部 systemd徹底入門! Unitの種類  Unitはいくつかのタイプに分かれており、拡張子で識別されます。主要なUnitには次のよ うなものがあります。 – .service:サービス • 有効化すると対応するデーモンが起動する。 – .target:何もしない • 後述の依存関係・順序関係を定義する際に、複数のUnitをグループ化するために使用する。 – .mount:マウントポイント • 有効化するとマウントされる。 – .swap:Swap領域 • 有効化するとSwap領域が有効になる。 – .device:デバイス • udevがデバイスを認識すると有効化される。 – .socket : ソケット • systemdが特定のソケットをListenする。接続があると、指定のデーモンを起動してソケット を受け渡す(従来のxinetdのような機能)  Unitには、明示的に設定するものと、自動的に作成されるものがあります。 – .serviceと.targetは、設定ファイルで明示的に定義します。 – .mountと.swapは、/etc/fstabから自動作成されます。 – .deviceは、udevによって自動作成されます。
  14. 14. Open Cloud Campus 14 Linux女子部 systemd徹底入門! Unit定義ファイルの場所  Unitの定義ファイルは、次の2箇所にあります。 – /etc/systemd/system/以下:管理者がカスタマイズする内容 – /usr/lib/systemd/system/以下:システムデフォルトの設定  両方に同じ名前の設定ファイルがある場合は、/etc/systemd/systemが優先されます。 – システムデフォルトの設定を変更する際は、/usr/lib/systemd/systemから/etc/systemd/systemに 設定ファイルをコピーして、これを編集します。  Unit名がそのまま設定ファイル名になります。 – シンボリックリンクでUnitの別名を設定することができます。 – ディレクトリ「<Unit名>.wants」は、後述の依存関係の定義に使用します。 basic.target.wants dbus-org.fedoraproject.FirewallD1.service -> /usr/lib/systemd/system/firewalld.service dbus-org.freedesktop.Avahi.service -> /usr/lib/systemd/system/avahi-daemon.service dbus-org.freedesktop.NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service default.target -> /lib/systemd/system/multi-user.target default.target.wants getty.target.wants multi-user.target.wants sockets.target.wants sysinit.target.wants syslog.service -> /usr/lib/systemd/system/rsyslog.service system-update.target.want /etc/systemd/system内にある設定ファイルの例
  15. 15. Open Cloud Campus 15 Linux女子部 systemd徹底入門! Unitの依存関係と順序関係  Unit間には「依存関係」と「順序関係」が定義されます。 – 依存関係は、「AというUnitを有効化するなら、BというUnitも有効化するべき」という関係 – 順序関係は、「AというUnitを有効化する前に、BというUnitを有効化するべき」という関係  systemdが起動すると、「default.target」というUnitが有効化されます。これにより、 「default.target」に依存するUnitがまとめて有効化されます。 – default.targetの実体は、「multi-user.target」「graphical.target」などへのシンボリックリンク です。リンク先を変えることが、「デフォルトrunlevelの変更」に相当します。 – 下図のように、主には、targetタイプのUnitで依存関係の骨組みを作って、その下にその他のタイ プのUnit群をまとめて依存させます。(例外もあります。) default.target multi-user.target basic.target NetworkManager.service avahi-daemon.service irqbalance.service remote-fs.target rsyslog.service ・・・ シンボリックリンク fedora-autorelabel-mark.service fedora-autorelabel.service fedora-configure.service fedora-loadmodules.service sys-kernel-config.mount sys-kernel-debug.mount systemd-journald.service systemd-modules-load.service systemd-random-seed-load.service systemd-sysctl.service systemd-udev-trigger.service systemd-udevd.service ・・・ sysinit.target
  16. 16. Open Cloud Campus 16 Linux女子部 systemd徹底入門! 主要な依存関係の整理 multi-user.target シンボリックリンク graphical.target rescue.target runlevel 1で 起動するサービス runlevel 3で 起動するサービス runlevel 5で 起動するサービス basic.target default.target sysinit.target runlevelに依存せず 起動するサービス runlevelに依存せず 起動するサービス 従来のrc.sysinitで 行っていた処理 シンボリックリンク を切り替える local-fs.target swap.target swap領域の有効化 ファイルシステムの マウント処理
  17. 17. Open Cloud Campus 17 Linux女子部 systemd徹底入門! 依存関係と順序関係の設定 (1)  systemdが起動すると、Unit間の「依存関係」を元に、全体として有効化されるUnit群を 決定します。 – ただし、それぞれのUnitを起動する「順序関係」は、これとはまったく独立に定義されます。 – systemdは、順序関係を持たないUnitについては、できるかぎり並列に起動処理を実施します。こ れにより、起動処理の並列度を高めて、システム起動時間を短縮します。  依存関係は、次のいずれかの方法で設定します。 – Unit設定ファイルの[Unit]セクションにおいて、「Wants=」オプション、もしくは、 「Requires=」オプションで、前提となる(一緒に有効化する)Unitを指定する。 – ディレクトリ「<Unit名>.wants」「<Unit名>.requires」内に、前提となる(一緒に有効化する) Unitの設定ファイルへのシンボリックリンクを作成する。 – 「Requires」は、前提Unitが起動に失敗すると、このUnitの起動を取りやめます。「Wants」は、 前提Unitが起動に失敗しても、このUnitの起動処理を行います。 – その他に「Conflicts=」オプションで、同時に有効化してはいけないUnitの指定ができます。
  18. 18. Open Cloud Campus 18 Linux女子部 systemd徹底入門! 依存関係と順序関係の設定 (2)  「<Unit名>.wants」ディレクトリは、サービ スの自動起動を設定する際に利用されます。 – systemctlコマンドでサービスの自動起動を設定 すると、「WantedBy=」で指定されたUnitの 「.wants」ディレクトリに、設定ファイルへのシ ンボリックリンクが作成されます。 # systemctl disable sshd.service rm '/etc/systemd/system/multi-user.target.wants/sshd.service' # systemctl enable sshd.service ln -s '/usr/lib/systemd/system/sshd.service' '/etc/systemd/system/multi-user.target.wants/sshd.service' # ls -l /etc/systemd/system/multi-user.target.wants/ 合計 0 lrwxrwxrwx. 1 root root 46 10月 30 12:35 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service lrwxrwxrwx. 1 root root 35 10月 30 12:36 atd.service -> /usr/lib/systemd/system/atd.service lrwxrwxrwx. 1 root root 38 10月 30 12:36 auditd.service -> /usr/lib/systemd/system/auditd.service lrwxrwxrwx. 1 root root 44 10月 30 12:35 avahi-daemon.service -> /usr/lib/systemd/system/avahi-daemon.service lrwxrwxrwx. 1 root root 39 10月 30 12:36 chronyd.service -> /usr/lib/systemd/system/chronyd.service ・・・ lrwxrwxrwx. 1 root root 36 11月 2 21:35 sshd.service -> /usr/lib/systemd/system/sshd.service sshd.serviceの自動起動を解除・設定する例 [Unit] Description=OpenSSH server daemon After=syslog.target network.target auditd.service [Service] EnvironmentFile=/etc/sysconfig/sshd ExecStartPre=/usr/sbin/sshd-keygen ExecStart=/usr/sbin/sshd -D $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process [Install] WantedBy=multi-user.target /usr/lib/systemd/system/sshd.service
  19. 19. Open Cloud Campus 19 Linux女子部 systemd徹底入門! 依存関係と順序関係の設定 (2)  順序関係は、次の方法で設定します。 – Unit設定ファイルの[Unit]セクションにおいて、「After=」オプションと「Before=」オプション で指定します。 – 「After=A B C」:自分自身は、Unit「A」「B」「C」の後に起動する。 – 「Before=A B C」:自分自身は、Unit「A」「B」「C」の前に起動する。  Unit起動時の「待ち合わせ」ポイントとして、targetタイプのUnitを利用します。 – 例えば、「network.target」は、ネットワーク環境を準備するUnitと、ネットワーク環 境を使用するUnitの待ち合わせに使用します。 network.target ネットワーク環境を 準備するUnit ネットワーク環境を 使用するUnit Before=network.targetAfter=network.target [Unit] Description=firewalld - dynamic firewall daemon Before=network.target Before=libvirtd.service Before=NetworkManager.service ・・・ [Unit] Description=The Apache HTTP Server After=network.target remote-fs.target nss-lookup.target ・・・ /usr/lib/systemd/system/firewalld.service/usr/lib/systemd/system/httpd.service Firewallの構成が終わってから httpdが起動することが保証される Firewallの構成が終わってから httpdが起動することが保証される
  20. 20. Open Cloud Campus 20 Linux女子部 systemd徹底入門! 依存関係と順序関係の設定 (3)  現在有効なUnitの依存関係、順序関係は次のコマンド確認できます。 – # systemctl list-dependencies <Unit名> • 指定Unitが必要とするUnitを表示します。(指定省略時は「default.target」) • 依存Unitがtargetタイプの際は、さらに、それが必要なUnitを再帰表示します。 • --allオプションをつけると、すべてのUnitを再帰表示します。 – # systemctl list-dependencies <Unit名> --after • 指定Unitより先に起動するUnitをツリー表示します。 • --allオプションは上と同様。 – # systemctl list-dependencies <Unit名> --before • 指定Unitより後に起動するUnitをツリー表示します。 • --allオプションは上と同様。 # systemctl list-dependencies default.target ├─atd.service ├─auditd.service ・・・ ├─basic.target │ ├─fedora-autorelabel-mark.service ・・・ │ ├─firewalld.service │ ├─paths.target │ ├─sockets.target │ │ ├─avahi-daemon.socket │ │ ├─dbus.socket ・・・ │ ├─sysinit.target │ │ ├─dev-hugepages.mount │ │ ├─dev-mqueue.mount │ │ ├─lvm2-monitor.service │ │ ├─plymouth-read-write.service │ │ ├─plymouth-start.service ・・・ ├─getty.target │ └─getty@tty1.service └─remote-fs.target
  21. 21. Open Cloud Campus 21 Linux女子部 systemd徹底入門! 動的生成Unitについて (1)  /usr/lib/systemd/system-generators/以下のgenerator群は、システム環境に応じて、動的 なUnitの生成や、既存Unitの設定変更を行います。 – 例: – systemd-cryptsetup-generator • /etc/crypttabを参照して、systemd-cryptsetup@.serviceを生成します。 – systemd-fstab-generator • /etc/fstabを参照して、mountタイプとswapタイプのUnitを生成します。 • mountタイプは、マウントポイントのパスで「/」を「-」に置換したものがUnit名になります。 – systemd-rc-local-generator • /etc/rc.d/rc.localが実行可能ファイルの場合に、rc-local.serviceの自動起動を有効化します。  動的に生成されたUnitの設定ファイルは、/run/systemd/generator/以下に配置されます。 # ls /run/systemd/generator/ -.mount boot.mount dev-disk-byx2duuid-89cd76bex2d8d59x2d441cx2d9165x2dfe8ff338266b.device.wants dev-mapper-fedorax2dswap.device.wants dev-mapper-fedorax2dswap.swap local-fs.target.requires swap.target.wants
  22. 22. Open Cloud Campus 22 Linux女子部 systemd徹底入門! 動的生成Unitについて (2)  udevがデバイスを認識した際に「systemd」というudevタグをつけると、対応するdevice タイプのUnitが有効化されます。 – 該当デバイスの/sysファイルシステムのパスで「/」を「-」に置換したものがUnit名になります。  Bluetoothコントローラ、プリンタ、スマートカード、サウンドカードに対応するデバイス は、それぞれ、bluetooth.target, printer.target, smartcard.target, sound.targetが、自 動的に前提のUnitになります。 – たとえば、サウンドカードを必要とするUnitをsound.targetの前提Unitとしておけば、サウンド カードを接続したタイミングで、このUnitが動的に有効化されます。 # systemctl list-units --type=device --full UNIT LOAD ACTIVE SUB DESCR sys-devices-pci0000:00-0000:00:01.1-ata2-host1-target1:0:0-1:0:0:0-block-sr0.device loaded active plugged QEMU_ sys-devices-pci0000:00-0000:00:03.0-virtio0-net-eth0.device loaded active plugged Virti sys-devices-pci0000:00-0000:00:04.0-virtio1-block-vda-vda1.device loaded active plugged /sys/ sys-devices-pci0000:00-0000:00:04.0-virtio1-block-vda-vda2.device loaded active plugged /sys/ sys-devices-pci0000:00-0000:00:04.0-virtio1-block-vda.device loaded active plugged /sys/ sys-devices-platform-serial8250-tty-ttyS1.device loaded active plugged /sys/ sys-devices-platform-serial8250-tty-ttyS2.device loaded active plugged /sys/ sys-devices-platform-serial8250-tty-ttyS3.device loaded active plugged /sys/ sys-devices-pnp0-00:04-tty-ttyS0.device loaded active plugged /sys/ sys-devices-virtual-block-dmx2d0.device loaded active plugged /sys/ sys-devices-virtual-block-dmx2d1.device loaded active plugged /sys/ sys-module-configfs.device loaded active plugged /sys/ sys-subsystem-net-devices-eth0.device loaded active plugged Virti
  23. 23. Linux女子部 systemd徹底入門! 23 systemdの操作方法
  24. 24. Open Cloud Campus 24 Linux女子部 systemd徹底入門! Unitの一覧表示 (1)  # systemctl list-unit-files – 定義されているすべてのUnitとその状態(下表)を一覧表示します。 – --typeオプションで特定タイプのUnitのみを表示します。 Status 説明 enabled 「WantedBy=」指定あり。 自動起動が有効。 disabled 「WantedBy=」指定あり。 自動起動が無効。 static 「WantedBy=」指定なし。 # systemctl list-unit-files --type=service UNIT FILE STATE arp-ethers.service disabled atd.service enabled auditd.service enabled autovt@.service disabled avahi-daemon.service enabled blk-availability.service disabled chrony-wait.service disabled chronyd.service enabled console-getty.service disabled console-shell.service disabled crond.service enabled dbus-org.fedoraproject.FirewallD1.service enabled dbus-org.freedesktop.Avahi.service enabled dbus-org.freedesktop.hostname1.service static dbus-org.freedesktop.locale1.service static dbus-org.freedesktop.login1.service static dbus-org.freedesktop.NetworkManager.service enabled dbus-org.freedesktop.timedate1.service static dbus.service static ・・・ 従来の「chkconfig --list」に相当 systemctlコマンドで自動起動の 有効・無効を変更可能なUnit
  25. 25. Open Cloud Campus 25 Linux女子部 systemd徹底入門! Unitの一覧表示 (2)  # systemctl list-units (「list-units」は省略可) – 現在有効な(有効であるべき)Unitとその状態を一覧表示します。 – --typeオプションで特定タイプのUnitのみを表示します。 # systemctl --type=service UNIT LOAD ACTIVE SUB DESCRIPTION atd.service loaded active running Job spooling tools auditd.service loaded active running Security Auditing Service avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack chronyd.service loaded active running NTP client/server crond.service loaded active running Command Scheduler dbus.service loaded active running D-Bus System Message Bus fedora-readonly.service loaded active exited Configure read-only root supp firewalld.service loaded active running firewalld - dynamic firewall getty@tty1.service loaded active running Getty on tty1 irqbalance.service loaded active running irqbalance daemon lvm2-lvmetad.service loaded active running LVM2 metadata daemon lvm2-monitor.service loaded active exited Monitoring of LVM2 mirrors, s mcelog.service loaded active running Machine Check Exception Loggi NetworkManager.service loaded active running Network Manager polkit.service loaded active running Authorization Manager rngd.service loaded failed failed Hardware RNG Entropy Gatherer rpcbind.service loaded active running RPC bind service ・・・ systemd-v...le-setup.service loaded active exited Setup Virtual Console LOAD = Reflects whether the unit definition was properly loaded. ACTIVE = The high-level unit activation state, i.e. generalization of SUB. SUB = The low-level unit activation state, values depend on unit type. 31 loaded units listed. Pass --all to see loaded but inactive units, too. To show all installed unit files use 'systemctl list-unit-files'.
  26. 26. Open Cloud Campus 26 Linux女子部 systemd徹底入門! Unitの基本操作 (1)  # systemctl enable/disable <Unit名> – Unitの自動起動を有効化/無効化します。 – 実際には、「WantedBy=」で指定されたUnitへの依存関係を設定/削除します。  # systemctl start/stop/restart <Unit名> – 指定のUnitをその場で、起動/停止/再起動します。 – reloadコマンドは、Unit設定ファイルでreloadの動作が定義されている場合のみ使用できます。  # systemctl status <Unit名> – Unitの実行状態を表示します。 # systemctl status httpd.service httpd.service - The Apache HTTP Server Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled) Active: active (running) since 日 2013-11-03 15:59:37 JST; 16s ago Main PID: 4621 (httpd) Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec" CGroup: name=systemd:/system/httpd.service ├─4621 /usr/sbin/httpd -DFOREGROUND ├─4622 /usr/sbin/httpd -DFOREGROUND ├─4623 /usr/sbin/httpd -DFOREGROUND ├─4624 /usr/sbin/httpd -DFOREGROUND ├─4625 /usr/sbin/httpd -DFOREGROUND └─4626 /usr/sbin/httpd -DFOREGROUND 11月 03 15:59:36 fedora19 systemd[1]: Starting The Apache HTTP Server... 11月 03 15:59:36 fedora19 httpd[4621]: AH00557: httpd: apr_sockaddr_info_ge...9 11月 03 15:59:36 fedora19 httpd[4621]: AH00558: httpd: Could not reliably d...e 11月 03 15:59:37 fedora19 systemd[1]: Started The Apache HTTP Server. 関連する直近のログを表示 関連するデーモンプロセスを表示
  27. 27. Open Cloud Campus 27 Linux女子部 systemd徹底入門! Unitの基本操作 (2)  # systemctl daemon-reload – Unitの設定ファイルを変更した際に、変更内容をsystemdに認識させます。  chkconfigコマンド/serviceコマンドは、対応するsystemctlコマンドに変換されます。  サービス起動スクリプトで標準外のオプションを使用していたものは、systemd環境では使 用できなくなります。 – 例えば、PostgreSQLデータベースクラスタ初期化は、postgresql-setupコマンドを使用します。 • RHEL6: # service postgresql initdb • Fedora19: # postgresql-setup initdb # chkconfig sshd off 情報:'systemctl disable sshd.service'へ転送しています。 rm '/etc/systemd/system/multi-user.target.wants/sshd.service' # chkconfig sshd on 情報:'systemctl enable sshd.service'へ転送しています。 ln -s '/usr/lib/systemd/system/sshd.service' '/etc/systemd/system/multi-user.target.wants/sshd.service' # service sshd stop Redirecting to /bin/systemctl stop sshd.service # service sshd start Redirecting to /bin/systemctl start sshd.service
  28. 28. Open Cloud Campus 28 Linux女子部 systemd徹底入門! Cgroupsの確認  systemdは、Cgroupsを利用して、Unitごとに関連するプロセスを分類します。 – # systemd-cgls : Cgroupsによる分類をツリー表示 – # systemd-cgtop : グループごとのリソース使用状況をリアルタイムで表示 # systemd-cgls ├─system │ ├─1 /usr/lib/systemd/systemd --system --deserialize 17 │ ├─httpd.service │ │ ├─4621 /usr/sbin/httpd -DFOREGROUND │ │ ├─4622 /usr/sbin/httpd -DFOREGROUND │ │ ├─4623 /usr/sbin/httpd -DFOREGROUND │ │ ├─4624 /usr/sbin/httpd -DFOREGROUND │ │ ├─4625 /usr/sbin/httpd -DFOREGROUND │ │ └─4626 /usr/sbin/httpd -DFOREGROUND │ ├─sm-client.service │ │ └─560 sendmail: Queue runner@01:00:00 for /var/spool/clientmqueue │ ├─sendmail.service │ │ └─495 sendmail: accepting connections │ ├─rpcbind.service │ │ └─461 /sbin/rpcbind -w │ ├─sshd.service │ │ └─4440 /usr/sbin/sshd -D ・・・ │ └─systemd-journald.service │ └─285 /usr/lib/systemd/systemd-journald └─user └─0.user ├─108.session │ ├─4521 sshd: root@pts/1 │ ├─4525 -bash │ ├─4654 systemd-cgls │ └─4655 cat この下に、systemdから起動する Unitごとのサブグループを作成 この下に、ユーザアカウントごとの サブグループを作成。
  29. 29. Open Cloud Campus 29 Linux女子部 systemd徹底入門! プロセスグループへのシグナル送信  Cgroupsの同じグループに属するプロセスにまとめてシグナルを送信することができます。 – 例: – # systemctl kill -s9 sshd.service • sshd.serviceのグループに属するプロセスにKILLシグナル(シグナル番号9)を送信します。 – これにより、サービスに関連するプロセスを漏れなく停止することができます。 – 「--kill-who=main」オプションをつけると、グループ内で最初に起動したメインプロセスのみに シグナルを送ります。  「systemctl stop」でUnitを停止する際にも利用されます。 – Unit定義ファイル内の「ExecStop=」で指定されたコマンドを実行して、それでも該当Unitのグ ループにプロセスが残っている場合は、これらにまとめて、「SIGTERM」、それでも残っていれば 「SIGKILL」を送ります。
  30. 30. Linux女子部 systemd徹底入門! 30 journaldによるログ管理
  31. 31. Open Cloud Campus 31 Linux女子部 systemd徹底入門! systemdのログ管理機能  systemdは、Unitとして起動したデーモンプロセスの標準出力、および、rsyslogdへの出力 内容を独自のロギングサービス(systemd-journald.service:通称「journald」)に送りま す。 – journaldは、出力内容にメタ情報を追加して、/var/log/journal/以下に記録します。 – journaldのログファイルはバイナリ形式のため、そのまま参照することはできません。journalctl コマンドで検索・表示します。  systemdの環境では、rsyslogdの設定変更が必要です。 – これまで、プロセスが出力するシステムログは、Unixソケット「/dev/log」を経由してrsyslogdに 送られていました。systemdは「/dev/log」からログを横取りした後、同じログをUnixソケット 「/run/systemd/journal/syslog」から再出力します。rsyslogdは、これからログを受け取るように 設定します。 rsyslogd /dev/log プロセス /dev/log プロセス rsyslogd /run/systemd/journal/syslog systemd $SystemLogSocketName /run/systemd/journal/syslog /etc/rsyslog.d/listen.conf 従来のシステムログの流れ systemd環境での システムログの流れ
  32. 32. Open Cloud Campus 32 Linux女子部 systemd徹底入門! imjournalモジュールについて  最近のrsyslogdには、journaldのデータベースから直接にログ情報を取得するモジュール 「imjournal」が用意されており、Unixソケット「/run/systemd/journal/syslog」の代わ りに、こちらを利用することも可能です。 – RHEL7では、デフォルトでimjournalが使用されています。 – imjournalの詳細は下記を参照 • http://www.rsyslog.com/doc/imjournal.html
  33. 33. Open Cloud Campus 33 Linux女子部 systemd徹底入門! journaldのログ検索  journalctlコマンドの主要なオプションは次のとおりです。 – -u <Unit名> : 指定Unitに関係するログのみを表示 – --since="YYYY-MM-DD hh:mm:ss" : この日時以降のログを表示 – --until="YYYY-MM-DD hh:mm:ss" : この日時までのログを表示 – -b : 直前のサーバ起動以降のログを表示 – -f : 「tail -f」のように新規のログを待って、順次表示する – --no-pager: lessコマンドを使用しない – -a : 長いメッセージを省略しない # journalctl -u sshd.service -b --no-pager -a -- Logs begin at 水 2013-10-30 12:40:32 JST, end at 日 2013-11-03 20:08:04 JST. -- ・・・ 11月 03 15:49:25 fedora19 systemd[1]: Starting OpenSSH server daemon... 11月 03 15:49:25 fedora19 systemd[1]: Started OpenSSH server daemon. 11月 03 15:49:25 fedora19 sshd[4440]: Server listening on 0.0.0.0 port 22. 11月 03 15:49:25 fedora19 sshd[4440]: Server listening on :: port 22. 11月 03 15:56:39 fedora19 sshd[4461]: Accepted password for root from ::1 port 51491 ssh2 11月 03 15:57:23 fedora19 sshd[4495]: Accepted password for root from 192.168.122.1 port 33665 ssh2 11月 03 15:57:26 fedora19 sshd[4521]: Accepted password for root from ::1 port 51492 ssh2 11月 03 16:06:28 fedora19 sshd[4660]: Accepted password for root from 192.168.122.1 port 33668 ssh2 11月 03 20:02:04 fedora19 unix_chkpwd[4886]: password check failed for user (root) 11月 03 20:02:04 fedora19 sshd[4884]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=192.168.122.1 user=root 11月 03 20:02:04 fedora19 sshd[4884]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by us er "root" 11月 03 20:02:06 fedora19 sshd[4884]: Failed password for root from 192.168.122.1 port 33754 ssh2 11月 03 20:02:08 fedora19 sshd[4884]: Accepted password for root from 192.168.122.1 port 33754 ssh2 11月 03 20:08:04 fedora19 sshd[4975]: Accepted password for root from 192.168.122.1 port 33756 ssh2
  34. 34. Linux女子部 systemd徹底入門! 34 Unit設定ファイルの書き方
  35. 35. Open Cloud Campus 35 Linux女子部 systemd徹底入門! Unit設定ファイルの内容 (1)  Unitの設定ファイルは、[Unit]、[Install]などのセクションに分かれます。 – [Unit] : Unitの依存関係・順序関係などUnitのタイプに依存しない設定を記載 – [Install]:「systemctl enable/disable」コマンドに関連する設定を記載 – [Service]:serviceタイプに固有の設定項目を記載 – その他にも、各タイプに固有のセクションがあります。  Unitセクションの主要オプション – オプションに複数項目を記載する際は、スペース区切りにするか、もしくは、同じオプションを複 数回に分けて記載します。(他のセクションでも同様) オプション 説明 Description Unitの説明文 Documentation ドキュメントのURI Requires/Wants(*) このUnitと同時に有効化が必要な前提Unit After このUnitより先に起動するべきUnit Before このUnitより後に起動するべきUnit (*)「Requires」は、前提Unitが起動に失敗すると、このUnitの起動を取りやめます。   「Wants」は、前提Unitが起動に失敗しても、このUnitの起動処理を行います。
  36. 36. Open Cloud Campus 36 Linux女子部 systemd徹底入門! Unit設定ファイルの内容 (2)  Installセクションの主要オプション – 「WantedBy/RequiredBy」は、「systemctl enable」コマンドで自動起動を有効化した際に、どの Unitの前提として設定されるべきかを指定します。 オプション 説明 WantedBy enable時にこのUnitの.wantsディレクトリにシンボリックリンクを作成する RequiredBy enable時にこのUnitの.requiredディレクトリにシンボリックリンクを作成する Also enable/disable時に同時にenable/disableするUnit [Unit] Description=OpenSSH server daemon After=syslog.target network.target auditd.service [Service] EnvironmentFile=/etc/sysconfig/sshd ExecStartPre=/usr/sbin/sshd-keygen ExecStart=/usr/sbin/sshd -D $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process [Install] WantedBy=multi-user.target syslog/network/auditdの 環境がそろってから起動する multi-user.targetの 前提として有効化する /usr/lib/systemd/system/sshd.service
  37. 37. Open Cloud Campus 37 Linux女子部 systemd徹底入門! serviceタイプの設定項目 (1)  serviceセクションの主要オプション (1) – 「ExecXXX」オプションは、サービスを起動、リロード、停止する際の実行コマンドを指定します。 「EnvironmentFile」で指定したファイルから読み込んだ環境変数と、後述の特殊環境変数 「$MAINPID」を参照できます。 – ExecStartの実行結果で起動の成功・失敗が判定されます。ExecStartPre/ExecStartPostの結果は 判定には影響しません。 – ExecStopPostは、ExecStopで正常終了した場合の他に、実行中のプロセスが異常停止した際にも 実行されます。 – KillModeは後で説明します。 オプション 説明 ExecStart サービス起動コマンド ExecReload サービスリロードコマンド ExecStop サービス停止コマンド ExecStartPre ExecStartPost サービス起動前後の追加コマンド (サービス起動判定には関連させたくないコマンドを記載) ExecStopPost サービス停止後に実行するコマンド(サービスが異常停止した際にも実行される) EnvironmentFile 環境変数を読み込むファイル KillMode ExecStopで停止せずに残ったプロセスの処理方法
  38. 38. Open Cloud Campus 38 Linux女子部 systemd徹底入門! serviceタイプの設定項目 (2)  serviceセクションの主要オプション (2) – Typeオプションは、サービスの起動完了を判定するタイミングを指定します。 • Type=simple : 指定コマンドがフォアグラウンドで実行を継続する場合。コマンドを実行した らすぐに起動完了と判定します。 • Type=forking : 子プロセスをバックグラウンドで起動して、最初のコマンドは終了する場合。 最初のコマンドが終了したタイミングで起動完了と判定します。 • Type=oneshot : 一度だけコマンドを実行するタイプのサービスの場合。コマンドが終了した ら起動完了と判定して、サービスも終了したものと認識します。(「RemainAfterExit=yes」 を指定すると、コマンド終了後もサービスは起動したままと認識します。) • Type=nofity : systemdのライブラリ関数「sd_notify()」を使用する場合。プロセスのプログ ラム内部で、sd_notify()関数で起動完了を通知するように作られている必要があります(*) 。 • Type=dbus : D-Bus(プロセス間通信用メッセージバス)を利用するサ―ビスの場合。  BusNameで指定した接続名がD-Busに登録されると、サービス起動完了と判定します。 オプション 説明 Type サービスプロセスの起動完了の判定方法(デフォルトは「simple」) PIDFile fork型サービスのメインプロセスのPIDファイル BusName D-Bus型サービスのbus接続名 Restart サービスプロセス停止時の再起動条件(デフォルトは「no」) (*) https://fedoraproject.org/wiki/User:Johannbg/QA/Systemd/Sd_notify
  39. 39. Open Cloud Campus 39 Linux女子部 systemd徹底入門! serviceタイプの設定項目 (3)  systemdは、サービスに関連するプロセス群の中で最初に実行された「メインプロセス」の PIDを認識しており、ExecXXXオプション内から環境変数$MAINPIDで参照できます。 – ExecReloadオプションで、メインプロセスにHUPシグナルを送る際などに利用できます。 – 「type=simple」の場合は、ExecStartで起動したプロセスがメインプロセスになります。 – 「type=forking」の場合は、PIDFileオプションで指定のPIDファイルからメインプロセスを判定し ます。(サービス起動コマンドが、PIDファイルを生成する作りになっている必要があります。)  プロセスが異常終了した際の動作設定(従来のrespawn設定)は次のとおりです。 – Restartオプションでサービスの再起動を行うかどうか指定します。 • Restart=no : サービスの再起動は行いません。 • Restart=always : サービスの再起動を行います。 – デフォルトでは、10秒間の間に5回以上再起動すると、次の10秒間は再起動を試みません。一般に は、「StartLimitIntervalの間にStartLimitBurst回以上再起動すると、次のStartLimitIntervalの 間は再起動を試みません」(つまり、「StartLimitInterval=10s」「StartLimitBurst=5」がデ フォルト設定。)
  40. 40. Open Cloud Campus 40 Linux女子部 systemd徹底入門! serviceタイプの設定項目 (4)  systemdは、起動したサービスに関連するすべてのプロセスをCgroupsの個別のグループに 入れて管理しています。 – ExecStopのコマンドでサービスを停止した際、グループ内にプロセスが残っている場合 は、KillModeの設定に応じて残プロセスの処理を行います。 • KillMode=none : 残プロセスはそのまま放置します。 • KillMode=process : メインプロセスが残っている場合は、SIGTERM/SIGKILLで停止します。そ の他の残プロセスは放置します。 • KillMode= control-group : グループ内のすべての残プロセスを、SIGTERM/SIGKILLで停止し ます。 [Unit] Description=OpenSSH server daemon After=syslog.target network.target auditd.service [Service] EnvironmentFile=/etc/sysconfig/sshd ExecStartPre=/usr/sbin/sshd-keygen ExecStart=/usr/sbin/sshd -D $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process [Install] WantedBy=multi-user.target サービス起動前にホスト鍵を生成する reload処理は、メインプロセスに HUPシグナルを送る /usr/lib/systemd/system/sshd.service -Dオプション(デーモンモード)により、 最初のコマンドがそのまま実行を継続する。 従って「Type=simple(デフォルト)」が必要。 サービス終了時に残った 子プロセスは放置する
  41. 41. Open Cloud Campus 41 Linux女子部 systemd徹底入門! serviceタイプの設定項目 (4)  「Type=forking」はメインプロセスの追跡にPIDファイルが必要となることか ら、systemdのサービス設定では、「Type=forking」よりも「Type=simple/notify」の利 用が推奨されます。 – 例えば、Fedora17のhttpd.serviceでは「Type=forking」だったものが、Fedroa19では 「Type=notify」に変更されています。 [Service] Type=notify EnvironmentFile=/etc/sysconfig/httpd ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND ExecReload=/usr/sbin/httpd $OPTIONS -k graceful ExecStop=/usr/sbin/httpd $OPTIONS -k graceful-stop KillSignal=SIGCONT PrivateTmp=true Fedora 19の/usr/lib/systemd/system/httpdd.service [Service] Type=forking PIDFile=/var/run/httpd/httpd.pid EnvironmentFile=/etc/sysconfig/httpd ExecStart=/usr/sbin/httpd $OPTIONS -k start ExecReload=/usr/sbin/httpd $OPTIONS -t ExecReload=/bin/kill -HUP $MAINPID ExecStop=/usr/sbin/httpd $OPTIONS -k stop PrivateTmp=true Fedora 17の/usr/lib/systemd/system/httpdd.service PIDファイルでメインプロセスを追跡 子プロセスをバックグラウンドで起動して、 このコマンド自体は終了 httpdがsystemd前提に作られている(*) -DFOREGROUNDオプションにより、このコマンドが実行を 継続する。起動完了はsd_notify()関数で通知する。 (*) mod_systemdモジュールでsystemdに対応しています。http://bit.ly/1bTIoKg
  42. 42. Open Cloud Campus 42 Linux女子部 systemd徹底入門! serviceタイプの設定項目 (5)  serviceセクションの主要オプション (3) – User/Groupは、「ExecXXX=」で指定されたコマンドを実行するユーザ/グループを指定します。 • 「PermissionsStartOnly=yes」を指定すると「ExecStart=」で指定したコマンドのみが指定 ユーザ/グループで実行されます。 – その他は、サービスに関連するプロセスからアクセスできるディレクトリを制限します。 • これら機能は、ファイルシステムのネームスペースを分離することで実現しています。そのた め、サービスを提供するプロセスがこのネームスペース内で実施したバインドマウントは、他 のプロセスからは見えなくなるという制限があります(*) 。 (*) まれな例ですが、サービスプロセスが「ip netns」コマンドを使用する際に問題が発生します。 このコマンドは、    /proc以下にあるNetwork Namespaceの情報を/var/run/netns/以下にバインド マウントすることで、他のプロセス   と情報共有するためです。 Bug 872689 - Quantum: root cannot access network namespaces created by Quantum service https://bugzilla.redhat.com/show_bug.cgi?id=872689 オプション 説明 User / Group プロセスを起動するユーザ / グループ PrivateTmp このサービス専用の/tmpと/var/tmpを用意する ReadOnlyDirectories 指定のディレクトリ以下をReadOnlyモードにする InaccessibleDirectories 指定のディレクトリ以下をアクセス不可にする RootDirectory 指定のディレクトリにchrootする
  43. 43. Linux女子部 systemd徹底入門! 43 知っておくと便利な機能
  44. 44. Open Cloud Campus 44 Linux女子部 systemd徹底入門! Unitの無効化  # systemctl mask/unmask <Unit名> – 指定のUnitを無効化/有効化します。「mask」で無効化した場合は、「disable」と異なり、 「systemctl start」での手動起動もできなくなります。 – maskによる無効化は、/etc/systemd/system/以下に、/dev/nullへのシンボリックリンクとして設 定ファイルを作成することで行われます。したがって、/etc/systemd/system/以下に設定ファイル を作成している場合は、maskによる無効化はできません。 # systemctl mask firewalld.service ln -s '/dev/null' '/etc/systemd/system/firewalld.service' # systemctl unmask firewalld.service rm '/etc/systemd/system/firewalld.service'
  45. 45. Open Cloud Campus 45 Linux女子部 systemd徹底入門! テンプレートタイプの設定ファイル  「hogehoge@.service」という設定ファイルは、「hogehoge@<任意の文字列>.service」 という複数サービスの設定ファイルとして機能します。 – # systemctl start hogehoge@fuga.service • 「hogehoge@.service」の設定に従って、サービス「hogehoge@fuga.service」が起動します。 この際、設定ファイル内の「%I」が「<任意の文字列>」(今の場合は「fuga」)に置換されま す。(「%i」は「%I」内の記号文字を独自ルールでエスケープしたものになります。) – # systemctl enable hogehoge@fuga.service • .wantsディレクトリ内に、「hogehoge@fuga.service」から「hogehoge@.service」へのシン ボリックリンクが作成されます。これによって、systemdは、「hogehoge@fuga.service」を 自動起動しようとしますが、実際には、「hogehoge@.service」の設定が使われます。 – 下図の例では、「getty@tty1.service」「getty@tty2.service」などが利用できます。 [Service] # the VT is cleared by TTYVTDisallocate ExecStart=-/sbin/agetty --noclear %I 38400 linux Type=idle Restart=always RestartSec=0 UtmpIdentifier=%I TTYPath=/dev/%I TTYReset=yes TTYVHangup=yes TTYVTDisallocate=yes KillMode=process IgnoreSIGPIPE=no /lib/systemd/system/getty@.service([service]セクションの抜粋)
  46. 46. Linux女子部 systemd徹底入門! 46 参考資料
  47. 47. Open Cloud Campus 47 Linux女子部 systemd徹底入門! 参考資料  freedesktop.org - systemd System and Service Manager – systemdのプロジェクトページ – http://www.freedesktop.org/wiki/Software/systemd/  The systemd for Administrators Blog Series – 開発者Lennartによる解説シリーズ(上記プロジェクトページにリンク一覧)  Rethinking PID 1 – systemdの構想について記載されたLennartのブログ記事 – http://0pointer.de/blog/projects/systemd.html  systemd の情報を集め始めよう – Heartbeats社のブログ記事 – http://heartbeats.jp/hbblog/2013/10/systemd.html  systemd(slideshare) – レッドハット森若さんの概要説明資料 – http://www.slideshare.net/moriwaka/systemd
  48. 48. Open Cloud Campus 48 Linux女子部 systemd徹底入門! 参考資料  systemd入門(1)〜(5):enakai00のブログ記事 – Unitの概念を理解する • http://d.hatena.ne.jp/enakai00/20130914/1379146157 – Serviceの操作方法 • http://d.hatena.ne.jp/enakai00/20130915/1379212787 – cgroupsと動的生成Unitに関する小ネタ • http://d.hatena.ne.jp/enakai00/20130916/1379295816 – serviceタイプUnitの設定ファイル • http://d.hatena.ne.jp/enakai00/20130917/1379374797 – PrivateTmpの実装を見る • http://d.hatena.ne.jp/enakai00/20130923/1379927579  manページ – systemdはmanページが非常に充実しています。各コマンドのmanページの他、manページ systemd(1)から、「SEE ALSO」セクションのmanページをたどってください。
  49. 49. Open Cloud Campus 49 Linux女子部 systemd徹底入門! QA
  50. 50. Linux女子部 systemd徹底入門! 50 中井悦司 Twitter @enakai00 オープンクラウド・キャンパス FedoraでLinux最新技術を 学びましょう!

×