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
では、これらすべてを実行する上で重要なことは何ですか?なぜそれをしなければならないのですか?
ここで別のターミナルを開きます (ターミナル 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 ../
ファイル hello
と helloagain
表示されず、これらのファイルを確認するためにルートとしてログインしました。その利点は、この機能により、他の root 所有のプロセスでさえ参照または閲覧できないプライベートな一時ファイルシステムを作成できることです。
unshare
の man ページより 、
名前空間のマウント ファイルシステムのマウントとアンマウントは、システムの残りの部分には影響しません (CLONE_NEWNS フラグ)。 P>
mount --make-rprivate または mount --make-rslaveafter unshare--mount を使用して、新しい名前空間のマウントポイントが親の名前空間から実際に共有されないようにすることをお勧めします。
名前空間に使用されているメモリは、カーネルからの VFS です。そして、最初に正しく設定すれば、ルート権限なしでルートユーザーになる仮想環境全体を作成できます。
参考文献:
この例は、このブログ投稿の詳細を使用して構成されています。また、この回答の引用は、マイクからのこの素晴らしい説明からのものです。これに関する別の素晴らしい読み物は、ここの回答から見つけることができます.
システムにバブルラップがインストールされている場合は、ワンステップで簡単に実行できます:
bwrap --dev-bind / / --tmpfs /tmp bash
上記の例では、内部 bash は /tmp に独自のビューを持ちます。
@Ramesh-s の回答に触発されたソリューション - ありがとうございます!