東京エリアdebian勉強会 - systemd · 2018-04-22 · 東京エリアdebian勉強会 systemd...

Post on 02-Jun-2020

7 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

東京エリアDebian勉強会systemd

岩松信洋iwamatsu@debian.org

2012年11月17日

はじめに

世の中の主要なLinuxディストリビューションはSysVinitの init scripts から他の init システムに移行しつつある( はず)。FedoraやArch Linuxが systemd に移行を始めたということもあり、一部で盛り上がっている( 阿鼻叫喚ともいう)。まさかいまだに SysVinit を使ってないよね?Debianと systemdについてまとめた。

systemdとは?

RedHat に勤めている Lennart Poettering 氏によって開発されている。init の代替プログラム。実際には init の代替だけではなく、Linux のサービス( デーモン)管理フレームワーク。今までの initシステムの違い

サービスのプロセス管理を pid ではなく、 cgroups を使う。サービスの起動をソケットとバス (dbus)を使う。サービスの依存関係があり、これによってシステム立ち上げ処理をより並列的に行える。System V スタイルとBSDスタイルの両方をサポートしている。CosoleKit との連携。

systemdとは?

開発は freedesktop.orgで行われており、開発は活発で週に一度はバージョンアップ。最新バージョンは v195。http://cgit.freedesktop.org/systemd/systemd/

SysVinit と比べた systemd の利点

設定が容易。起動が早い。カーネルモジュールの操作、セッション管理、ログ管理、ディスクの暗号化などが統合されている。

その他、開発者による説明がhttp://0pointer.de/blog/projects/why.html にある。

SysVinit と比べた systemd の欠点/不安

あらゆる基本サービス (cronなども)をまとめるという壮大な物語。日本語ドキュメントがない、ぐらい?kFreeBSD でも頑張ればうごくらしい。( どうやってるのかは不明)

Debianで使う

systemd はもちろん Debian でも提供されているtesting / unstable で v44 が利用できる最新版とバージョンに差があるが、アップストリームで頻繁にバージョンアップするのでバージョンはあまり問題ではない v44 でも systemd を十分に使うことができるいまのところ Debianに関する情報はhttp://wiki.debian.org/systemd にまとまっているが情報が少なく、内容も古い

インストール

apt-get / aptitude でインストールできる。Linux カーネルは 2.6.39 以上、devtmpfs, fanotify,autofs4, cgroups が有効になっている必要がある。

インストール

インストールは以下のように実行する。

$ sudo apt-get install systemd

以下のパッケージが依存関係でインストールされる。

libsystemd-daemon0libsystemd-id128-0libsystemd-journal0libpam-systemd

インストール

次にブートローダに init指定を追加するGRUB を使っている場合、/etc/default/grub のGRUB CMDLINE LINUX DEFAULT にinit=/lib/systemd/systemd を追記する

変更前:GRUB_CMDLINE_LINUX_DEFAULT="quiet"変更後:GRUB_CMDLINE_LINUX_DEFAULT="quiet init=/lib/systemd/systemd"

インストール

変更後、update-grubを実行し、GRUB に設定を反映する。そしてリブートする。設定が間違っていないければ systemd で立ち上がるはず。

$ sudo update-grub.....$ sudo reboot

起動速度

systemd はアナライザをデフォルトでサポートしている。SysVinit だと bootchart2 で測定する必要がある。起動にかかった時間を確認するには systemd-analyze

を実行する。

$ systemd-analyzeStartup finished in 1831ms (kernel) + \

5669ms (userspace) = 7500ms

起動速度

また、画像で確認したい場合には prop オプションを指定して実行する。SVG フォーマットで出力されるので、リダイレクトしてファイルに保存する。

$ systemd-analyze plot > systemd-boot.svg

起動速度

試しに自分が常用している環境で起動時間を測定したところ、SysVinit は約15秒、 systemd は約10秒だった。

用語

systemd を扱うには専門用語が出てくるので説明する。

ユニット

systemd ではデーモンなどの制御対象のことをユニットと呼ぶ。ユニットにはサービス、デバイス、マウントポイントなど、いくつかの種類がある。このユニットはテキストファイルで記述され、/lib/systemd/system/ 以下に格納されている。各ユニットは拡張子を持ち、サービスの場合は.service

となっている。

ユニット

ユニットの種類 説明service サービスsocket ソケットで起動するためのソケット定義target 各サービスを同期させるための定義device udev で管理するデバイスsnapshot ある時点の init の状態timer イベントから時間経過path 監視するパスmount マウントポイントswap スワップautomaount 自動マウントポイント

mount, swap, automout は起動時に /etc/fstab から自動的にユニットを生成する。

ターゲット

SysVinit の runlevel 相当のもの。これはディストリビューションによって異なる。Debianの場合は以下の通り。

run level systemd のターゲット0 poweroff.target1 rescue.target2 - 5 multi-user.target6 reboot.target

ターゲット

この他にgraphical.target と emergency.target がある。graphical.target X による起動を行うときに呼ばれるターゲットemergency.target は障害が起こった時に起動できるようにするためのターゲット。ターゲットはカーネルのブートオプションにsystemd.unit=で指定できる。何も指定しない場合はdefault.target が呼ばれるようになっている。

ユニットの操作方法

systemd に移行した後、デーモン等の制御は /etc/init.d/以下を実行するのではなく、 systemctl コマンドを使って操作する。以下にユニットの操作方法について説明する。

起動しているユニットを表示する

起動しているユニットを表示するには sytemctl を実行する。

$ systemctl...console-setup.service loaded active exited LSB: Set console font andcron.service loaded active running LSB: Regular background prdbus.service loaded active running D-Bus System Message Busdebian-fixup.service loaded active exited Various fixups to make sysexim4.service loaded active running LSB: exim Mail Transport Agetty@tty1.service loaded active running Getty on tty1ifup@eth0.service loaded active exited ifup for eth0...

全てのユニットを表示する

操作できるユニットを表示するには --all を指定する。

$ systemctl --allUNIT LOAD ACTIVE SUB JOB DESCRIPTIONproc-sys...misc.automount loaded active waiting Arbitrary Executable Fildev-cdrom.device loaded active plugged QEMU_DVD-ROMdev-disk...QM00003.device loaded active plugged QEMU_DVD-ROMdev-disk...QM00001.device loaded active plugged QEMU_HARDDISKdev-disk...2dpart1.device loaded active plugged QEMU_HARDDISKdev-disk...2dpart2.device loaded active plugged QEMU_HARDDISK...

ユニットの状態を確認する

ユニットの状態を確認するには、status オプションに確認したいユニット名を指定して実行する。以下に rsyslog.service ユニットの状態を確認する例を示す。

$ systemctl status rsyslog.serviceLoaded: loaded (/lib/systemd/system/rsyslog.service; enabled)Active: active (running) since Wed, 14 Nov 2012 00:37:18 -0800; 22h agoProcess: 474 ExecStartPre=/bin/systemctl stop systemd-kmsg-syslogd.service (code=exited, status=0/SUCCESS)Main PID: 483 (rsyslogd)CGroup: name=systemd:/system/rsyslog.service

└ 483 /usr/sbin/rsyslogd -n -c5

これにより、このユニットは/lib/systemd/system/rsyslog.serviceによってWed, 14

Nov 2012 00:37:18 -0800に起動していることが分かる。

ユニットを起動する

起動していないユニットを起動するには、 startオプションにユニット名を指定して実行する。これは /etc/init.d/サービス startと同様の動きとなる。

$ sudo systemctl start ユニット名

ユニットを停止する

起動しているユニットを停止するには、stopオプションにユニット名を指定して実行する。これは /etc/init.d/サービスstopと同様の動きとなる。

$ sudo systemctl stop ユニット名

ユニットの設定を再読み込みする

ユニットの設定を再読み込みするには、daemon-reloadオプションにユニット名を指定して実行する。

$ sudo systemctl daemon-reload ユニット名

実際に動いているデーモンの設定、例えばhttpdの設定を再読み込みし、再起動するには reloadオプションを使う。

ユニットの自動起動を有効にする

ユニットの自動起動を有効にするには enable オプションにユニット名を指定して実行する。有効にすると /etc/systemd/system/ターゲット.wants/に/lib/systemd/system/にあるユニットへのシンボリックリンクが作成される。どのターゲットで自動起動が有効になるかは、ユニットファイルの Installセクションで指定する。

$ sudo systemctl enable ユニット名

ユニットの自動起動を無効にする

ユニットの自動起動を無効にするには disable オプションにユニット名を指定して実行する。無効にすると、/etc/systemd/system/ターゲット.wants/にあるシンボリックリンクが削除される。

$ sudo systemctl disabe ユニット名

ユニットの詳細を確認する

ユニットの詳細を確認するには show オプションにユニット名を指定して実行する。これにより指定したユニットと他のユニット、ターゲットの関係などが分かる。

$ sudo systemctl show rsyslog.serviceId=rsyslog.serviceNames=syslog.service rsyslog.serviceRequires=basic.targetWants=syslog.socketWantedBy=multi-user.targetConflicts=shutdown.target...

ユニットについて

ユニットには各ユニット間の依存関係を記述することができる。依存関係の指定として以下がある。

定義 説明Before そのユニットの後に起動されるべきユニット。After そのユニットの前に起動されるべきユニット。Conflicts 同時に起動できないユニット。Service ソケットによる起動を行うユニット。Sockets ソケットによるユニットの起動を行う場合のソケット情報。Wants 同時に起動してほしいユニット。成功、失敗は関係ない。Requires 同時に起動されなければならないユニット。ユニットの起動が失敗した場合は要求元も失敗するBindTo ユニットをグループとしてまとめる。

ユニットについて

例えば、default.target の内容は以下のようになっている。

[Unit]Description=Graphical InterfaceRequires=multi-user.targetAfter=multi-user.targetConflicts=rescue.targetAllowIsolate=yes

このターゲットはmulti-user.targetと同時に起動され、multi-user.targetの後に起動する。また、 rescue.targetと同時に起動できない。

まとめ

Debian でも問題なく systemd が利用できる環境が整っている。レガシーなSysVinitは捨て、新しい initの世界へ足を踏み入れてみてはいかがでしょうか。

参考文献

http://www.slideshare.net/moriwaka/systemd

top related