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

マウント名前空間でちょっとハマっためも

linux namespace

Mount namespaceをちょっと確認って思って、unshareコマンドでマウント名前空間を分離したのにプロセス間でマウント状況が分離されてなくてちょっと調べたという。

アップデート済みのarchとfedora 22で試したんだけど、unshareしたプロセスでmountしたものが、別のプロセスから見えてたんですね。

これは何でだったかというと、mountコマンドのデフォルトの挙動として--make-sharedオプションが使われるため、せっかくマウント名前空間を分離させたのにその影響が他方にも出てたという感じでした。 これはLWNのNamespaces in operation, part 2: the namespaces APIという記事のコメントに答えが書かれてました。

状況はこうですね。

最初にunshareでマウント名前空間の分離。

[masami@arch-workstation ~]$ sudo unshare -m /bin/bash

ここで、mountinfoファイルからマウント状態を見るとsharedが付いているので共有されることがわかります。

[root@arch-workstation masami]# cat /proc/$$/mountinfo | awk '/\/ \/ / {print $4, $5, $6, $7}'
/ / rw,relatime shared:1

これだと、このプロセスで何かをmount・unmountすると他のマウント名前空間にも影響が出ます。なので、/をプライベートに設定します。

[root@arch-workstation masami]# mount --make-private /

そして、適当にディレクトリを作ってtmpfsをマウントしてみる。
mountinfoからsharedが消えてますいて、fooがtmpfsでマウントされているのが見えますね。

[root@arch-workstation masami]# mkdir foo
[root@arch-workstation masami]# mount -t tmpfs tmp ./foo/
[root@arch-workstation masami]# mount | grep foo
tmp on /home/masami/foo type tmpfs (rw,relatime)
[root@arch-workstation masami]# cat /proc/$$/mountinfo | awk '/\/ \/ / {print $4, $5, $6, $7}'
/ / rw,relatime -

tmpfsをマウントした方はマウント名前空間のファイルのinodeは4026532166です。

[root@arch-workstation masami]# ls -la /proc/self/ns/mnt
lrwxrwxrwx 1 root root 0 May 30 11:50 /proc/self/ns/mnt -> mnt:[4026532166]

この時に別のマウント名前空間のプロセスでマウントの状況とか/pros/self/ns/mntを見るとマウントポイントの状態がunshareしたほうと違っていて、向こうの処理の影響を受けていないことがわかります。

[root@arch-workstation masami]# mount | grep foo
[root@arch-workstation masami]# ls -la /proc/self/ns/mnt
lrwxrwxrwx 1 root root 0 May 30 11:50 /proc/self/ns/mnt -> mnt:[4026531840]

はい。こんなところです。最近のディストリビューションを使う場合は、mountコマンドの挙動が昔と違っている場合があるので気を付けましょう。

ハルロック(4)

ハルロック(4)