twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル systemd を理解し、使いこなす

systemd を理解し、使いこなす

原文はこちらです。

Systemd components graphic

   好むと好まざるとにかかわらず、systemd は存在するので、その機能について勉強しましょう。

systemd については、いろいろと議論があります。Linux ユーザーの大半が、新しくする必要を感じていないでしょうし、systemd の開発者は、みんなの心を惹きつけたとは言えません。さらに、この LKML のスレッドによれば、Linus は、systemd の開発者 Kay Sievers を Linux Kernel から追い出しました。

 自分の気持ちを出したくなります。いろいろ、不満を言いたいことがありますが、置いておきます。 長い間、Linux には、SysVinit や BSD の init が実装されていました。その後、service chkconfig コマンドが追加されました。これらは、サービスの管理を容易にするものでした。しかし、私にとっては、学ぶことが増えたが仕事は楽にならず、混乱するだけでした。

 つづいて、Upstart と systemd の登場です。これらは、SysVinit との互換性を保つアドオンを含んでいます。それは良いことですが、学ぶべきことも多いです。Ubuntu 14.10 では、Upstart は、引退し、systemd が採用されるでしょう。14.04 には、systemd 用のライブラリとツールが導入されます。Ubunbu 14.04 の systemd-service パッケージに含まれるファイルのリストを見てみましょう。

$ dpkg -L systemd-services

   この出力にあるコマンド群についてマニュアルをチェックしましょう。

  開発者の誰かが、Linux のキーとなるサブシステムをいじくりまわそうとすると、いつも問題が発生します。それは、新しくなった部分に、いつも振り回されるからです。アプリケーション、デスクトップ環境やコマンドが気に入らないときは、他にも選択肢があり、別のものを使うことができます。しかし、基本的なサブシステムは、カーネル、管理スクリプト、ソフトウエアパッケージと密接に関連しているため、入れ替えることは簡単ではありません。

 モラルは、変化するものです。 コンピュータは、非常に複雑なものの組み合わせで動作しています。そして、最終的に動いているのです。動かないときは、何か、私たちが対応できるものに合わせることができないのです。

systemd 最初の一歩

 Red Hat が systemd の最初の開発者であり、推進者です。つまり、systemd を試すために、Red Hat Enterprise Linux、そのクローンの CentOS、Scientific Linux、そしてもちろん Fedora Linux が、最適なディストリビューションです。Fedora Linux は、最新ですてきな機能を提供してくれます。今回、私は CentOS 7 を使いました。

経験のある RH ユーザーであれば、RH 7 の servicechkconfig を使うことができます。しかし、ネイティブな systemd ユーティリティを使うべきときです。systemd はそれらと入れ替わり、servicechkconfig は、ネイティブな systemd サービスをサポートしていません。

  /etc/inittab は、もはやありません。そのかわり、/etc/systemd/system/ ディレクトリに /usr/lib/systemd/system/ 下のファイルへのリンクが張られています。/usr/lib/systemd/system/ は、ブート時に立ち上げるサービス用のスクリプトを含んでいます。それらは /etc/systemd/system/ にリンクされている必要があります。サービスをイネーブルしたいときは、systemctl コマンドにより、リンクします。ClamAV の例を見てみましょう。

# systemctl enable clamd@scan.service
ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'

   init スクリプトの名称や存在場所を知るためには、CentOS 7 では、2 つのパッケージに分かれています。Apache を含む多数のサーバーは、systemd に含まれておらず、systemd 用の init スクリプトを持っていません。ClamAV は、systemd と SysVinit 両方の init スクリプトを提供しており、どちらか好きなほうをインストールできます。

$ yum search clamav
clamav-server-sysvinit.noarch
clamav-server-systemd.noarch

init スクリプトの中身を見てみましょう。

$ less /usr/lib/systemd/system/clamd@scan.service
.include /lib/systemd/system/clamd@.service
[Unit]
Description = Generic clamav scanner daemon
[Install]
WantedBy = multi-user.target

これを見ると、systemdctl コマンドがどこにリンクを張るかわかります。この init スクリプトには、他のサービス clam@.service との依存関係も記述されています。

 systemdctl を使って、init スクリプトを持つサービスのステータスを知ることができます。

$ systemctl list-unit-files --type=service
UNIT FILE              STATE
[...]
chronyd.service        enabled
clamd@.service         static
clamd@scan.service     disabled

  サービスには、3 つのステータスがあります。イネーブル、ディセーブル、そしてスタティックです。「イネーブル」は、.wants ディレクトリにリンクがあることを、「ディセーブル」は、リンクがないことを意味します。「スタティック」は、init スクリプト中に [install] セクションがなく、イネーブルにもディセーブルにもできないことを意味します。スタティックなサービスは、通常、他サービスに依存していて、自動的にコントロールされます。ClamAV で具体的に見てみましょう。clamd@.serviceclam@scan.service に依存しているため、clam@scan.service が起動したときのみ実行されます。

  これらのステータスには、サービスが実行中であるかどうかはわかりません。ps コマンドを使うか、systemctl コマンドを使います。

$ systemctl status bluetooth.service
bluetooth.service - Bluetooth service
   Loaded: loaded (/usr/lib.systemd/system/bluetooth.service; enabled)
   Active: active (running) since Thu 2014-09-14 6:40:11 PDT
  Main PID: 4964 (bluetoothd)
   CGroup: /system.slice/bluetooth.service
           |_4964 /usr/bin/bluetoothd -n 

 systemctl コマンドを使うと、知りたいことがわかります。

チートシート (覚書)

  下記に、よく使うコマンドを示します。

# systemctl start [name.service]
# systemctl stop [name.service]
# systemctl restart [name.service]
# systemctl reload [name.service]
$ systemctl status [name.service]
# systemctl is-active [name.service]
$ systemctl list-units --type service --all

  systemd は、12 のユニット タイプを持ちます。.service は、システムサービスを意味し、上記のコマンドで指定するときは、.service 拡張子を外してください。他に指定しない場合、systemd.service を仮定します。他のタイプは、次のとおりです。

  • Target: group of units
  • Automount: filesystem auto-mountpoint
  • Device: kernel device names, which you can see in sysfs and udev
  • Mount: filesystem mountpoint
  • Path: file or directory
  • Scope: external processes not started by systemd
  • Slice: a management unit of processes
  • Snapshot: systemd saved state
  • Socket: IPC (inter-process communication) socket
  • Swap: swap file
  • Timer: systemd timer

  これらのタイプを扱うことはないと思いますが、何に使われるかを覚えておくべきでしょう。次のようにして見ることができます。

$ systemctl list-units --type [unit name]

ブレーム ゲーム

  どのような理由にせよ、SysVinit の置き換えを提案した人は、そのブート時間に悩まされたと思います。ここで使った CentOS7 の systemd は、他よりも、それほど早くはブートしませんでした。私は、これらについてそれほど、気にしていません。なぜなら、ブート時間の測定は、ログイン可能になるまでの時間を測定しているのであって、システムが完全に起動して使用可能になるまでの時間を測定しているわけではないからです。マイクロソフトの Windows は、この意味で長い間チャンピオンでいました。つまり、ログイン可能になるまでという意味です。実際には、他のプログラム、コマーシャル プログラム、スパイウェアやその他、実行して欲しくないプログラムをロードしたり、実行する時間が必要なのです (Oracle の Java 更新の表示が出たら、ちょっといらつきます)。

  それでも、ブート時間を気にするのであれば、各プログラムとサービスの起動時間を以下のようにして知ることができます。

$ systemd-analyze blame
  5.728s firewalld.service
  5.111s plymouth-quit-wait.service
  4.046s tuned.service
  3.550s accounts.daemon.service
  [...]

  他にもまだありますが、今日のところは、これくらいにしておきましょう。systemd は、すでにかなり巨大なものになっています。詳細は、参考文献を見てください。

 

参考文献

Freedesktop.org systemd System and Service Manager
Here We Go Again, Another Linux Init: Intro to systemd

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ

  1. Today's Linux 2018/10/09 2018年 10月 08日
  2. Today's Linux 2018/10/10 2018年 10月 09日
  3. Today's Linux 2018/10/12 2018年 10月 11日
  4. Today's Linux 2018/10/17 2018年 10月 16日
  5. Today's Linux 2018/10/18 2018年 10月 17日

Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!