マウントネームスペースをファイルにバインドできない理由

マウントネームスペースをファイルにバインドできない理由

以下を観察しました。

シェル1で権限のないユーザーとして:

user@box:~$ sysctl kernel.unprivileged_userns_clone
kernel.unprivileged_userns_clone = 1
user@box:~$ unshare --mount --user
nobody@box:~$ echo $$
18655

シェル番号 2 を root として入力します。

root@box:~# mkdir -p /tmp/myns
root@box:~# touch /tmp/myns/{user,mnt}
root@box:~# mount --bind /proc/18655/ns/user /tmp/myns/user 
root@box:~# mount --bind /proc/18655/ns/mnt /tmp/myns/mnt
mount: /tmp/myns/mnt: wrong fs type, bad option, bad superblock on /proc/18655/ns/mnt, missing codepage or helper program, or other error.

エラーは素晴らしいです。インストール名前空間をファイルにバインドすることはできませんが、ユーザーの名前空間をファイルにバインドすることはできますか?なぜこれが起こり、権限のないユーザーがこのマウントネームスペースを使用できるようにするにはどうすればよいですかuser

私はなぜこれをしたいのですか?~user:プログラムをテストするために一時ファイルシステムを上書きし、最初は元のコンテンツを共有したいと思います。次のようにルートに設定できます。

tmp='/tmp/GAtcNNeSfM8b'
mkdir -p "$tmp"
mount -t tmpfs -o size=100m tmpfs "$tmp"
mkdir -p "${tmp}/"{upper,work,lower}
mount --bind -o ro /home/user "${tmp}/lower"

unshare -m
mount -t overlay -o"lowerdir=${tmp}/lower,upperdir=${tmp}/upper,workdir=${tmp}/work" overlay /home/user
touch /tmp/namespace
mount --bind /proc/self/ns/mnt /tmp/namespace

しかし、最後の行は失敗します。

nsenter --mount=/tmp/namespaceこれは、変更が/home/user永続的ではないことを除いて、権限のないユーザーが以前と同じシステムを表示できるようにするためです。実際、私はユーザーの名前空間を共有したくありません。

私は意識的にLXC、Docker、さらにはVirtualBoxのオーバーヘッドを避けようとしています。私はこれがLinux標準ツールを使用して可能でなければならないと思います。

修正する:私は最新のArchLinuxを実行しています。

$ uname -r
5.0.10-arch1-1-ARCH

ベストアンサー1

マウントネームスペースにのみ影響を与えることを考えると、これが次のいずれかであると思われます。ループ防止チェック名前空間をマウントするために使用されます。unshare --mountインストール伝播が default に設定されているので、これがリンクで議論されたのとまったく同じ状況だとは思わない。privateつまり、無効になっています。

privateただし、競合状態の一部を回避するには、マウント伝播を使用してマウント内にマウントネームスペースをマウントする必要がある可能性があることが完全に正しいと思います。私もあなたがunbindableunbindableprivate

つまり、次のコマンドを使用して、準備されたディレクトリにマウント名前空間をマウントします。

mount --bind /var/local/lib/myns/ /var/local/lib/myns/
mount --make-unbindable /var/local/lib/myns/

全体的に、これがこのような問題を引き起こさない最も安全な方法だと思います。

私の競争条件は仮想です。私はあなたがほとんどの時間にそれを打つことを期待していません。だから私はあなたの実際の問題が何であるかわかりません。

おすすめ記事