8 lxc コンテナ使てみる

まえだこうへ

PIC
____________________________________________________________________

Debian されているそろそろ Xen KVM かないのかたなネタめているきが多い かといますそこでLinux Kernel たにされた能を使しているlxc というについ します

8.1 はじめに

8.1.1 lxc

lxc*5 名称Linux Containers コンテナ働するためのネル能とコンテナするためのと ザツからされますlxc 使している Kernel (Control Group, 以下 Cgroup ) kernel 2.6.29 されネルててビルドする必要がなくなてなてい ますkernel 2.6.29 よりネルではkernel 2.6.27 であればてれば使うことができ ます

lxc GPL2 ライセンスされていて発およびメンテナンスDaniel Lezcano 実質てい ます

Debian ではSqueeze/Sid からされており *6 と な て い ま す

8.1.2 他のコンテナとの

コンテナというと有名なのはSolaris Containers FreeBSD jail がありますがLinux では Linux-VServer, OpenVZ*7 どがありますいずれも使たことがある多いのではないのでしうか

lxc されるビスきく分類してシステムコンテナアプリケンコンテナ2 つがあります いわゆる OS まるごとのですinit から動してOS しますchroot によるアプリ 分離にいです単一アプリケ分離するだけなのでとてもシンプルなのが です

lxc 発・メンテナンスされており今後プロジクトがどうなるのかえないところではあります 現在リングリストているりでは発は続いているようです

8.2 導入してみる

8.2.1 スコする

ザスペスコSourceForge にありますスコgit されておりgit ポジトリからできます

$ git clone git://lxc.git.sourceforge.net/gitroot/lxc/lxc

Debian ではのとおりSqueeze/Sid になてい *8 である必要がなければスコ必要ありません

8.2.2 ネルオプシ有効にする

lxc 能をフルするには以下ネルオプシ有効になている必要があります

* General
  * Control Group support
    -> namespace cgroup subsystem
    -> cpuset support
    -> Group CPU scheduler
    -> control group freeze subsystem
    -> Basis for grouping tasks (Control Groups)
    -> Simple CPU accounting
    -> Resource counters
    -> Memory resource controllers for Control Groups
    -> Namespace support
    -> UTS namespace
    -> IPC namespace
    -> User namespace
    -> Pid namespace
  * Network support
    -> Networking options
      -> Network namespace support

これらが有効になているかを認するにはlxc スツリまれているsrc/lxc/lxc-checkconfig.in という スクリプトすれば現在動中ネルでどのネルオプシ無効になているかをでき ます

またDebian では/usr/bin/lxc-checkconfig としてインストされていますSqueeze/Sid Debian ネル *9 使ている認すると以下になりますCgroup memory controller のみが無効になているよう です

$ lxc-checkconfig
Kernel config /proc/config.gz not found, looking in other places...
Found kernel config file /boot/config-2.6.30-2-amd64
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup namespace: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: disabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
File capabilities: enabled
8.2.3 Debian でのインスト

ここからSqueeze/Sid 使うことをとしてめますがこのままではcgroup でのメモリ 無効になていますのでネルオプシCONFIG_CGROUP_MEM_RES_CTLR有効にしてリビルド してくださいそれDebian lxc 使うために必要かというと lxc だけ です

$ sudo apt-get install lxc

これでアプリケンコンテナすことはできますREADME にもているですがコマンドする 即席コンテナ動できます

$ uname -a
Linux silicon 2.6.32 #1 SMP Sun Dec 6 02:30:30 JST 2009 x86_64 GNU/Linu
$ sudo lxc-execute -n hoge -f ./lxc-macvlan.conf /bin/bash
# uname -a
Linux alpha 2.6.32 #1 SMP Sun Dec 6 02:30:30 JST 2009 x86_64 GNU/Linux

他のコンソからコンテナ動しているか認してみます

$ sudo lxc-info -n hoge
’hoge’ is RUNNING
$ lxc-ps -n hoge
CONTAINER    PID TTY          TIME CMD
            4747 pts/3    00:00:00 bash
            5692 pts/3    00:00:00 lxc-ps
            5693 pts/3    00:00:00 ps

んと認できましたねこれでですいたいところですがこのコンテナ動させただけでし かなくきり立ちませんbash sudo 動しているだけでホスト OS イルシステムにもアクセス できてしまいます

コンテナだけを動させて足、 はい了とするのであればいかもしれませんがlxc しようとえて いるならげる他のインストさらにコンテナクロ必要があり ます

クロDebian 単にるための方法します *10

8.2.4 トワ

ブリ

必要インストしたらまずはブリ必要があります/etc/network/interfaces 直接 をすればいといますがルスクリプトしてそれを post-up させればいで

#!/bin/sh

brctl addbr br0                             <-  ブリジデバイス
brctl setfd br0 0                           <-  ブリジデバイス br0 
ifconfig br0 192.168.0.1 promisc up
brctl addif br0 eth0
ifconfig eth0 0.0.0.0 up
route add -net default gw 192.168.0.254 br0 <-  ホスト OS  トウ

interfaces 以下のようにします

$ cat /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
allow-hotplug eth0
iface eth0 inet static
address 192.168.0.101
netmask 255.255.255.0
broadcast 192.168.0.255
pre-up  /etc/init.d/iptables start
post-up /etc/network/if-up.d/brctl.sh

のあとブリがきちんとされているか認してみると以下のようになります

$ /usr/sbin/brctl show
bridge name bridge id STP enabled interfaces
br0 8000.00wwwwyyyyxxno eth0
veth0_14820
veth0_15932
veth0_17164

ちなみに “veth0_” ろのコンテナ動した init プロセスプロセス ID です

IP NAT

ホスト OS コンテナコンテナホスト OS トワコンテナでのだけでなくIP NAT をする必要がありますえばコンテナ動後ホスト OS から ssh ログインするのにもIP 必要となります

$ sudo bash -c ‘‘echo 1 > /proc/sys/net/ipv4/ip_forward’’

IP するととでホスト OS トワへのコンテナ同士えるようにはなり ます*11

ホスト OS トワからはこのままではアクセスできませんアクセスするにはホスト OS トフングNAT などを必要がありますトフングうのであれば以下のような します

iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp --dport 80 -i br0 -j DNAT --to 192.168.0.101
iptables -t nat -A PREROUTING -d 192.168.0.1 -p tcp --dport 5984 -i br0 -j DNAT --to 192.168.0.102

ここでのデフルトポリシACCEPT であることをにしていますがにはDROP するといますのでFORWARD などもする必要がありますNetfilter IP ングスクリプトにして/etc/network/interface pre-up としてしておくといで

なおFORWARD インデフルトポリシACCEPT であるありませんがDROP REJECT してあるコンテナ同士でのはできませんFORWARD インでの ACCEPT 必要になり ます

8.2.5 システムコンテナ

ではシステムコンテナイメしてみますlxc まれる/usr/share/doc/lxc/examples/lxc-debian.gz 使Debian システムコンテナします

まずこのイルムデレクトリなどで張します

$ zcat /usr/share/doc/lxc/examples/lxc-debian.gz > ~/lxc-debian

cgroup イルシステムマウントします/etc/fstab しますマウントポイント任意場所 いません

cgroup  /var/local/cgroup  cgroup  defaults  0  0

したらマウントポイントレクトリマウントします

$ sudo mkdir /var/local/cgroup
$ sudo mount cgroup

それではほどの lxc-debian スクリプト使コンテナイメしますこのスクリプトでは debootstrap 使イメされますがストリビlenny になていますした Squeeze/Sid ですのでコンテナSqueeze/Sid ければコンテナイメする予めスクリプト え て お く 必 要 が あ り ま す ま た デ フ ル ト apache2 インストされたり sudo vi, dig コマンド無かたりするのでそのままインストすると不便であたりする ので予めインストするしておく必要がありますlxc-debian スクリプト debootstrap コマンド--includeオプシできますまたsshd トワ予めしておくと便です以下更済イルとの diff しておき ます

$ diff -u  a/lxc-debian b/lxc-debian
--- a/lxc-debian 2009-11-30 21:22:59.000000000 +0900
+++ b/lxc-debian 2009-10-30 17:58:20.000000000 +0900
@@ -8,8 +8,8 @@
 MNTFILE=
 TMPMNTFILE=
 UTSNAME=
-IPV4="172.20.0.21"
-GATEWAY="172.20.0.1"
+IPV4="192.168.0.101"
+GATEWAY="192.168.0.1"
 MTU="1500"

 # These paths are within the container so do not need to obey configure prefixes
@@ -99,14 +99,14 @@
 SyslogFacility AUTH
 LogLevel INFO
 LoginGraceTime 120
-PermitRootLogin yes
+PermitRootLogin no
 StrictModes yes
 RSAAuthentication yes
 PubkeyAuthentication yes
 IgnoreRhosts yes
 RhostsRSAAuthentication no
 HostbasedAuthentication no
-PermitEmptyPasswords yes
+PermitEmptyPasswords no
 ChallengeResponseAuthentication no
 EOF
 }
@@ -259,8 +259,8 @@
          # download a mini debian into a cache
  echo "Downloading debian minimal ..."
  debootstrap --verbose --variant=minbase --arch=$ARCH \
-     --include ifupdown,locales,libui-dialog-perl,dialog,apache2,netbase,net-tools,iproute,openssh-server \
-     lenny $CACHE/partial-$ARCH http://ftp.debian.org/debian
+     --include ifupdown,locales,libui-dialog-perl,dialog,sudo,vim-tiny,dnsutils,netbase,net-tools,iproute,openssh-server \
+     sid $CACHE/partial-$ARCH http://cdn.debian.or.jp/debian

  RESULT=$?
  if [ "$RESULT" != "0" ]; then

それではコンテナしますコンテナする場所任意場所にできますlxc-debian スクリプト したレクトリdebian レクトリ動的にそのコンテナイメである rootfs されま したいレクトリ無ければそのレクトリ動しsudo lxc-debian create ます

$ sudo mkdir /var/cache/lxc
$ cd /var/cache/lxc
$ sudo bash /home/kohei/lxc-debian create
What is the name for the container ? [debian] hoge                 <-  コンテナ名前
What hostname do you wish for this container ? [hoge]              <-  コンテナホスト
What IP address do you wish for this container ? [192.168.0.101]   <-  コンテナ IP アドレス
What is the gateway IP address ? [192.168.0.1]                     <-  コンテナからデフルトゲトウアドレス
What is the MTU size ? [1500]
Specify the location of the rootfs [./rootfs.hoge]
Specify the location for an extra fstab file [(none)]
(snip)
Choose your architecture
1) amd64
2) i386
#? 1                                                               <- Core 2 Duo  マシンなのでキテクチ amd64  選択
Architecture amd64 selected
Checking cache download ...Found.
Copying rootfs ...Done.
(snip)
update-rc.d: using dependency based boot sequencing
Done.

You can run your container with the ’lxc-start -n hoge’

これで/var/cache/lxc/debian/rootfs.hoge という名前コンテナイメレクトリされここに debootstrap による Debian イメコピされますめて lxc-debian create するとdebootstrap ダウンロされるイメ/var/cache/lxc/debian/rootfs-architecture としてされます *12

コンテナメタ/var/lib/lxc レクトリコンテナ名のレクトリ以下にありますツリ表示すると以下 のようになています

$ tree hoge/
couchdb/
|-- cgroup
|-- config
|-- fstab
|-- init
|-- network
|   ‘-- veth0
|       |-- ifindex
|       |-- link
|       |-- mtu
|       |-- name
|       ‘-- up
|-- nsgroup -> /var/local/cgroup/hoge
|-- pts
|-- rootfs
|   ‘-- rootfs -> /var/cache/lxc/debian/rootfs.hoge
|-- state
|-- tty
‘-- utsname

5 directories, 13 files
8.2.6 システムコンテナ

システムコンテナ動のやることがありますコンテナイメログイン能なザアカウ ントすることと/etc/hosts えることですコンテナにそのまま させたのではログインすることができませんホスト OS 側と同じザアカウントなけれ /var/cache/lxc/debian/rootfs.hoge/etc/レクトリpasswd, shadow, group ホストのそれで上書きしておくと でし*13 コンテナ名前的ですではコンテナ/etc/hosts 律、

127.0.0.1 localhost
127.0.1.1 ホスト OS ホスト

となており2 /etc/hostname なるためザアカウントてもログイン名前 てしまいますですので予めホスト OS ホスト名になている部分コンテナホスト名にえておく必要がある わけです*14

えたらシステムコンテナ動しますシステムコンテナ動はlxc-start コマンド使います つの複数コンテナ動できるのでコンテナ名の必ず必要ですコンテナ名のにはオプシ-n 使 います

$ sudo lxc-start -n hoge

このまま動させると現在でそのままコンテナコンソ表示されますログインするにはその ままコンソルログインすればいでしクグラウンド動させるには-d オプシをつけ ます

$ sudo lxc-start -n hoge -d

KVM Xen などのようにネルから動させるではなくinit プロセスから動させるので動完了までにする はわずかです

8.3 lxc みをてみる

8.3.1 コンテナライフサイクル

Linux コンテナライフサイクル他のきくなるところはなくになります

PIC

このでのさせるためのコマンドつまりコンテナするためのコマンド以下りです





status

コマンド

行後









コンテナ

lxc-start

STARTING, RUNNING

システムコンテナ

lxc-execute

アプリケンコンテナ





コンテナ

lxc-freeze

FROZEN





コンテナ

lxc-unfreeze

RUNNING





コンテナ

lxc-stop

STOPPING, STOPPED





コンテナ

lxc-restart

STOPPING, STOPPED

STARTING, RUNNING





コンテナ

lxc-create

STOPPED

lxc-debian lxc-create

lxc-fedora, lxc-sshd なども同様





コンテナ

lxc-destroy





8.3.2 リソする

lxc ではコンテナリソするためにcgroup というネル能を使ていますcgroup とはControl group 略ですLinux Kernel プロセス単位でのリソていましたcgroup 使うと同じ cgroup 属しているプロセスでのリソ有ができますlxc ではlxc-cgroup コマンドコンテナリソ 表示したりすることができます

する
cgroup 表示するlxc-cgroup -n コンテナ名 変するにはsudo lxc-cgroup -n コンテナ名変名 設するとします

えばCPU リソてにはcpu.shares というパラメいますがあるコンテナてられている 率を算出するには任意コンテナcpu.shares / コンテナcpu.share する必要があります には現在コンテナcpu リソ認すると

$ lxc-ls
couchdb  git  hoge  octave  w3m  web
$ for i in ‘lxc-ls‘; do echo -ne $i"\t"; lxc-cgroup -n $i cpu.shares; done
couchdb 2048
git 1024
hoge 1024
octave 1024
w3m 1024
web 1024

7168 コンテナcouchdb 28.6%他のコンテナ14.3% ごとの率で CPU リソする ということ分かります

コンテナ全体リソ
lxc-cgroup コマンドコンテナ的にする必要があるのでcgroup 全体での使率などを るには不便ですcgroup されるリソ 8.2.5マウントしたcgroup イルシステムからアクセスすることもでき ますマウントポイント/var/local/cgroup にしているのでこのレクトリてみると以下になていま *15

$ cd /var/local/cgroup
$ ls -F
couchdb/               cpuset.memory_pressure           git/
cpu.shares             cpuset.memory_pressure_enabled   hoge/
cpuacct.stat           cpuset.memory_spread_page        net_cls.classid
cpuacct.usage          cpuset.memory_spread_slab        notify_on_release
cpuacct.usage_percpu   cpuset.mems                      octave/
cpuset.cpu_exclusive   cpuset.sched_load_balance        release_agent
cpuset.cpus            cpuset.sched_relax_domain_level  tasks
cpuset.mem_exclusive   devices.allow                    w3m/
cpuset.mem_hardwall    devices.deny                     web/
cpuset.memory_migrate  devices.list

/var/local/cgroup レクトリ以下にある“xxx.yyyy” をとているのがcgroup するリソ レクトリ直下システム全体リソですhoge/などのレクトリがありますがこれはコンテナ てられているリソですですのでこのレクトリ使lxc 全体コンテナリソうこと ができます

8.4 まとめ

Linux Kernel 標準能だけを使コンテナであるLinux Containers についてしましたまだまだ能的には 分なところもあり発体なところはありますがネルパ適用せずにせるでは使 るのではないかといます

またlxc libvirt サポにもなていますlibvirt えるかしてみたと ころイルるところまではできたもののvirsh コネクトするとうまくリソアクセス できないといもありますがやることが多いのでするにはネタになるのではないでし うか

8.5 文献

____________________________________________________________________________________________

PIC Debian

2009 12 12   1 発行
エ リ ア Debian 発行
__________________________