深夜に某IRCでsystemdの話してたのをちょっと編集したログ
コマンドオプション順序
ar*******> sudo systemctl hogehoge start にしてほしかった
moriwaka> sudo service hogehoge start とすればいいんじゃないかな
moriwaka> LSBにserviceがある限りたぶん永遠に残るよ
ar*******> なるほど
ar*******> service 使えばいいのはわかるんだけど、systemctl が service と記述順を違えたのはなんでかしら
ca***> command subcommand ... という書式で統一したかったとか?
moriwaka> command subcommand object にしたかったんでしょうなあ
moriwaka> shellの補完と相性よさそうだし
ar*******> stop して start してとかやるときの編集がめんどい
pl*****> コマンド順はあんまり気にならないんだけど、
pl*****> systemctl start hogehoge してから systemctl status hogehogeするのがたまにダルイ
ar*******> それ
moriwaka> わかる
ar*******> history 編集するときカーソル移動だるい
moriwaka> 僕もctrl-w で1 word消すのが癖になってるから今でも編集ミスるわ
pl*****> unit自分で書いてると頻繁にそれやるからつかれる
ar*******> カーソル移動の時間が積もり積もって過重労働に
moriwaka> Alt-Bとか使えばいいんだけど手癖がなあ……
Restartの契機
pl*****> 最近はまったのはRestart=(OnFailure=だったかな?)がType=simpleじゃないと機能しないこと
pl*****> simpleだと機能してoneshotだとダメなんだったっけ
pl*****> 忘れっちった
pl*****> コマンドをサービス化してるのでなるべくoneshot使ってるんだけど、typeによって使えない機能があったりするのは知らなかった・・・
moriwaka> oneshotだとprocessがexitするの想定された動作だから
moriwaka> processがexitしててもserviceとしてはactiveでrestart動かないのはまあそうかなという気持ち
pl*****> うむー
pl*****> 確かにそう言われるとそういうもんか
Conditionほげほげが好き
moriwaka> Conditionalなんとか が割と好きで、どの条件で失敗したかstatusで見えると「おお…… 進歩してる……」って感じになる
pl*****> conditionalって何?
moriwaka> Conditionなんとかか。ConditionPathExists= とか
pl*****> ConditionPathExistsとかか
pl*****> あれ便利なので多様してる〜
バイナリログつらい
ts******> systemdのユニットファイルなどは使いやすいけど、何故バイナリログにしてやがったのか・・・
pl*****> 並列起動だから出力されるログの順序が決定的じゃないってのもたまに騙される
ts******> "SYSTEMD_PAGER="を設定すると使い勝手が良くなる >systemd
WantedBy=multi-user.targetの動き
pl*****> 未だにちょっと理解できてないのが、
pl*****> WantedBy=multi-user.targetしてるユニットは、
pl*****> Reached target Multi-User System.ってログに出てたらキックされてるってことでいいのかな
pl*****> Reached target Multi-User System.って出た後にwants/wantedbyしてるユニットが起動されるのかな
moriwaka> それ[install]セクションにかくので
moriwaka> enableするとmulti-user.targetのWantsに追加される
moriwaka> Wantsなだけなので、前後関係は決まらない
moriwaka> systemdの「起動したいリスト」にはのってるはず
pl*****> あーーーっていうことは
pl*****> Reached target Multi-User System.って出てるから、サービスがキックされてるって保証はないのか・・・
pl*****> systemdは何をもってReached target 〜を出力してるんだろ・・・
moriwaka> そのtargetをactivateしたらじゃないの。
moriwaka> Before=multi-user.target とか書けばいいのでは(targetについた時点で起動がはじまってると保証してほしいときは
pl*****> だとするとbefore=multi-user.target必要になるのか・・・
pl*****> ふむ
pl*****> ぁーそーかーかなり勘違いしてたなぁ
moriwaka> わりとそのへんごちゃっとするよね……
pl*****> wants/requireは順序関係ないから、WantedBy=Xしてても「Reached target Xって出てるからサービスはキックされてるはず」とは鳴らないのか・・・
moriwaka> はい
pl*****> ぐへぇ。勉強になりました・・・
moriwaka> 「必要なんだから先に起動してるじゃろ」と思うのはすごくよくあると思うのでみんなハマるところだとおもう
pl*****> むずかしー
pl*****> ぜひmastering systemdを書いてほしい・・・
moriwaka> 本はしらないんだけどpacktとかにないのかな
Conflicts=shutdown.target
pl*****> あと、Conflicts=shutdown.targetって何の意味があるんだろう
moriwaka> shutdownコマンドとかでshutdown.target を呼びにいくときには俺を終了してくれよなという意味では>conflicts
pl*****> ぁーーーそうか。終了するときに shutdown.targetに遷移するから、その時に殺してくれるのか・・・
pl*****> conflicts=にサービスが設定されてると、このサービスはあのサービスと競合するんだなって分かるけど、
pl*****> shutdown.targetと競合する?どういうことだ?ってなってた・・・
moriwaka>
------------------------------------------------------------------------
shutdown.target
A special target unit that terminates the services on system shutdown.
Services that shall be terminated on system shutdown shall add Conflicts= and Before= dependencies to
this unit for their service unit, which is implicitly done when DefaultDependencies=yes is set (the
default).
------------------------------------------------------------------------
systemd.special(7)に↑の記載があったよ
pl*****> DefaultDependencies=noにしてる場合のみ必ず書く必要があるって感じか
systemdのドキュメント
pl*****> ぁー systemd.specialなんてあるのか・・・読んでませんでした
moriwaka> systemd組込みのunitは Documentation=man:systemd.special(7) みたいな感じでどこ読めばいいかも書いてくれてるからそこから辿っていくとやりやすいです
pl*****> ProtectSystem=とかすごい安心感ある・・・こんなのあるんだ
pl*****> ドキュメント辿ってるだけで時間が無限に過ぎそう
moriwaka> dpkg -L systemd|grep /man|wc -l → 198
多すぎてさすがにびびった。まあだいたい7章から辿れるはず……
pl*****> 片手間で鯖缶してる人なんかは、たしかにsystemd勉強するのは辛いかもね
pl*****> 読むもの大杉ってなりそう
moriwaka> おおざっぱには、systemd-* はあんまりユーザが叩かないコマンドとかなので
systemd.*(5) でunitの設定読んで、必要に応じて*.conf読んで、あと なんとかctl のman pagesを読んでおけばだいたい日常の用は足りるはず
systemd.directives.7.gz というのがunitで書けるディレクティブの辞書的になってて
こっから記載があるman pageがたどれる
pl*****> ふむ
moriwaka> unitファイル見たら知らないディレクティブがでたときむけ(だいたいsectionでわかるけど
コマンド分け……てるよ
ar*******> journalctl とか、わけるのかくっつけるのか、一貫性がないな。
ar*******> それわけるなら、systemctl をもう少し細かく分けたらいいのに。
aa**> systemdってなんでしょうか?サービスを管理するなにか?
moriwaka> linuxユーザーランドの基盤をととのえるプロジェクトの名前兼、initをやるデーモンの名前
pl*****> 個人的にユーザーランドに頭出してる第二のカーネルと思ってる
moriwaka>
------------------------------------------------------------------------
$ dpkg -L systemd | grep bin/
/bin/journalctl
/bin/loginctl
/bin/networkctl
/bin/systemctl
/bin/systemd-ask-password
/bin/systemd-escape
/bin/systemd-inhibit
/bin/systemd-machine-id-setup
/bin/systemd-notify
/bin/systemd-sysusers
/bin/systemd-tmpfiles
/bin/systemd-tty-ask-password-agent
/usr/bin/bootctl
/usr/bin/busctl
/usr/bin/hostnamectl
/usr/bin/kernel-install
/usr/bin/localectl
/usr/bin/systemd-analyze
/usr/bin/systemd-cat
/usr/bin/systemd-cgls
/usr/bin/systemd-cgtop
/usr/bin/systemd-delta
/usr/bin/systemd-detect-virt
/usr/bin/systemd-mount
/usr/bin/systemd-path
/usr/bin/systemd-resolve
/usr/bin/systemd-run
/usr/bin/systemd-socket-activate
/usr/bin/systemd-stdio-bridge
/usr/bin/timedatectl
/bin/systemd
/usr/bin/systemd-umount
------------------------------------------------------------------------
実行ファイルだけでこんだけある
まあsystemctl, journalctl, loginctlくらいしか日常叩かないけど
このへんのソフトウェア群がサービスが起動したりログインセッションはじまったりするための環境をととのえるために色々な仕事をします
aa**> あーそれなのか、systemctl, journalctl,はよくお世話になってます
timedatectlつかう?
pl*****> timedatectl、新し目のrhelだとtimesynd使うようになったり?
pl*****> 7系はchrony固定なのかな
moriwaka> 7はchronyかntpdですね。timesyncdは自分でつかったことがないからよく知らない
pl*****> なるほど