web-dev-qa-db-ja.com

プロセスごとのプライベートファイルシステムマウントポイント

私はunshareコマンドをチェックしていました、そしてそれはそのmanページによると、

   unshare - run program with some namespaces unshared from parent

また、名前空間のタイプとして、

 mount namespace
              mounting and unmounting filesystems will not affect rest of the system.

これの正確な目的は何ですかmount namespace?いくつかの例を使用して、この概念を理解しようとしています。

23
Ramesh

ランニング unshare -mは、呼び出しプロセスにそのマウント名前空間のプライベートコピーを提供し、ファイルシステム属性の共有を解除して、ルートディレクトリ、現在のディレクトリ、またはumask属性を他のプロセスと共有しなくなります。

それで、上の段落は何を言っているのですか?簡単な例を使って理解してみましょう。

ターミナル1:

最初のターミナルで以下のコマンドを実行します。

#Creating a new process
unshare -m /bin/bash
#creating a new mount point
secret_dir=`mktemp -d --tmpdir=/tmp`
#creating a new mount point for the above created directory. 
mount -n -o size=1m -t tmpfs tmpfs $secret_dir
#checking the available mount points. 
grep /tmp /proc/mounts 

最後のコマンドは私に出力を与えます、

tmpfs /tmp/tmp.7KtrAsd9lx tmpfs rw,relatime,size=1024k 0 0

今、私は次のコマンドも実行しました。

cd /tmp/tmp.7KtrAsd9lx
touch hello
touch helloagain
ls - lFa

lsコマンドの出力は、

ls -lFa
total 4
drwxrwxrwt   2 root root   80 Sep  3 22:23 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../
-rw-r--r--   1 root root    0 Sep  3 22:23 hello
-rw-r--r--   1 root root    0 Sep  3 22:23 helloagain

では、このすべてを行う上で重要なことは何でしょうか?なぜ私はそれをしなければならないのですか?

ここで別のターミナル(terminal 2)を開き、以下のコマンドを実行します。

cd /tmp/tmp.7KtrAsd9lx
ls - lFa

出力は以下のようになります。

ls -lFa
total 8
drwx------   2 root root 4096 Sep  3 22:22 ./
drwxrwxrwt. 16 root root 4096 Sep  3 22:22 ../

ファイルhellohelloagainは表示されず、これらのファイルをチェックするためにrootとしてログインしました。したがって、この機能により、他のroot所有のプロセスでさえも表示または参照できないプライベート一時ファイルシステムを作成できるようになります。

unshareのmanページから、

マウント名前空間ファイルシステムのマウントとマウント解除は、システムの残りの部分(CLONE_NEWNSフラグ)に影響を与えません。ただし、明示的に共有としてマークされているファイルシステム(mount --make-sharedを使用。共有フラグについては/ proc/self/mountinfoを参照)を除きます。

Unshare --mountの後にmount --make-rprivateまたはmount --make-rslaveを使用して、新しい名前空間のマウントポイントが親の名前空間から本当に共有解除されるようにすることをお勧めします。

名前空間に使用されているメモリは、カーネルからのVFSです。そして、そもそもそれをセットアップすれば、root権限なしでrootユーザーである仮想環境全体を作成できます。

参考文献:

例は このブログ投稿 の詳細を使用してフレーム化されています。また、この回答の引用は Mikeからのこの素晴らしい説明 からのものです。これに関する別の素晴らしい読み物は here からの回答から見つけることができます。

29
Ramesh

bubblewrap がシステムにインストールされている場合、1つの手順で簡単に実行できます。

bwrap --dev-bind / / --tmpfs /tmp bash

上記の例では、内部bashは/ tmpに独自のビューを持っています。

@ Ramesh-sの回答に触発されたソリューション-ありがとうございます!

2
VasyaNovikov