25

マウントクローンのマニュアルページを読んでいます。CLONE_NEWNS が子プロセスのファイル システムのビューにどのように影響するかを明確にしたいと思います。

(ファイル階層)

このツリーをディレクトリ階層と考えてみましょう。5と6が親プロセスのマウントポイントだとしましょう。別の質問でマウントポイントを明確にしました。

したがって、私の理解は次のとおりです。5と6がマウントポイントであるということは、mountコマンドが以前に5と6でファイルシステム(ディレクトリ階層)を「マウント」するために使用されたことを意味します(つまり、5と6の下にもディレクトリツリーが必要です)。

mountマンページから:

 A mount namespace is the set of filesystem mounts that are visible to a process. 

cloneマンページから:

Every process lives in a mount namespace.  The namespace of a process is the data 
(the set of mounts) describing the file hierarchy as seen by that process.  After 
a fork(2) or clone() where the CLONE_NEWNS flag is not set, the child lives in the 
same mount namespace as the parent.

また :

After a clone() where the CLONE_NEWNS flag is set, the cloned child is started in a 
new mount namespace, initialized with a copy of the namespace of the parent.

clone()withを使用しCLONE_NEWNSて子プロセスを作成すると、子はツリー内のマウント ポイント (5 & 6) の正確なコピーを取得し、元のツリーの残りの部分にアクセスできることを意味しますか? 親プロセスのマウント名前空間で5または6にマウントされているものに影響を与えることなく、子が5および6を自由にマウントできることも意味しますか。

はいの場合、子が5または6とは異なるディレクトリをマウント/アンマウントし、親プロセスに表示されるものに影響を与える可能性があることも意味しますか?

ありがとう。

4

2 に答える 2

29

プロセスの「マウント名前空間」は、プロセスが認識するマウントされたファイルシステムのセットです。1 つのグローバル マウント名前空間を持つという従来の状況からプロセスごとのマウント名前空間を持つようになったら、 で子プロセスを作成するときに何をすべきかを決定する必要がありますclone()

従来、ファイルシステムをマウントまたはアンマウントすると、すべてのプロセスから見えるようにファイルシステムが変更されました。すべてのプロセスから見える 1 つのグローバル マウント名前空間があり、変更が行われた場合 (たとえば、mountコマンドを使用して)、すべてのプロセスはその変更に関係なくすぐにその変更を認識します。mountコマンドとの関係。

プロセスごとのマウント名前空間により、子プロセスはその親とは異なるマウント名前空間を持つことができるようになりました。ここで疑問が生じます:

子によって行われたマウント名前空間への変更は、親に反映されるべきですか?

明らかに、この機能少なくともサポートされている必要があり、おそらくデフォルトである必要があります。それ以外の場合、コマンド自体を起動してmountも変更はありません (親シェルから見たファイルシステムは影響を受けないため)。

同様に明らかに、この必要な伝播を抑制することも可能でなければなりません。そうしないと、マウント名前空間がその親と異なる子プロセスを作成することはできず、再び 1 つのグローバル マウント名前空間 (で見られるファイルシステムinit) ができます。

したがって、子プロセスを作成するときにclone()、子プロセスがマウントされたファイルシステムに関するデータの独自のコピーを親から取得するか、親に影響を与えずに変更できるか、または親と同じデータ構造へのポインターを取得するかを決定する必要があります。 、変更できます (mountシェルから起動したときのように、変更が反映されるために必要です)。

フラグがにCLONE_NEWNS渡されるclone()と、子は親のマウントされたファイルシステム データのコピーを取得します。これは、親のマウント名前空間に影響を与えずに変更できます。それ以外の場合は、親のマウント データ構造へのポインターを取得します。ここで、子によって行われた変更が親に表示されます (mountコマンド自体が機能するため)。

CLONE_NEWNS でクローンを使用して子プロセスを作成すると、子はツリー内のマウント ポイント (5 & 6) の正確なコピーを取得し、元のツリーの残りの部分にアクセスできることを意味しますか?

はい。の呼び出し後、親とまったく同じツリーが表示されclone()ます。

親プロセスのマウント名前空間で5または6にマウントされているものに影響を与えることなく、子が5および6を自由にマウントできることも意味しますか。

はい。を使用CLONE_NEWNSしたため、子は 5 から 1 つのデバイスをアンマウントし、そこに別のデバイスをマウントでき、そのデバイス (およびその子) だけが変更を確認できます。この場合、他のプロセスは子によって行われた変更を見ることができません。

はいの場合、子が5または6とは異なるディレクトリをマウント/アンマウントし、親プロセスに表示されるものに影響を与える可能性があることも意味しますか?

いいえ。 を使用した場合CLONE_NEWNS、子で行われた変更は親に反映されません。

を使用していない場合CLONE_NEWNS、子は親と同じマウント名前空間データへのポインターを受け取り、子によって行われた変更は、親を含め、それらのデータ構造を共有するすべてのプロセスで確認されます。(これは、新しい子が を使用して作成された場合にも当てはまりfork()ます。)

于 2014-04-06T02:45:12.060 に答える
6

コメントを追加するのに十分な評判ポイントがないため、代わりにこのコメントを回答として追加します。これは、エメットの答えへの単なる追加です。

AFAICU、プロセスがCLONE_NEWNSフラグを設定して作成された場合、FS_USERNS_MOUNTフラグが設定されたファイルシステムのみをマウントできます。また、ほとんどすべてのディスク ベースのファイル システムは、このフラグを設定しません (セキュリティ上の理由により)。do_new_mount には、次のチェックがあります。

        if (user_ns != &init_user_ns) {
            if (!(type->fs_flags & FS_USERNS_MOUNT)) {
                    put_filesystem(type);
                    return -EPERM;
            }

私が間違っている場合は修正してください

于 2014-10-28T08:16:33.990 に答える