以下を観察しました。
シェル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
ただし、競合状態の一部を回避するには、マウント伝播を使用してマウント内にマウントネームスペースをマウントする必要がある可能性があることが完全に正しいと思います。私もあなたがunbindable
。unbindable
private
つまり、次のコマンドを使用して、準備されたディレクトリにマウント名前空間をマウントします。
mount --bind /var/local/lib/myns/ /var/local/lib/myns/
mount --make-unbindable /var/local/lib/myns/
全体的に、これがこのような問題を引き起こさない最も安全な方法だと思います。
私の競争条件は仮想です。私はあなたがほとんどの時間にそれを打つことを期待していません。だから私はあなたの実際の問題が何であるかわかりません。