runCをDebianで実行する

Posted on Tue 23 June 2015 in blog

opencontainers/runc を実行してみようとしたところ、コンパイルまではすぐできるのに、実行するとエラーが出て困ったので、対処方法を書いておく。

runCのインストール

golang的に普通の場所に置いてビルドすると良い。git clone の代わりに go getでも良い。

git clone https://github.com/opencontainers/runc $GOPATH/src/github.com/opencontainers/runc
cd $GOPATH/src/github.com/opencontainers/runc/
make
sudo make install

状況

ディレクトリ構成

.
├── container.json (とりあえず、runc spec で生成されるものでOK)
└── rootfs (docker exportしてtarを展開したものを置いたディレクトリ)

利用中のカーネル

% uname -a
Linux debian 4.0.0-2-amd64 #1 SMP Debian 4.0.5-1 (2015-06-16) x86_64 GNU/Linux

問題

ここまで準備できるとruncが実行できるはずなのだけど、やってみるとエラーが出る。

% sudo runc --debug
WARN[0000] signal: killed
Timestamp: 2015-06-23 20:50:18.148962383 +0900 JST
Code: System error

Message: open /sys/fs/cgroup/cpu/user.slice/tmp/cpu.cfs_quota_us: permission denied

Frames:
---
0: start
Package: github.com/opencontainers/runc/libcontainer.(*initProcess)
File: process_linux.go@197
---
1: Start
Package: github.com/opencontainers/runc/libcontainer.(*linuxContainer)
File: container_linux.go@107
---
2: execContainer
Package: main
File: run.go@41
---
3: func·006
Package: main
File: main.go@88
---
4: Run
Package: github.com/codegangsta/cli.(*App)
File: app.go@159
---
5: main
Package: main
File: main.go@96
---
6: main
Package: runtime
File: proc.go@63
---
7: goexit
Package: runtime
File: asm_amd64.s@2232

対処

カーネルの再コンパイル

cfs_quota_us というのは、CFS Bandwidth Control というカーネルの機能らしく、cgroupなどと一緒に入ったものっぽい。

とりあえず、カーネルコンパイルする必要がありそうなので、以下を参考に実施する。

sudo apt-get install build-essential kernel-package libncurses5-dev bc
sudo apt-get install linux-source
sudo -s
cd /usr/src
tar xvf linux-source-4.0.tar.xz
cd linux-source-4.0
cp /boot/config-4.0.0-2-amd64 .config
make oldconfig
make menuconfig

ここで、 '/' を押し、"CFS" などを検索すると CFS Bandwidthの項目が見つかるので、チェックを入れる。

make-kpkg clean
make-kpkg --revision 1.0 --initrd kernel-image 
sudo dpkg -i (できた debパッケージ)

ブート時のカーネルパラメータ

上記だけでは動かなかったので、さらに、GRUBでカーネルパラメータを追加した。

/etc/default/grub を開いて、

# GRUB_CMDLINE_LINUX="" <-コメントアウト
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

編集した後、 sudo update-grub をして、reboot。
これで、sudo runc で実行できるようになっている。

open container 自体は、まだspecも公開されていないし、特に遊べることはなさそうだ。

その他の参考資料

他にもカーネルコンフィグをいじった方が良いかもしれない。