TenForward

技術ブログ。はてなダイアリーから移転しました

LXCの非特権コンテナ 〜 Ubuntu Trusty 編

(2014-04-19 追記) このエントリは古い情報ですので,Ubuntu 14.04 LTS での非特権コンテナ - TenForwardの日記 をご覧ください.

lxc-1.0 も rc3 まで来ており,もうすぐリリースという感じはあるのですが,相変わらずパッチは多数投稿されており,正式版が出そうな感じがしません.どうなるのかな?

Ubuntu の Trusty の開発版 + lxc の daily build で非特権コンテナを試してみました.ここは日替わりで動作が変化していますので,お読みになった時点では違う動きがあるかもしれませんが,ひとまず楽に動くようにはなっていますので紹介してみます.

lxc インストール

  1. まず Ubuntu Trusty 環境を準備します.
  2. LXC の daily builds のリポジトリを登録します
    sudo add-apt-repository ppa:ubuntu-lxc/daily
  3. apt-get update
  4. 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 に依存とかしてましたが,それはなくなってますね.:-)

諸々準備

まずはシステム上の準備を

  1. まず 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 に設定されるので,それに合わせておきました.
  2. ユーザ・グループ "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
  3. /etc/lxc/lxc-usernet の準備.以下のように作成します.ユーザ "karma" が lxcbr0 にアタッチする veth タイプのインターフェースを 10 個作成可能,という意味になります.
    $ cat /etc/lxc/lxc-usernet 
    # USERNAME TYPE BRIDGE COUNT
    karma veth lxcbr0 10
  4. 自身の使う 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 ubuntu@10.0.3.16
ubuntu@10.0.3.16'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 経由で何かしているのかどうかも).これはまた後日...

(続く)