Centos7 systemd

8
CentOS7のsystemd/systemctlコマンドと 定ファイルの関と絵にしてみる。 ついでに、jorunaldの動きも絵にした。 twitter:@to_takada

Transcript of Centos7 systemd

Page 1: Centos7 systemd

CentOS7のsystemd/systemctlコマンドと設定ファイルの関係と絵にしてみる。

ついでに、jorunaldの動きも絵にした。

twitter:@to_takada

Page 2: Centos7 systemd

systemd/systemctlコマンドとUnit定義ファイル①

/usr/lib/systemd/system/ /etc/systemd/system

multi-user.target

httpd.service

httpd.service

Unit定義ファイル起動方法などを記述

システムデフォルトの設定が格納される

Dir

Systemdが”優先的”

に参照する設定が格納されるDir#systemctl enable httpd

(#chkconfig httpd on)

シンボリックリンクの作成

シンボリックリンク

httpd.service

#systemctl disable httpd

(#chkconfig httpd off)

シンボリックリンクの削除

Runlevel3相当で自動起動するサービスを定

義するDir

systemd

#systemctl start/stop/restart/status httpd

(#service httpd start/stop/restart/status)

システム起動時に参照

Page 3: Centos7 systemd

systemd/systemctlコマンドとUnit定義ファイル②

/usr/lib/systemd/system/ /etc/systemd/system

multi-user.target

httpd.service

httpd.service

Unit定義ファイル起動方法などを記述

システムデフォルトの設定が格納される

Dir

Systemdが”優先的”

に参照する設定が格納されるDir

#systemctl enable httpd

(#chkconfig httpd on)

シンボリックリンクの作成

シンボリックリンク

httpd.service

#systemctl disable httpd

(#chkconfig httpd off)

シンボリックリンクの削除

Runlevel3相当で自動起動するサービスを定

義するDirsystemd#systemctl start/stop/restart/status httpd

(#service httpd start/stop/restart/status)

システム起動時に参照

httpd.service

• 同じサービスのUnit定義ファイルが、両方のDirにある場合は、/etc/systemd/systemのほうが優先される。

• 管理者が、サービス設定を変えたい場合は、Unit定義ファイルを/etc/systemd/systemにコピーし、コピー先を変更するとよい。

手動でコピーして編集した

もの

Page 4: Centos7 systemd

systemd/systemctlコマンドとUnit定義ファイル③

/usr/lib/systemd/system/ /etc/systemd/system

multi-user.target

httpd.service

Unit定義ファイル起動方法などを記述

システムデフォルトの設定が格納される

Dir

systemdが”優先的”

に参照する設定が格納されるDir

systemd

• systemctl mask SERVICE_NAMEコマンドでは、/etc/systemd/system配下に当該サービス名のUNIT定義ファイルを、/dev/nullへのシンボリックとして作成する。

• /usr/lib/systemd/system/以下のデフォルトの定義ファイルより優先されるため、結果、systemctlコマンドからの制御(起動/停止等)が無効となる

#systemctl mask httpd

/dev/nullへのシンボリックリンクを作成

/dev/null

httpd.service

#systemctl start/stop/restart/status httpd

(#service httpd start/stop/restart/status)

が無効となる

Page 5: Centos7 systemd

自前でコンパイルしたプログラムはどーしよう????

<手順>

1. systemdの設定ファイル(Unit定義ファイル)を、SERVICENAME.service(例

named.service)として/usr/lib/systemd/system/以下に配置します。

2. “systemctl daemon-reload”コマンドでsystemdに反映します。

3. “systemctl enable SERVICE NAME”で自動起動設定

パッケージ管理システム(yum/rpm)で入れたサービスは、”systemctl”コマンドでそのまま制御できますが、自前でコンパイルしたプログラムは、Unit定義ファイルを用意する必要があります。

Page 6: Centos7 systemd

BindのUnit定義ファイルの例

[unit] #起動順序(依存関係/順序関係)を記載Description=Berkeley Internet Name Domain (DNS) #説明文Wants=nss-lookup.target #同時に有効化が必要な前提Unit(前提Unitが起動に失敗しても、このUnitは起動させる)Before=nss-lookup.target #このUnit(BIND)の後で起動させるUnitAfter=network.target #このUnit(BIND)の前に起動させるUnit

[service] #対象サービスの振る舞いを定義Type=forking #バックグラウンド実⾏の場合はforkingPIDFile=/var/named/chroot/var/run/named/named.pid #メインプロセスのPIDファイル

ExecStartPre=/usr/local/bind/sbin/named-checkconf -t /var/named/chroot -z /etc/named.conf #サービス起動前の追加コマンド(起動判定無)ExecStart=/usr/local/bind/sbin/named -u named -t /var/named/chroot -c /etc/named.conf #サービス起動コマンド

ExecReload=/bin/sh -c ‘/usr/local/bind/sbin/rndc reload > /dev/null 2>&1 || /bin/kill -HUP $MAINPID‘ #サービスリロードコマンド

ExecStop=/bin/sh -c ‘/usr/local/bind/sbin/rndc stop > /dev/null 2>&1 || /bin/kill -TERM $MAINPID‘ #サービス停止コマンド(異常時にも実⾏)

PrivateTmp=false #独自のtmpディレトリを使用するか

[install] #”systemctl enable”発⾏時の挙動を記載WantedBy=multi-user.target #enable時にこのUnitの.wantsディレクトリにシンボリックリンクを作成する==

# multi-user.target(ランレベル3)の時に一緒に有効化する

Page 7: Centos7 systemd

比較的簡単にUNIT定義ファイルを用意する方法

いちから、Unit定義ファイルを作るのは難しいので、rpmパッケージをダウンロードしてきて、同梱されているUnit定義ファイルを編集するのが、一番簡単かもしれません。

#yum install --downloadonly --downloaddir=/var/tmp/ bind

#rpm2cpio bind-9.9.4-14.el7.x86_64.rpm |cpio -idv

Unit定義ファイルを含むRPMがなかった場合は。。。。がんばって自前でつくるしかないですよね。

Page 8: Centos7 systemd

journald(systemd-jounald)によるロギング

/dev/log(UNIXソケット)

rsyslogd

プロセス

/dev/log(UNIXソケット)

rsyslogd

プロセス

systemd-journald

/run/log/journal/

CentOS6 CentOS7

バイナリファイル

imjournal

rsyslogモジュール

• RHEL/CentOS7では、syslogではなく独自のログ機構(journald)を保持しています。

• journarldは、出⼒内容にメタ情報を追加して、バイナリファイル(/run/log/journal)以下に書き出します。

• rsyslogは、imjournalモジュールを使って、バイナリファイルからメッセージを取り出し、rsyslogdに渡します

※ /run/log/journalは、tmpfs領域なので、再起動すると消えます

※ /var/log/journalディレクトリを作成すると、再起動以降は、永続的にファイルがここに書き込まれます。