人間たちとsystemd

64
systemdざっくり入門 GMO Pepabo, Inc. Uchio Kondo 2016/04/23 コンテナ型仮想化の情報交換会@福岡 人間たちとsystemd

Upload: uchio-kondo

Post on 13-Apr-2017

327 views

Category:

Technology


1 download

TRANSCRIPT

systemdざっくり入門

GMO Pepabo, Inc. Uchio Kondo

2016/04/23 コンテナ型仮想化の情報交換会@福岡

人間たちとsystemd

人間の紹介

近藤うちお> GMOペパボ所属 > 技術基盤チーム 🍮 > 福岡支社勤務

> Fukuoka.rb > RailsGirls Fukuoka #1 総合雑用/コーチまとめ

!?

興味> 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!]

Founder of

制限事項> OSなどのレイヤー、正直わかっていないし、 カーネルのコードも読んだことがありません

> 「実は……さっきから足が震えているッ……」

人間たちのためのsystemd概要

init(あるいはその代替)> 最初に起動して、たくさんのサービスどもを立ち上げて管理する

> CentOS 5 など … sysvinit > CentOS 6 / Ubuntu … Upstart > OS X … launchd > ……

init script

Upstart

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

systemdを 使ってみる

Unitファイル> 独自形式(ini風) > 宣言的 > 「target」「mount」「service」「device」などの種類がある

> Unit同士は依存関係がある

例: バイナリ一個のサービス

例: バイナリ一個のサービス

説明のほか、依存するUnitファイル、起動順序を記述

コマンド、実行ユーザー、前後に発行するコマンド、環境変数、

cgroupsの制限など

ランレベル相当を記述

例: 定期実行タイマー

Logging> journald というサービスが担当する > systemdの一部という扱い > サービス側は、基本はとにかく標準出力にログを出せばいい(12factor app感)

> 罠: systemd 208 では、journaldを再起動するとサービスが落ちることもある…… > CentOS 7.1 のデフォルト > CentOS 7.2でsystemd 219になり、直ってる

systemdとリソース制限

ulimit> リソースをいい感じに制限するやつ > CPU、メモリ、ファイルディスクリプタ数……

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

セットするとどうなる?

こういう感じになる> 無事、CPUを10秒占有した後killされる

もう一つの方法> man systemd.resource-control

cgroupとの 連携

systemd-cgtop

CPUQuota= してみましょう

なるほど

へ~

cgroupなので> 動的にリソースの利用率を変更することも可能 > demoします

どっちがいいんだろう……> man見た感じの印象、resource-control押し。 > “Also note that LimitRSS= is not implemented on Linux, and setting it has no effect.” > ?????

> ulimitから移行しやすいようにLimit*がある感じ。 > なるべくresource-controlしたほうがいいのでは

systemdと ファイルシステムの“分離”

PrivateTmp設定

自動でディレクトリができる

※ サービスを落とすとディレクトリも消える

サービス側では/tmp

深追い> 起動前に > ファイルシステムを unshare する > /tmp を /tmp/systemd-private-*** にバインドマウントする

> というだけ > なので正確には、mount namespaceの分離を利用している

unshare(2) とは> Linux namespaceとは > プロセスごとに、アクセスできるリソースを分けることができる機能

> unshare を呼ぶと当該プロセスで新しいネームスペースを作る(mount、ネットワーク、PID……)

systemdの例

mnt のネームスペース だけが変わっている

ことがわかる

その他のmount分離

> http://enakai00.hatenablog.com/entry/20130923/1379927579

ReadOnlyDirectries

そのプロセスからは変更できない> 一方で、他のプロセスからは可能

そのプロセスでは> こちらも、unshareされたあと、 /etc/readonly-test をroでバインドマウントしなおしていることがわかる

> 一方、他のプロセスではそのマウントが確認できない

もう少しだけ 深追い

unshare になろう> hibomaさんという方の記事 > rubyで unshare(2) 呼び出して マウント名前空間を分離 > http://d.hatena.ne.jp/hiboma/20120518/1337337393

> 拡張ライブラリ書かなくて呼び出せるようなので便利

irbでやろう

irbでやろう

総括

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

> 相反するものでもなく、得意分野で使い分け

Try! systemd

参考文献> 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