2014-05-15
■[Linux][Kernel][lxc] overlayfs と LXC 非特権コンテナの snapshot によるクローン
kernel に入るぞ、と言われつつ入ってない overlayfs。いつですかね?
なかなか凝ったことを試す時間が取れない今日このごろ、非常に薄い内容のエントリです。
overlayfs
overlayfs を使ってみました。ドキュメント全く読んでないので (ヲイ) わかりませんが、カーネルが対応すれば特に何もすることはなさそうです。以下で試しました。
パッチはこの辺りをご参照。
早速試してみます。
- 重ねあわせをするディレクトリを作り、確認用にファイルを作っておきます。
# mkdir 1 2 3
# touch 1/LOW
# touch 2/HIGH - マウントします。マウントされています。
# mount -t overlayfs -o lowerdir=1,upperdir=2 overlayfs 3
# mount -l | grep overlayfs
overlayfs on /root/3 type overlayfs (rw,lowerdir=1,upperdir=2) - ファイルを作ってみます。元々あったファイルに加えて、新しく作ったファイルも見えます。
# cd 3
touch OVERLAY
# ls
HIGH LOW OVERLAY - umount します。
# umount 3
- 各ディレクトリを確認してみます。
# ls 1
LOW
# ls 2
HIGH OVERLAY
# ls 3
upperdir で指定したディレクトリが更新されていくわけですね。lowerdir で指定したディレクトリが更新されると、マウントされた overlayfs のディレクトリも更新されたようにみえます。
# cd 3 # ls HIGH LOW OVERLAY # cd ../1 # ls LOW # touch LOW2 # ls LOW LOW2 # cd ../3 # ls HIGH LOW LOW2 OVERLAY
これだけ。
Ubuntu 14.04 の非特権コンテナの overlayfs による clone
以下は一般ユーザで実行しています。非特権コンテナの作り方は Ubuntu 14.04 LTS での非特権コンテナ - TenForwardの日記 辺りをどうぞ。
"ct01" というコンテナを "ct02" という名前のコンテナに overlayfs を使って snapshot clone してみましょう。ちなみに aufs だとこんな風に怒られます。
$ lxc-clone -o ct01 -n ct02 -s -B aufs lxc_container: Unsupported snapshot type for unprivileged users lxc_container: Error copying storage clone failed
overlayfs だとこんな風にあっさり成功。
$ lxc-ls ct01 $ lxc-clone -o ct01 -n ct02 -s -B overlayfs Created container ct02 as snapshot of ct01 $ lxc-ls ct01 ct02
ct02 のディレクトリを覗いてみると
$ cd .local/share/lxc/ct02 $ ls -F config delta0/ lxc_rdepends rootfs/ $ grep lxc.rootfs config lxc.rootfs = overlayfs:/home/karma/.local/share/lxc/ct01/rootfs:/home/karma/.local/share/lxc/ct02/delta0
つまり
- ct01 の rootfs を lowerdir に
- ct02 の delta0 ディレクトリを upperdir に
して、ct02 の rootfs ディレクトリに overlayfs でマウントするというわけですね。
$ lxc-start -n ct02 -d $ lxc-ls --fancy NAME STATE IPV4 IPV6 AUTOSTART ------------------------------------------ ct01 STOPPED - - NO ct02 RUNNING 10.0.3.178 - NO
ct02 に ubuntu ユーザでログインして $HOME/TEST ファイルを作ると、
$ cd ~/.local/share/lxc/ct02/delta0/home/ubuntu $ ls TEST
と delta0 ディレクトリにファイルが作られていきます。
一つ注意が必要なのは ct01 のファイルが更新されると ct02 のファイルも更新されてしまうので、なんか良くわからない状態になってしまいがちですね。普通に filesystem レベルでサポートされている snapshot を使った clone とはちょっと違うので、使い方も変えていく必要はあります。そういう場合は 1.0 ではサポートされない気がしますが、btrfs を使えばいけるようになりそうです→btrfs: support unprivileged create and clone ? 2659c7c ? lxc/lxc ? GitHub
Plamo 5.2 の非特権コンテナの clone
私にとってはここからが本題。
同じように Plamo でも出来るはず、ってことで試してみましたが...
$ lxc-clone -o ct01 -n ct02 -s -B overlayfs lxc_container: Operation not permitted - overlayfs: error mounting /home/karma/.local/share/lxc/ct01/rootfs onto /usr/lib64/lxc options upperdir=/home/karma/.local/share/lxc/ct02/delta0,lowerdir=/home/karma/.local/share/lxc/ct01/rootfs clone failed
(;_;) Why?? 偉い人教えて。(続く)
(2014-05-15 追記)
わかりました。overlayfs で User Namespace 内の root が overlayfs をマウント出来るようなフラグを与えました。具体的には fs/overlayfs/super.c 内の ovl_fs_type に FS_USERNS_MOUNT ってのをフラグで追加しました。
static struct file_system_type ovl_fs_type = { .owner = THIS_MODULE, .name = "overlayfs", .mount = ovl_mount, .kill_sb = kill_anon_super, .fs_flags = FS_USERNS_MOUNT, };
FS_USERNS_MOUNT は include/linux/fs.h に定義されています。
$ grep FS_USERNS_MOUNT include/linux/fs.h #define FS_USERNS_MOUNT 8 /* Can be mounted by userns root */
これで Plamo でも
$ lxc-clone -o ct01 -n ct02 -s -B overlayfs
Created container ct02 as snapshot of ct01
$ for c in /sys/fs/cgroup/*; do echo $$ > $c/karma/tasks; done
$ lxc-start -n ct02 -d$ lxc-ls --fancy
NAME STATE IPV4 IPV6 AUTOSTART
--------------------------------------------
ct01 STOPPED - - NO
ct02 RUNNING 10.0.100.253 - NO
- 11 https://www.google.co.jp/
- 7 http://t.co/TrO9uSV7Fr
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&frm=1&source=web&cd=1&ved=0CCcQFjAA&url=http://d.hatena.ne.jp/defiant/20080909/1220943546&ei=gmF0U9ecOoiClAXo7oHgDg&usg=AFQjCNHZAgF6ECtka1jDlbNJOSwZpDGu2w&bvm=bv.66699033,d.c2E
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&uact=8&ved=0CCkQFjAA&url=http://d.hatena.ne.jp/defiant/20140310/1394382379&ei=fGd0U5j2NoaulAWsx4CoBQ&usg=AFQjCNE0WjBC8WuqmlQz5GMbPSWSK3dYAA&sig2=OFtTxrIdgKh7XHoOIgZ9OQ&bv
- 4 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=57&ved=0CHIQFjAGODI&url=http://d.hatena.ne.jp/defiant/20140310/1394382379&ei=YWR0U6y6MsWKuASr84CoDw&usg=AFQjCNE0WjBC8WuqmlQz5GMbPSWSK3dYAA
- 3 http://search.yahoo.co.jp/search?p=ドライブレコーダー+取り付け&search.x=1&fr=top_ga1_sa&tid=top_ga1_sa&ei=UTF-8&aq=3&oq=ドライブ??%A
- 2 http://search.yahoo.co.jp/search?ei=UTF-8&fr=top_ipd_sa&x=wrt&p=ドライブレコーダー+取り付け&aq=0&oq=ドライブレコー%
- 2 http://www.google.co.jp/url?sa=t&rct=j&q=&esrc=s&source=web&cd=2&ved=0CDYQFjAB&url=http://d.hatena.ne.jp/defiant/20130822/1377157494&ei=aIt0U576GcWMuATZ64LoBQ&usg=AFQjCNF7dmFtjcdZiHhqjxT2jZl16zkBWA&sig2=Jx7RbzHof5vY3Bwi5CrsEg&bvm=bv.66699033,d
- 1 http://api.twitter.com/1/statuses/show/466826835733409792.json
- 1 http://api.twitter.com/1/statuses/show/466869358312960000.json
- 2014-05-12 akihiko’s tech note 5/81 6%
- 2014-05-11 deruiの日記 4/66 6%
- 2014-05-12 heyheytower 6/108 5%
- 2014-05-14 和順日記 5/91 5%
- 2014-05-15 ぽこにっき 4/75 5%
- 2014-05-11 grachroブログ 3/56 5%
- 2014-05-14 ぽこにっき 3/54 5%