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捨ててもいいかもしれない。
感想など
最近DebianもWikiが充実してるし余計な情報がないのですごくわかりすい。
LXCはDebian Wikiの充実の恩恵を浴びてて、調べるのが楽だった。
LXCは、debian Strechから更に使いやすくなりそう。
BtrfsやZFSに搭載された重複ファイルの削除(節約)機能を使えば、この手のLXCコンテナってものすごくファイル量少なくて動かせるよね。btrfs楽しみ!
console 接続めんどくさい。
ここまで簡単になってるのに、さらにAnsibleするなんて設定のための設定地獄じゃないの・・・と思ってみたり。