蚊帳の中の日記

ゆるく生きてます

lpic 101 - level 1に合格したけど、実務で使えそうな知識をまとめてみる【systemd編】

先日lpic level 1 101試験を合格したのだけど、非常に勉強になったし、いままで触れていたlinuxの周辺技術の理解を更に深めることができた。

kayanaka.hatenablog.com

その中には実務で役立ちそうだなと思ったものもあれば、そうでないものもあったのだけど、せっかく役立つ方をまとめておけば、今後のためにもなりそうだったのでブログに書いておこうかと思った。

今回は、システムアーキテクチャの章で出てくる systemd辺りの話をまとめておこうと思う。

systemdとは?

ググれば幾らでも出てくる。自分なりにまとめてみると、linuxシステムで起動処理や起動時の設定などを行ってくれるシステムの一つSysVinitUpstartなどもあるがsystemdはそれらを更に改良したシステムで、自分が勉強した限りでは現在界隈で一番主流になっているシステム。
systemdのおかげで今まで直列型のようにシステムを起動していたのが、並列型のように起動できるようになったのでシステム起動が早くなったりした。また、いろいろなシステムの処理の設定・管理をUnitという単位で管理してくれたり、Service UnitをCLIから管理するためにsystemctlというコマンドも用意されていて、サービスの起動・停止・再起動などを行える。

webサービスを触っていて「nginxを再起動したいけど、どうするのかな」と思い、ググった結果「systemctl restart nginxでできるよ」と書いてる記事があったり、そうでない記事があったりで、自分はよく混乱したけど、systemctlを利用しているのは「systemdで管理しているnginx serviceをsystemctlで再起動する」ということ。linuxの知識が薄い自分にとっては、systemctlの正体を知るキッカケになった。

Unit

systemdはUnitと呼ばれる単位で処理を分けているといったが、このUnitもいくつか種類がある。service, swap, target’, device, mountが主な種類。特にwebサービスを触っているエンジニアなら、Service Unitを触る機会が多いはずで、linuxシステム上で管理している各種サービスはだいたいここに属するはず。
Unitの実態になる設定ファイル(Unitファイルと呼んだりする)は、/etc/systemd/system以下、もしくは/usr/lib/systemd/system以下にxxxx.serviceという拡張子で置かれている。ちなみにシステム起動時には、前者から後者の順で適用される。*1

実際にxxxx.serviceファイルの中身を見てみるとわかるのだが、そのサービスがインストールされたときの挙動や、systemctl restart,systemctl reloadなどのコマンドを送ったときの挙動が定義されていたりする。つまり、「systemctl hogefuga serviceを叩くと、どういった挙動になるのか?」は、Unitファイルを参照すると色々なことがわかるというわけ。

Unitという概念で各種サービスを管理してて、どこに設定ファイルがあるのか?これを知れただけでも、個人的に非常に勉強になった。 最近、Consulを通してどういったserviceが動いていて、それらserviceはどういった設定になっているのかをxxxx.serviceを見に行ったりする機会があり、ちょうど勉強した内容について触れられたのも良かった。多分、今後も役立ちそうな知識だ。

systemctlコマンド

man systemctlすると色んなオプションやサブコマンドがあるけど、まあ自分レベルが実務で今すぐ使えそうなのはこのくらいかなと思う。

  • systemctl start
  • systemctl stop
  • systemctl restart
  • systemctl reload
  • systemctl status
  • systemctl is-active
  • systemctl enable
  • systemctl disable
  • systemctl list-unit-files

is-activestatusがあるので、ほとんど使う機会がないかも知れない。

enable,diableは実際に叩いてみるとわかるのだけど、起動しているTarget配下にシンボリックリンクを作る or 削除することで、次回のシステム起動時に指定したserviceを自動起動するのかどうかを設定できる。
Targetは、Unitの種類の一つで、複数Unitをグループ化してくれる。主にmulti-user.targetrescue.targetなどのターゲットに分けられ、これをsystemdの起動時に最初に読み込む/etc/systemd/system/default.targetシンボリックリンクを貼れば、linux起動時に指定のtargetランレベル)を指定して、グルーピングされたUnitも順次起動するという仕組み。つまり、システム起動時にどんなサービスが自動起動するのだろう?というのを知りたければ、目当てのtargetの設定ファイルとディレクトリを見に行けば良い。

list-unit-filesは知らなかったのだけど、unitを一覧で見れて、覚えておくと使い所はありそうな感じ。

systemd-journald

systemdのプロセスには主に

  • メインプロセスである`systemd``
  • ログを管理するプロセスsystemd-journald
  • ログイン処理プロセスsystemd-logind
  • バイスの検知プロセスsystemd-udevd

などが存在する。
この中で特に実務で使いそうなのが、ログを管理するsystemd-journaldだと思う。サービスが予期せぬ事で停止してしまった時や不具合が起きた時にログを確認して、原因究明に役立てる。実際、このプロセスに対して指示を出すのは、systemctlと同じようにjournalctlというのがあり、それを使う。lpic101 level1ではよく出る題目ではないが、journalctl -xeとか、journalctl -u xxxx.serviceなどを叩く機会は多いかと思う。

自分も実務で「start叩いてるのに、なんかミドルウェアが起動しない!!」という場面があったりした時にお世話になった。各種サービスのログは、主にjournaldプロセスで管理していて、journalctlで見たりできることを覚えていれば、システム不具合等の時の調査で役立てられるはずだ。

———————

systemdは結構前からあるシステムで、ググったりすると私、systemd嫌いみたいなタイトルの記事も出てきたりで、良きところもあれば悪いところもあるらしい。でも、linux初学者の自分にとってLinuxシステムがどういった仕組みで動いているのかの基本的な内容を知れたのは、めちゃくちゃ良かった。

次はunixコマンドを辺りで、実務で役立ちそうな内容をまとめたいと思う。

*1:前者のディレクトリはホスト毎に修正されたUnitが置かれ、後者のディレクトリはユーザが作ったUnitを置く場所、という使い分けが一般的になっている。