lxc.mount.entryで指定したマウントは,ホストからは見えないんだよ
LXCは設定ファイルにlxc.mount.entryを書いておくと,起動時にマウントしてくれるわけですが,そのマウントはホストからは見えません.namespaceが別だから.
... lxc.mount.entry = /usr/lib usr/lib none bind,ro 0 0 ...
例えば,上記のような設定ファイルを書いた場合,それの意味するところは,ホストの/usr/libを,ゲストの/usr/libにマウントしてね,という意味になるわけですが,コンテナを起動させた後でls -l /path/to/rootfs/usr/lib
とかしても期待する中身は見れません./proc/mounts
にも現れません.
これは,mount namespaceが異なるためで,ホストが見ている/path/to/rootfs/usr/libと,ゲストが見ている/path/to/rootfs/usr/lib(ゲストのinit以下のプロセスからは/usr/libに見える)は別物だということです.なので,ホストでは見えなくても,sshとかlxc-consoleとかでゲストに入ってls -l /usr/lib
とかすると期待通りのものが見れます.
ゲストにログインせずにホストから見たい場合は,namespaceを切り替える必要があるので,nsenter
コマンドを使います.
nsenter -t $(lxc-info -p -n CONTAINER_NAME | awk '{print $2}') --mount -- ls -l /usr/lib
あるプロセスがどのnamespaceに属しているかは,/proc/[pid]/ns/
以下を見ると分かります.
$ ls -l /proc/self/ns total 0 lrwxrwxrwx 1 kawamuray users 0 Jul 3 01:51 ipc -> ipc:[4026531839] lrwxrwxrwx 1 kawamuray users 0 Jul 3 01:51 mnt -> mnt:[4026531840] lrwxrwxrwx 1 kawamuray users 0 Jul 3 01:51 net -> net:[4026531956] lrwxrwxrwx 1 kawamuray users 0 Jul 3 01:51 pid -> pid:[4026531836] lrwxrwxrwx 1 kawamuray users 0 Jul 3 01:51 uts -> uts:[4026531838]
カッコ内の数字はinode numberです.この番号が同一であれば同じnamespaceに属していると考えることができます.
man 2 setns
すると分かりますが,Linuxのnamespaceはファイルディスクリプタによって識別されており,あるnamespaceに切り替える際にはこのファイルのdescriptorを渡します.
nsenter
コマンドは,このファイルを渡すことでも実行できます.
nsenter --mount=/proc/[pid]/ns/mnt -- ls -l /usr/lib