読者です 読者をやめる 読者になる 読者になる

lxc.mount.entryで指定したマウントは,ホストからは見えないんだよ

Linux LXC

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