Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
半年前の自分に教えたい systemd のハマりどころ
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Sho Iizuka
May 19, 2019
Programming
18k
19
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
半年前の自分に教えたい systemd のハマりどころ
https://connpass.com/event/130986/
Sho Iizuka
May 19, 2019
More Decks by Sho Iizuka
See All by Sho Iizuka
Osaka.Stan#5 LT プログラミングコンテストのデータを分析した話
arosh
1
7.9k
簡潔データ構造輪講資料(順列)
arosh
1
9.3k
Pythonにおける日本語処理
arosh
1
2.2k
FM-index による全文検索
arosh
0
53
円と円の外接線の求め方
arosh
0
81
円と円の交点の求め方
arosh
0
48
Other Decks in Programming
See All in Programming
えっ!!コードを読まずに開発を!?
hananouchi
0
160
スマートグラスで並列バイブコーディング
hyshu
0
280
AIキャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
160
「正の参照」と 「負の導出」で組む ハーネスエンジニアリング
cottpan
1
130
OS アップデート対応の取り組み方がもっと共有されてほしい
andpad
0
110
エージェンティックRAGにAWSで入門しよう!
har1101
9
1.9k
Observability in Practice:Grafana 與 Edge Device SRE 的那些事
blueswen
0
190
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
150
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
7
1.8k
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
200
act1-costs.pdf
sumedhbala
0
200
Webフレームワークの ベンチマークについて
yusukebe
0
200
Featured
See All Featured
Connecting the Dots Between Site Speed, User Experience & Your Business [WebExpo 2025]
tammyeverts
11
970
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
エンジニアに許された特別な時間の終わり
watany
107
250k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Why Our Code Smells
bkeepers
PRO
340
58k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
The Cult of Friendly URLs
andyhume
79
6.9k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.3k
Discover your Explorer Soul
emna__ayadi
2
1.2k
From π to Pie charts
rasagy
0
230
YesSQL, Process and Tooling at Scale
rocio
174
15k
Transcript
半年前の自分に教えたい systemd のハマりどころ 1 @shora_kujira16 dbus / systemd を話すお茶会
自己紹介 2 • 所属:サイボウズ株式会社 クラウド運用チーム • 2019年1月よりオンコールに参加中 • 最近取り組んでいること •
MySQL の IO 周りのチューニング • CPU やメモリのリソース割り当ての改善 • 古いサービスの systemd への移植
発表内容 3 古いサービスを systemd に移植したときにいろいろな間違いをしてきました。 「昔の自分に教えたいハマりどころ」を共有させてください。 1. Wants = network.target
はだいたい間違っている 2. WantedBy = default.target? 3. drop-in の意外な仕様 4. Requires= は「このサービスの起動に必要」ではない 5. Assert と Condition の微妙な違い 6. After= が使えるのは正しく作られたサービスに限る 資料作成間に合わず
Wants = network.target はだいたい間違っている 4 ネットワーク接続が必要なサービスを作るとき ↓ は だいたい間違っている 書くべきだったのは多くの場合これ
もしくはこっち [Unit] Wants = network.target [Unit] After = network.target [Unit] Wants = network-online.target After = network-online.target
Wants = network.target はだいたい間違っている 5 どうしてこういうことが起こるのか? • network.target と network-online.target
の違いが知られていない • special passive system unit について知られていない
Wants = network.target はだいたい間違っている 6 network.target と network-online.target の違い •
network.target … ネットワーク管理スタックが起動した • network-online.target … ネットワークが使えるようになった (「使える」の定義はネットワーク管理スタックに依存する) ※ ネットワーク管理スタック … Ubuntu 18.04 では systemd-networkd 以下に記載がある https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/
Wants = network.target はだいたい間違っている 7 • (別のサーバーに接続するために) ネットワークが利用可能になるのを待つ必要があるサービスの場合 • ネットワークが利用可能になるのを待たなくても
起動してよいサービスの場合(例:apache, sshd) [Unit] Wants = network-online.target After = network-online.target [Unit] After = network.target シャットダウン時に graceful stop するために このサービスを止めた後にネットワークを止める (stop 時は ordering dependency が逆になることに注意)
Wants = network.target はだいたい間違っている 8 special passive system unit とは
• man 7 systemd.special の Special Passive System Units を参照 • 起動順序の制御のために用意されている特殊な target • サービスの利用側 (consumer) が Wants= を設定するのではなく サービスの提供側 (provider) が Wants= を設定する consumer provider [Unit] Wants = network.target Before = network.target [Unit] After = network.target
Wants = network.target はだいたい間違っている 9 multi-user.target foo.service network.target systemd- networkd.service
Wants= Wants=, After= Wants=, After= まちがい
Wants = network.target はだいたい間違っている 10 multi-user.target foo.service network.target systemd- networkd.service
Wants= After= Wants=, Before= せいかい Wants=
Wants = network.target はだいたい間違っている 11 結論 • network.target は Wants=
や Requires= に設定してはいけない (※ あなたがネットワーク管理スタックの開発者である場合を除く) • 多くの場合、書くべきだったのはこれ • ほかに気を付けたほうが良さそうなのは time-sync.target と nss-lookup.target [Unit] Wants = network-online.target After = network-online.target
WantedBy = default.target? 12 OS 起動時に自動起動させたいサービスは次のように書くことが多い 仕組み • systemd は
OS 起動時に default.target を activate する • default.target は multi-user.target (≒ runlevel 3) や graphical.target (≒ runlevel 5) の symlink になっている • systemctl enable すると multi-user.target.wants 以下に symlink が生成される • multi-user.target が activate されるときに一緒に起動する [Install] WantedBy = multi-user.target
WantedBy = default.target? 13 とある Web サイトの記載
WantedBy = default.target? 14 • レスキューモードで起動すると default.target = rescue.target になる
• WantedBy = default.target と指定すると当然起動する • そのサービス、レスキューモードでも必要???
WantedBy = default.target? 15 • この書き方は Red Hat Customer Portal
で見つけた • 間違っているのは私のほうではないかと疑心暗鬼になっています https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files
drop-in の意外な仕様 16 drop-in とは • /etc/systemd/system/foo.service.d に .conf ファイルを置くと
オリジナルのファイルを override できる • sudo systemctl edit foo.service を使うとエディタが起動して いい感じにしてくれる
drop-in の意外な仕様 17 • 例:ExecStopPost= を追加してサービス停止時に クリーンアップ処理を追加したい • 例:デフォルトのクリーンアップ処理を別の処理に置き換えたい #
/etc/systemd/system/foo.service.d/override.conf [Service] ExecStopPost=/usr/local/bin/foo-cleanup # /etc/systemd/system/foo.service.d/override.conf [Service] ExecStopPost= ExecStopPost=/usr/local/bin/foo-cleanup
drop-in の意外な仕様 18 man 5 systemd.unit の最後
drop-in の意外な仕様 19 man 5 systemd.unit の最後
drop-in の意外な仕様 20 • Before=, After=, Wants=, Requires= などは空行でリセットできない •
systemd-sysv-generator で自動生成されたファイルは 無駄な dependency が設定されていることがある(特に Ubuntu 16.04) • drop-in を使って直したくなるが、残念ながら使えない • 自作するか、Ubuntu 18.04 から backport してくるとよい (Ubuntu 18.04 は自動生成ではなく、ちゃんと作られていることが多い) # /etc/systemd/system/foo.service.d/override.conf [Unit] After= After=bar.service ← これはダメ