More Related Content Similar to Lxc で始めるケチケチ仮想化生活?! (20) More from Etsuji Nakai (20) Lxc で始めるケチケチ仮想化生活?!2. LXCで始めるケチケチ仮想化生活?!
自己紹介
中井悦司(なかいえつじ)
– Twitter @enakai00
日々の仕事
– Senior Solution Architect
and Cloud Evangelist at Red Hat K.K.
企業システムでオープンソースの活用を希望される
お客様を全力でご支援させていただきます。 好評発売中
昔とった杵柄
– 素粒子論の研究(超弦理論とか)
– 予備校講師(物理担当)
– インフラエンジニア(Unix/Linux専門)
2 Open Cloud Campus
5. LXCで始めるケチケチ仮想化生活?!
よくあるサーバ仮想化の分類
基本的には「物理マシン」と同等の「仮想マシン」を複数
ハードウェアによる仮想化
作り出す技術です。
(物理マシンにハイパーバイザを内蔵)
ゲスト ゲスト ゲスト ゲスト
OS OS OS OS
非仮想化環境 仮想 仮想 仮想 仮想
マシン マシン マシン マシン
OS ハイパーバイザ(ファームウェア)
物理マシン
物理マシン
Power Systems, Virtage など
ソフトウェアによる仮想化 ソフトウェアによる仮想化
(物理マシン上にハイパーバイザを導入) (ホスト OS にハイパーバイザ機能を追加)
ゲスト ゲスト ゲスト ゲスト ゲスト ゲスト ゲスト
OS OS OS OS OS OS OS
仮想 仮想 仮想 仮想 仮想 仮想 仮想
マシン マシン マシン マシン マシン マシン マシン
ハイパーバイザ(ソフトウェア) ハイパーバイザ
(カーネルモジュール)
物理マシン
ホスト OS
VMware vSphere, Xen など
物理マシン
Linux KVM
5 Open Cloud Campus
6. LXCで始めるケチケチ仮想化生活?!
コンテナ型仮想化とは
OSの内部は、物理リソースを管理するカーネル空間とユーザプロセス(アプリケーション)
を実行するユーザ空間に分かれます。
コンテナ型仮想化は、カーネルの機能により、複数のユーザ空間を作り出すことで、ユーザ
プロセスから見えるリソースを分割します。リソースによって分割方法は異なります。(以
下はLXCの例)
– プロセスリスト、ホストネーム、OSユーザ、ネットワーク、ファイルシステム、コンソールなど
⇒ コンテナごとに異なる内容が見える
– CPU、メモリ、デバイス(/dev/*)
⇒ 物理マシン全体の情報が見えるが、cgroupsでコンテナごとに利用範囲を制限
コンテナ型仮想化
非仮想化環境
ユーザ空間 ユーザ空間
ユーザ空間
ユーザプロセス
ユーザプロセス
ユーザプロセス
ユーザプロセス
ユーザプロセス
ユーザプロセス
ユーザプロセス
・・・
OS
・・・
カーネル空間
カーネル空間
物理マシン
物理マシン
6 Open Cloud Campus
9. LXCで始めるケチケチ仮想化生活?!
LXCのリソース分割 (1/4) ~ プロセステーブル
各コンテナのプロセスは、同じLinuxカーネルで実行されます。 ユーザ空間 ユーザ空間
– Linux以外のOSをコンテナで実行することはできません。
ユーザプロセス
ユーザプロセス
ユーザプロセス
ユーザプロセス
・・・
プロセステーブルはコンテナごとに独立しているので、他のコンテ
ナのプロセスは見えません。
– コンテナ外部にあたるホストLinux上では全てのプロセスが見えます。 カーネル空間
物理マシン
– ホストLinux上のプロセステーブルでは、コンテナに属するプロセスに
は、コンテナ名ラベルが付与されます。
ホストLinuxのプロセステーブル (コンテナ内部ではそのコンテナに属するプロセスしか見えない)
# lxc-ps -ef
CONTAINER UID PID PPID C STIME TTY TIME CMD
root 1 0 0 Jun03 ? 00:00:00 /sbin/init
root 2 0 0 Jun03 ? 00:00:00 [kthreadd]
...
root 10258 1 0 10:30 ? 00:00:00 lxc-start -n 005 -d
005 root 10266 10258 0 10:30 ? 00:00:00 /sbin/init
root 10268 1 0 10:30 ? 00:00:00 lxc-start -n 006 -d
006 root 10278 10268 0 10:30 ? 00:00:00 /sbin/init
006 root 10801 10278 0 10:30 ? 00:00:00 /sbin/rsyslogd -c 4
...
005 root 10989 10266 0 10:30 ? 00:00:00 crond
005 root 11027 10266 0 10:30 pts/4 00:00:00 /sbin/agetty /dev/console 38400 vt100-nav
...
root 14452 12337 0 14:20 pts/3 00:00:00 lxc-start -n 003
003 root 14455 14452 0 14:20 ? 00:00:00 /sbin/init
003 root 14626 14455 0 14:20 ? 00:00:00 /sbin/rsyslogd -c 4
9 Open Cloud Campus
10. LXCで始めるケチケチ仮想化生活?!
LXCのリソース分割 (2/4) ~ ファイルシステム
ファイルシステムをマウント
# ls -l /lxc/rootfs/
合計 28
コンテナごとに特定ディレクトリに
コンテナごとのルート
drwxr-xr-x 2 root root 4096 5月 28 13:53 2011 001
chrootします。 drwxr-xr-x 2 root root 4096 5月 28 15:13 2011 002
dr-xr-xr-x. 23 root root 4096 5月 30 12:41 2011 003
– 昔ながらのchroot jailと同じです。 dr-xr-xr-x. 24 root root 4096 5月 31 13:13 2011 004
dr-xr-xr-x. 24 root root 4096 5月 31 13:13 2011 005
– コンテナごとのルートファイルシステ dr-xr-xr-x. 24 root root 4096 5月 31 13:13 2011 006
ムを任意のディレクトリにマウントし dr-xr-xr-x. 23 root root 4096 5月 30 12:41 2011 007
ておきます。 # ls -l /lxc/rootfs/003
合計 104
コンテナで特定デーモンだけを動か dr-xr-xr-x. 2 root root 4096 5月 25 20:24 2011 bin
drwxr-xr-x. 2 root root 4096 5月 25 20:22 2011 boot
す場合 drwxr-xr-x. 2 root root 4096 7月 14 20:45 2010 cgroup
drwxr-xr-x. 2 root root 4096 5月 25 20:22 2011 dev
⇒ 昔ながらのchroot jail風の使い方 drwxr-xr-x. 57 root root 4096 6月 4 14:20 2011 etc
drwxr-xr-x. 3 root root 4096 5月 29 05:35 2011 home
– デーモンの稼働に必要なファイルだけ dr-xr-xr-x. 8 root root 4096 5月 25 20:24 2011 lib
があればOKです。 dr-xr-xr-x. 7 root root 12288 5月 25 20:24 2011 lib64
drwx------. 12 root root 16384 5月 25 20:22 2011 lost+found
drwxr-xr-x. 2 root root 4096 12月 4 22:33 2009 media
コンテナでゲストOSをまるごと動か drwxr-xr-x. 2 root root 4096 12月 4 22:33 2009 mnt
す場合 drwxr-xr-x. 5 root root 4096 5月 31 11:48 2011 opt
drwxr-xr-x. 2 root root 4096 5月 25 20:22 2011 proc
⇒ サーバ仮想化風の使い方 dr-xr-x---. 5 root root 4096 5月 31 13:01 2011 root
dr-xr-xr-x. 2 root root 4096 5月 25 20:25 2011 sbin
– ゲストOSのルートファイルシステムを drwxr-xr-x. 2 root root 4096 5月 25 20:23 2011 selinux
まるごとマウントします。 drwxr-xr-x. 2 root root 4096 12月 4 22:33 2009 srv
drwxr-xr-x. 2 root root 4096 5月 25 20:22 2011 sys
– KVMのゲストOSイメージファイルを drwxrwxrwt. 2 root root 4096 6月 4 14:18 2011 tmp
loopマウントして利用するなどもあり drwxr-xr-x. 14 root root 4096 5月 29 05:33 2011 usr
drwxr-xr-x. 17 root root 4096 5月 25 20:23 2011 var
です。
10 Open Cloud Campus
11. LXCで始めるケチケチ仮想化生活?!
LXCのリソース分割 (3/4) ~ ネットワーク
各コンテナには、仮想NIC(veth)をアサインして、ホストOSの物理NICにブリッジ接続し
ます。
– vethはLinuxカーネルが標準で提供する機能です。2つのvethのペアを(クロスケーブルで直結した
かのように)接続して、同じサーバ上のプロセス間で擬似的なネットワーク通信を実現します。
LXCではvethペアの一方をコンテナ内部に見せて、もう一方を仮想ブリッジに接続すること
で、コンテナ内部と外部ネットワークを接続します。
– コンテナ内部ではデバイス名をeth0に書き換えています。
※ KVMの仮想ネットワーク環境と似ていますが、KVMではTAPデバイスを使用する点が異なります。
LXCでの実際のvethの使い方
vethの基本的なイメージ (コンテナ内部と物理NICをブリッジ接続)
プロセス A プロセス B
コンテナ内部 コンテナ内部
eth0 eth0
仮想ブリッジ
(vethY) (vethZ)
veth0 veth1
vethX
eth0 eth0 br0
vethW
外部ネットワーク 外部ネットワーク
11 Open Cloud Campus
12. LXCで始めるケチケチ仮想化生活?!
LXC のリソース分割 (4/4) ~ CPU / メモリ / デバイス
CPU/メモリ/デバイス(/dev/*)は、全てのコンテナから物理サーバ全体のリソースが見
えます。
– Control Groups (cgroups)を利用して、各コンテナで実際に利用できるCPU/メモリ/デバイスを設
定します。
– cgroupsの説明はこちらを参照: http://d.hatena.ne.jp/enakai00/20110605/1307240161
次のような設定が可能です。
– コンテナが使用するCPUコア(cpuset.cpus)
⇒ CPUコアの番号を指定。
– CPUの優先順位 (cpu.shares)
⇒ 2~262144を指定。値に比例した実行時間が与えられる。
– メモリ使用量の上限 (memory. limit_in_bytes, memory. memsw.limit_in_bytes)
⇒ 物理メモリ、および、物理メモリ+Swapの上限を指定。
– IOの優先順位 (blkio.weight)
⇒ 100~1000 を指定。値に比例したIO処理時間が与えられる。
– ネットワーク帯域の指定 (net_cls.classid)
⇒ 送出パケットに「クラスラベル」を付与する。クラスラベルに対応する帯域はtcコマンドによる設定が必要。
– アクセスを許可するデバイス (devices.deny, devices.allow)
⇒ Major, Minor番号でアクセスを許可するデバイスを指定。
12 Open Cloud Campus
13. LXCで始めるケチケチ仮想化生活?!
コンテナ設定ファイルの例
# cat /lxc/conf/001.conf
# network configuration
lxc.utsname = 001
lxc.network.type = veth
lxc.network.name = eth0
ネットワーク構成 lxc.network.flags = up
lxc.network.link = br0
lxc.network.ipv4 = 192.168.122.101/24
# file system configuration
lxc.rootfs = /lxc/rootfs/001
lxc.mount.entry=/dev /lxc/rootfs/001/dev/ none bind 0 0
ルートファイルシステムと lxc.mount.entry=devpts /lxc/rootfs/001/dev/pts devpts
特殊ファイルシステムの指定 gid=5,mode=620,newinstance,ptmxmode=0666 0 0
lxc.mount.entry=proc /lxc/rootfs/001/proc proc nodev,noexec,nosuid 0 0
lxc.mount.entry=sysfs /lxc/rootfs/001/sys sysfs defaults 0 0
lxc.mount.entry=none /lxc/rootfs/001/proc/sys/fs/binfmt_misc binfmt_misc defaults 0 0
# resource allocations
cgroupsによる lxc.cgroup.cpuset.cpus = 0
lxc.cgroup.cpu.shares = 512
CPU/Memory配分の指定 lxc.cgroup.memory.limit_in_bytes = 268435456
lxc.cgroup.memory.memsw.limit_in_bytes = 536870912
# device access list
lxc.cgroup.devices.deny = a *:* rwm
lxc.cgroup.devices.allow = c 1:11 rwm
lxc.cgroup.devices.allow = c 1:3 rwm
lxc.cgroup.devices.allow = c 1:5 rwm
cgroupsによる lxc.cgroup.devices.allow = c 5:1 rwm
デバイスアクセスの制限 lxc.cgroup.devices.allow = c 5:0 rwm
lxc.cgroup.devices.allow = c 4:* rwm
lxc.cgroup.devices.allow = c 1:9 rwm
lxc.cgroup.devices.allow = c 1:8 rwm
lxc.cgroup.devices.allow = c 5:2 rwm
lxc.cgroup.devices.allow = c 136:* rwm
13 lxc.cgroup.devices.allow = c 254:0 rwm Open Cloud Campus
14. LXCで始めるケチケチ仮想化生活?!
なにはともあれ動かしてみる
コンテナ操作の基本コマンド
– コンテナ作成 # lxc-create -n <コンテナ名> -f <コンテナ設定ファイル>
– コンテナ開始 # lxc-start -n <コンテナ名> [-d]
– コンテナ停止 # lxc-stop -n <コンテナ名>
– コンテナ削除 # lxc-destroy -n <コンテナ名>
※ 詳細手順はこちらを参照 http://d.hatena.ne.jp/enakai00/20110529/1306658627
コンテナ実行時の注意点
– コンテナでゲストOSを起動すると、おもむろ
に/sbin/initが実行されて、ユーザ空間の起
動シーケンスが始まります。
(/etc/rc.sysinitなど、物理環境を操作する
設定ファイルは事前に修正が必要です。)
– コンテナを安全に(お行儀よく)停止する時
は、ゲストOSでpoweroffを実行します。
– メモリ使用量の上限に達するとコンテナ内の
プロセスが強制停止します。最悪、コンテナ
全体が停止するので、コンテナのメモリ使用
量には注意を払って下さい。
※ ホストOSで次のコマンドによりコンテナのメモリ使用量が分かります。
# lxc-cgroup -n <コンテナ名> memory.usage_in_bytes (物理メモリ使用量)
# lxc-cgroup -n <コンテナ名> memory.memsw.usage_in_bytes (物理メモリ+Swap使用量)
14 Open Cloud Campus
16. LXCで始めるケチケチ仮想化生活?!
Hodoop on LXC (on KVM)
実機デモをご覧下さい・・・・。
– KVMゲストの上でLXCを使ってHadoopクラスタを構成します。
LXCを使えば、Amazon EC2のVMを1 個だけ借りて、Hadoopクラスタを構成することもで
きるはずです (*)。
– 性能面では考慮が必要ですが、機能検証などには利用できるかも?
– OpenStackなどオープンソースのクラウドソフトウェアも LXC への対応をすすめています。
(*)【AWS発表】 Red Hat Enterprise LinuxをAmazon EC
上で時間課金で利用可能に http://bit.ly/ivDH7i
16 Open Cloud Campus