それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

LXCのコンテナ環境をぱぱっと作る。(debian apt)

LXC 環境を作る

そろそろ、LXCも枯れて来た存在になったし。Systemdとcgroup関連のゴタゴタもなさそうなのでOpenVZをやめて、LXCも使おうと思い立つ。

LXCのサポートはDebian 9 Strechでまた変化するっぽい

Debian Wikiを眺めていたら、lxc-net などのサポートコマンドがDebian9かららしい。

Debian のStableリリースでコマンド群や設定がCompatibleで一度書いたらずっと使えるようになるのは、もう少し先かな?

LXC 関連インストール

今回はJessieに突っ込むことにする。

 sudo apt install lxc debootstrap bridge-utils libvirt-bin

debootstrapを使うのは少し意外だった。このあたりもう少し汎用的になると嬉しいんだけど。

環境確認

cgroup を使うので、カーネルバージョンに注意する。

/sys/fs で cgroup が使えていることを確認・

takuya@:~$ mount | grep sys | grep cgruop
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset,clone_children)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)

もしない場合は/etc/fstab/ に追記する

cgroup  /sys/fs/cgroup  cgroup  defaults  0   0
mount /sys/fs/cgroup

動作確認

インストールが終わったら、無事に動いてるか確認する。enable で緑色になってたらオッケ。簡単になったねぇ。

takuya@:~$ sudo lxc-checkconfig
Kernel configuration not found at /proc/config.gz; searching...
Kernel configuration found at /boot/config-3.16.0-4-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 clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

テンプレートを初期化してインストール

lxc-create -n my-lxc-debian-01 -t debian -- -r jessie

Debianのサイトからテンプレートを持ってきて初期化してくれる。ここも楽ちん。ここで使われるdebootstrap 偉大だわ。

パスワードをメモっておく。

特に初期設定値を何も入れてないので、rootパスワードが画面に表示されるのでそれをコピっておく。

lxc-ls で一覧を閲覧

完成したら ls で見れる

$ sudo lxc-ls
my-lxc-debian-01 

インストールが終わったら起動

起動する。

$ sudo lxc-start my-lxc-debian-01 

これで、無事に起動する

起動すると、pts tty1経由で接続される。

接続は screen っぽい

接続と切断は 以下の通り

  • Ctrl + a q
Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself

と出てくるので、GNU screen みたいな感じですね。っていうか、screenだろこれ・・・

切断後の再接続

sudo lxc-console コマンドを使って、コンソールに接続できる。

 sudo lxc-console --name my-lxc-debian-01

Connected to tty 1


Debian GNU/Linux 8 my-lxc-debian-01  tty1

my-lxc-debian-01  login:

ネットワーク設定

lxc-net を使うと楽なのですが、今回はkvm もあることだし、 libvirt経由にします。

ホスト側の設定

$ sudo virsh net-start default
$ sudo ip addr show virbr0

起動時にvirbr0 が起動するようにしておく

# virsh net-autostart default

コンテナ設定ファイルに追記

sudo -e /var/lib/lxc/$NAME/config

以下を追記

lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = virbr0
lxc.network.hwaddr = 00:FF:AA:00:00:01
lxc.network.ipv4 = 0.0.0.0/24

あとはrestart すれば、ネットワークに繋がる。

lxc の作成される先などディレクトリ構成

設定は /var/lib/lxc/$NAME/config に作られる。

/var/lib/lxc/ に各種のファイルが設置される。

/etc/lxc/auto/自動起動などの設定ファイルが置かれる。設定ファイルでlxc.start.auto = 1をしたうえで、/etc に設置すると、どこにLXCの設定を書いても動き出すとのこと。

デフォルトだと、ルートシステムは /var/lib/lxc/$NAME/rootfs に作られていた。

基本的な設定

設定ファイルは次のようになっていた。

# Template used to create this container: /usr/share/lxc/templates/lxc-debian
# Parameters passed to the template: debian-lxc01 -r jessie
# For additional config options, please look at lxc.container.conf(5)
lxc.network.type = empty
lxc.rootfs = /var/lib/lxc/my-lxc-debian-01/rootfs

# Common configuration
lxc.include = /usr/share/lxc/config/debian.common.conf
lxc.mount = /var/lib/lxc/ame/fstab
lxc.utsname = my-lxc-debian-01
lxc.arch = amd64
lxc.autodev = 1
lxc.kmsg = 0

template とデフォルト設定。

template は /usr/share/lxc/templates/ に作られていて、次の場所のようになっていた

takuya@:~$ ll /usr/share/lxc/templates/
合計 336
-rwxr-xr-x 1 root root 10789 2016-07-14 20:42 lxc-alpine
-rwxr-xr-x 1 root root 13533 2016-07-14 20:42 lxc-altlinux
-rwxr-xr-x 1 root root 10253 2016-07-14 20:42 lxc-archlinux
-rwxr-xr-x 1 root root  9446 2016-07-14 20:42 lxc-busybox
-rwxr-xr-x 1 root root 28932 2016-07-14 20:42 lxc-centos
-rwxr-xr-x 1 root root 10150 2016-07-14 20:42 lxc-cirros
-rwxr-xr-x 1 root root 14131 2016-07-14 20:42 lxc-debian
-rwxr-xr-x 1 root root 17427 2016-07-14 20:42 lxc-download
-rwxr-xr-x 1 root root 47200 2016-07-14 20:42 lxc-fedora
-rwxr-xr-x 1 root root 27808 2016-07-14 20:42 lxc-gentoo
-rwxr-xr-x 1 root root 13961 2016-07-14 20:42 lxc-openmandriva
-rwxr-xr-x 1 root root 13705 2016-07-14 20:42 lxc-opensuse
-rwxr-xr-x 1 root root 35445 2016-07-14 20:42 lxc-oracle
-rwxr-xr-x 1 root root 11837 2016-07-14 20:42 lxc-plamo
-rwxr-xr-x 1 root root  6851 2016-07-14 20:42 lxc-sshd
-rwxr-xr-x 1 root root 24273 2016-07-14 20:42 lxc-ubuntu
-rwxr-xr-x 1 root root 12401 2016-07-14 20:42 lxc-ubuntu-cloud

それらのデフォルト設定は次のとおりに、設置されていた。

takuya@:~$ ll /usr/share/lxc/config/
合計 80
-rw-r--r-- 1 root root 1993 2016-07-14 20:42 centos.common.conf
-rw-r--r-- 1 root root 1098 2016-07-14 20:42 centos.userns.conf
-rw-r--r-- 1 root root  126 2016-07-14 20:42 common.seccomp
-rw-r--r-- 1 root root 2148 2016-07-14 20:42 debian.common.conf
-rw-r--r-- 1 root root  745 2016-07-14 20:42 debian.userns.conf
-rw-r--r-- 1 root root 2080 2016-07-14 20:42 fedora.common.conf
-rw-r--r-- 1 root root 1098 2016-07-14 20:42 fedora.userns.conf
-rw-r--r-- 1 root root 1775 2016-07-14 20:42 gentoo.common.conf
-rw-r--r-- 1 root root 2823 2016-07-14 20:42 gentoo.moresecure.conf
-rw-r--r-- 1 root root 1059 2016-07-14 20:42 gentoo.userns.conf
-rw-r--r-- 1 root root 1953 2016-07-14 20:42 oracle.common.conf
-rw-r--r-- 1 root root 1059 2016-07-14 20:42 oracle.userns.conf
-rw-r--r-- 1 root root  778 2016-07-14 20:42 plamo.common.conf
-rw-r--r-- 1 root root  745 2016-07-14 20:42 plamo.userns.conf
-rw-r--r-- 1 root root  155 2016-07-14 20:42 ubuntu-cloud.common.conf
-rw-r--r-- 1 root root  103 2016-07-14 20:42 ubuntu-cloud.lucid.conf
-rw-r--r-- 1 root root  105 2016-07-14 20:42 ubuntu-cloud.userns.conf
-rw-r--r-- 1 root root 2640 2016-07-14 20:42 ubuntu.common.conf
-rw-r--r-- 1 root root   58 2016-07-14 20:42 ubuntu.lucid.conf
-rw-r--r-- 1 root root 1059 2016-07-14 20:42 ubuntu.userns.conf

最近は /etc/foo/bar.d に置かないのが多いんだろうか。

ストレージについて

   -B backingstore
     'backingstore'  には 'dir' か 'lvm' か 'loop' か 'btrfs' か 'zfs' か 'best' のいずれかを指定します。

とあるので、LVMのVGをそのまま使うとか、zfs や btrfs にそのまま接続できるっぽい。管理の手間は大幅に省けそうなので、コンテナ用のストレージのドライブではもうext4捨ててもいいかもしれない。

感想など

最近DebianWikiが充実してるし余計な情報がないのですごくわかりすい。

LXCはDebian Wikiの充実の恩恵を浴びてて、調べるのが楽だった。

LXCは、debian Strechから更に使いやすくなりそう。

BtrfsやZFSに搭載された重複ファイルの削除(節約)機能を使えば、この手のLXCコンテナってものすごくファイル量少なくて動かせるよね。btrfs楽しみ!

console 接続めんどくさい。

ここまで簡単になってるのに、さらにAnsibleするなんて設定のための設定地獄じゃないの・・・と思ってみたり。

参考資料

https://wiki.debian.org/LXC

https://wiki.debian.org/LXC/LibVirtDefaultNetwork

https://wiki.debian.org/LXC#Setup_networked_containers