人間たちとsystemd
TRANSCRIPT
興味> Ruby / Golangを少々 > Docker / LXC > Puppet > Hashicorp tools > OpenStack > Electron / React
http://www.slideshare.net/udzura/hashicorp-tools
7 years old Rubyist> Rails 2.1.0 ごろからのルビースト(2008 ~) > Rubyをこじらせて著作あり > Web+DB Press Ruby連載(2012 ~ 2014) > パーフェクトRuby (2013) > パーフェクトRails (2014) > Web+DB Press vol. 92 新人特集号 [New!]
init(あるいはその代替)> 最初に起動して、たくさんのサービスどもを立ち上げて管理する
> CentOS 5 など … sysvinit > CentOS 6 / Ubuntu … Upstart > OS X … launchd > ……
systemdざっくり採用
ディストリサービス定義
OS縛り
cgroup/ namespace
と連携操作コマンド
init script
CentOS 5 などいろいろ
init script(Shellスクリプト)
- ない スクリプト直/service
UpstartCentOS 6 最近までのUbuntu
独自形式のconf
(/etc/init/*.conf)- ない service/initctl
systemdCentOS 7 ~
Ubuntu 15.10 ~ ほか
Unitファイル Linuxのみ やっていく systemctl
(/service)
※ Ubuntu 13.04 から利用は可能
Rethinking of PID 1> 長文だが… > ざっくり > 起動スクリプト、結局全部シェルスクリプトだったり、一個一個起動でしんどかったり、cgroupとかナウい奴との連携も大変だよね……
> そこでsystemd、という感じらしい
※ http://0pointer.de/blog/projects/systemd.html
Logging> journald というサービスが担当する > systemdの一部という扱い > サービス側は、基本はとにかく標準出力にログを出せばいい(12factor app感)
> 罠: systemd 208 では、journaldを再起動するとサービスが落ちることもある…… > CentOS 7.1 のデフォルト > CentOS 7.2でsystemd 219になり、直ってる
Unitファイル> Unitファイルはシェルスクリプトじゃない > initスクリプトみたいにulimitを書けばいいという話じゃない > ulimitはバイナリではないのでExecStartPreでキックできない、など
> バイナリひとつみたいなときは、ラッパーをかます?いやいや……
man systemd.exec
http://www.freedesktop.org/software/systemd/man/systemd.exec.html#LimitCPU=
man systemd.exec> Unitファイルに宣言的に書く→わかりやすい! > ulimitでいうどれに相当するかが書いてあって便利 > LimitCPU= ➡ ulimit -t > LimitRSS= ➡ ulimit -m > LimitNOFILE= ➡ ulimit -n
どっちがいいんだろう……> man見た感じの印象、resource-control押し。 > “Also note that LimitRSS= is not implemented on Linux, and setting it has no effect.” > ?????
> ulimitから移行しやすいようにLimit*がある感じ。 > なるべくresource-controlしたほうがいいのでは
深追い> 起動前に > ファイルシステムを unshare する > /tmp を /tmp/systemd-private-*** にバインドマウントする
> というだけ > なので正確には、mount namespaceの分離を利用している
unshare(2) とは> Linux namespaceとは > プロセスごとに、アクセスできるリソースを分けることができる機能
> unshare を呼ぶと当該プロセスで新しいネームスペースを作る(mount、ネットワーク、PID……)
その他のmount分離
> http://enakai00.hatenablog.com/entry/20130923/1379927579
そのプロセスでは> こちらも、unshareされたあと、 /etc/readonly-test をroでバインドマウントしなおしていることがわかる
> 一方、他のプロセスではそのマウントが確認できない
unshare になろう> hibomaさんという方の記事 > rubyで unshare(2) 呼び出して マウント名前空間を分離 > http://d.hatena.ne.jp/hiboma/20120518/1337337393
> 拡張ライブラリ書かなくて呼び出せるようなので便利
systemd> ただのinitの代替ではない > cgroupやLinux namespaceと結構密接に連携でき、色々な使い道がありそう > (そういえば割愛しましたが、capabilityもいじれます) > CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_RAW …
systemdのメリット所感> Unitファイルで宣言的にサービス定義、依存、リソースの配分、分離を定義できる
> cgroup/linux namespaceの詳細なAPIに詳しくなくても、systemdのディレクティブがラップしてくれるので、容易に利用できる
> systemdは人間たちに優しい!
container vs systemd> systemdだけでもできることが結構ある > できないこともある。PIDの分離とかがそう
> Dockerとsystemdの連携の例もある > http://enakai00.hatenablog.com/entry/20140427/1398576165
> 相反するものでもなく、得意分野で使い分け
参考文献> Systemd入門シリーズ (id:enakai00 さん)
> http://enakai00.hatenablog.com/entry/20130914/1379146157
> というか非常に詳しく、僕の発表要るんだろうか……
> systemd徹底入門@Linux女子部 (同) > http://www.slideshare.net/enakai/linux-27872553 > 僕の発表ry
> consul-templateをsystemdで動かすときの学び
> http://tomohisaoda.com/posts/2015/use_systemd_with_consul-template.html