(2014-04-19 追記) このエントリは古い情報ですので,Ubuntu 14.04 LTS での非特権コンテナ - TenForwardの日記 をご覧ください.
lxc-1.0 も rc3 まで来ており,もうすぐリリースという感じはあるのですが,相変わらずパッチは多数投稿されており,正式版が出そうな感じがしません.どうなるのかな?
Ubuntu の Trusty の開発版 + lxc の daily build で非特権コンテナを試してみました.ここは日替わりで動作が変化していますので,お読みになった時点では違う動きがあるかもしれませんが,ひとまず楽に動くようにはなっていますので紹介してみます.
lxc インストール
- まず Ubuntu Trusty 環境を準備します.
- LXC の daily builds のリポジトリを登録します
sudo add-apt-repository ppa:ubuntu-lxc/daily
- apt-get update
- lxc パッケージをインストールします.
# apt-get install lxc
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following extra packages will be installed:
bridge-utils cgmanager cgroup-lite cloud-image-utils debootstrap distro-info
distro-info-data dnsmasq-base euca2ools genisoimage libaio1
libboost-system1.54.0 libboost-thread1.54.0 libcap2-bin liblxc0 libmnl0
libnetfilter-conntrack3 libnspr4 libnss3 libnss3-nssdb libpam-cap librados2
librbd1 libseccomp2 libxslt1.1 lxc-templates python-distro-info python-lxml
python-requestbuilder python-setuptools python3-lxc qemu-utils sharutils
uidmap
Suggested packages:
shunit2 wodim cdrkit-doc libcap-dev btrfs-tools lvm2 lxctl qemu-user-static
python-lxml-dbg bsd-mailx mailx
The following NEW packages will be installed:
bridge-utils cgmanager cgroup-lite cloud-image-utils debootstrap distro-info
distro-info-data dnsmasq-base euca2ools genisoimage libaio1
libboost-system1.54.0 libboost-thread1.54.0 libcap2-bin liblxc0 libmnl0
libnetfilter-conntrack3 libnspr4 libnss3 libnss3-nssdb libpam-cap librados2
librbd1 libseccomp2 libxslt1.1 lxc lxc-templates python-distro-info
python-lxml python-requestbuilder python-setuptools python3-lxc qemu-utils
sharutils uidmap
0 upgraded, 35 newly installed, 0 to remove and 0 not upgraded.
Need to get 6,283 kB of archives.
After this operation, 24.8 MB of additional disk space will be used.
Do you want to continue? [Y/n]- 先日までは systemd に依存とかしてましたが,それはなくなってますね.:-)
諸々準備
まずはシステム上の準備を
- まず cgroup の前準備を.
# cat <
/etc/init/lxc-unpriv-cgroup.conf
> start on starting systemd-logind and started cgroup-lite
>
> script
> set +e
>
> echo 1 > /sys/fs/cgroup/memory/memory.use_hierarchy
>
> for entry in /sys/fs/cgroup/*/cgroup.clone_children; do
> echo 1 > $entry
> done
>
> exit 0
> end script
> EOF- 実は,コレはやらなくても動いたんですが (memory.use_hierarchy は元々 1 になってた),普通に lxc を root 権限で動かすとcgroup.clone_children は 1 に設定されるので,それに合わせておきました.
- ユーザ・グループ "karma" (=私のログイン名 :-) に紐づく subuid/subgid を設定します.
$ sudo usermod --add-subuids 100000-165536 karma
$ sudo usermod --add-subgids 100000-165536 karma
$ cat /etc/subuid
# empty default subuid/subgid file
karma:100000:65537
$ cat /etc/subgid
# empty default subuid/subgid file
karma:100000:65537 - /etc/lxc/lxc-usernet の準備.以下のように作成します.ユーザ "karma" が lxcbr0 にアタッチする veth タイプのインターフェースを 10 個作成可能,という意味になります.
$ cat /etc/lxc/lxc-usernet
# USERNAME TYPE BRIDGE COUNT
karma veth lxcbr0 10 - 自身の使う default.conf を作成します.システムのモノを元に作成すると良いでしょう.
$ cd ~/.config/lxc
$ cp /etc/lxc/default.conf .
$ vi default.conf
$ diff /etc/lxc/default.conf ./default.conf
4a5,6
> lxc.id_map = u 0 100000 65536
> lxc.id_map = g 0 100000 65536
コンテナ作成
コンテナは lxc-download テンプレートを使って linuxcontainers.org のイメージリポジトリから取得し,手元で展開します.このイメージは jenkins を使ってデイリーで lxc に含まれる公式のテンプレートを使って作成されています.
イメージのリストは以下のように取得できます (美しくリストを取得する方法がわからない...)
$ lxc-create -t download -n dummy -- --list Setting up the GPG keyring Downloading the image index --- DIST RELEASE ARCH VARIANT BUILD --- centos 6 amd64 default 20140219_02:17 centos 6 i386 default 20140219_02:17 debian jessie amd64 default 20140218_22:43 debian jessie armel default 20140218_22:43 debian jessie armhf default 20140218_22:43 debian jessie i386 default 20140218_22:43 debian sid amd64 default 20140218_22:43 debian sid armel default 20140218_22:43 debian sid armhf default 20140218_22:43 debian sid i386 default 20140218_22:43 debian wheezy amd64 default 20140218_22:43 debian wheezy armel default 20140218_22:43 debian wheezy armhf default 20140218_22:43 debian wheezy i386 default 20140218_22:43 oracle 6.5 amd64 default 20140218_11:41 oracle 6.5 i386 default 20140218_11:41 plamo 5.x amd64 default 20140218_21:37 plamo 5.x i386 default 20140218_21:37 ubuntu lucid amd64 default 20140219_03:50 ubuntu lucid i386 default 20140219_03:50 ubuntu precise amd64 default 20140219_03:50 ubuntu precise armel default 20140219_03:50 ubuntu precise armhf default 20140219_03:50 ubuntu precise i386 default 20140219_03:50 ubuntu quantal amd64 default 20140219_03:50 ubuntu quantal armel default 20140219_03:50 ubuntu quantal armhf default 20140217_03:50 ubuntu quantal i386 default 20140219_03:50 ubuntu saucy amd64 default 20140219_03:50 ubuntu saucy armhf default 20140217_03:50 ubuntu saucy i386 default 20140219_03:50 ubuntu trusty amd64 default 20140219_03:50 ubuntu trusty armhf default 20140219_03:50 ubuntu trusty i386 default 20140219_03:50 --- lxc_container: container creation template for test failed lxc_container: Error creating container test
Ubuntu Trusty(amd64) なコンテナを作ってみます.
karma@lxctest03:~$ lxc-create --template download --name trusty01 -- --dist ubuntu --release trusty --arch amd64 --flush-cache Setting up the GPG keyring Downloading the image index Downloading the rootfs Downloading the metadata The image cache is now ready Unpacking the rootfs --- You just created an Ubuntu container (release=trusty, arch=amd64). The default username/password is: ubuntu / ubuntu To gain root privileges, please use sudo.
コンテナは ~/.local/share/lxc 以下にできています.
$ ls ~/.local/share/lxc/ trusty01 $ ls ~/.local/share/lxc/trusty01/ config rootfs $ ls ~/.local/share/lxc/trusty01/rootfs/ bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr $ lxc-ls --fancy NAME STATE IPV4 IPV6 AUTOSTART ---------------------------------------- trusty01 STOPPED - - NO
コンテナの起動
普通にコンテナを起動するだけですね.
$ lxc-start --name trusty01 --daemon $ lxc-ls --fancy NAME STATE IPV4 IPV6 AUTOSTART --------------------------------------------- trusty01 RUNNING 10.0.3.16 - NO $ ssh [email protected] [email protected]'s password: Welcome to Ubuntu Trusty Tahr (development branch) (GNU/Linux 3.13.0-8-generic x86_64) * Documentation: https://help.ubuntu.com/ Last login: Wed Feb 19 08:25:04 2014 from 10.0.3.1 ubuntu@trusty01:~$ exit logout Connection to 10.0.3.16 closed. $ lxc-stop --name trusty01 $ lxc-ls --fancy NAME STATE IPV4 IPV6 AUTOSTART ---------------------------------------- trusty01 STOPPED - - NO
このコンテナに対する cgroup ですが,以下のような場所にできてるようです.普通に systemd.logind とかが作る場所かな?
/sys/fs/cgroup/*/user/${uid}.user/${sessionid}.session/${containar name}/
もひとつ,cgmanager がどう動いているのかこれだけではつかめません (cgmanager 経由で何かしているのかどうかも).これはまた後日...
(続く)