web-dev-qa-db-ja.com

Linuxでマウント名前空間がどのように機能するかを理解する

mount namespaces について読んでいます。

マウント名前空間では、ホストファイルシステムに影響を与えることなく、ファイルシステムをマウントおよびアンマウントできます。そのため、完全に異なるデバイスのセットをマウントできます(通常は少なくなります)。

linux名前空間 やLXCなどを理解しようとしていますが、上記のステートメントの意味がよくわかりません。

私が理解しようとしているのは、コンテナ(1)が次のようなファイルをどのように持つことができるかです。

/foo/a.txt
/foo/bar/b.txt

そして、別のコンテナ(2)は次のようなファイルを持つことができます:

/foo/a.txt
/foo/x.txt
/foo/bar/b.txt
/foo/bar/y.txt

どこ /foo/a.txtおよび/foo/bar/b.txtコンテナ(1)と(2)は同じpathですが、おそらく内容が異なります:

# container (1)
cat /foo/a.txt #=> Hello from (1)

# container (2)
cat /foo/a.txt #=> Hello from (2)

これは、物理システム上のファイル(私は何も知らない)が一方向に保存されていることを意味します。しかし、「仮想」ファイルの集中データベースオペレーティングシステム内は、次のようになります。

db:
  container1:
    foo:
      a.txt: Hello from a from (1)
      bar:
        b.txt: Hello from b from (1)
  container2:
    foo:
      a.txt: Hello from a from (2)
      x.txt: Hello from x from (2)
      bar:
        b.txt: Hello from b from (2)
        y.txt: Hello from y from (2)

次に、次のような物理ファイル用のanother OSデータベースがあります。

drive1:
  dir1:
    foo:
      a.txt
      bar:
        b.txt
  dir2:
    foo:
      a.txt
      x.txt
      bar:
        b.txt
        y.txt

したがって、コンテナにファイルを作成すると、実際には2つの新しいレコードが作成されます。

  1. ドライブレベルの物理ファイルマップの場合は1
  2. コンテナレベルの仮想ファイルマップの場合は1

これは私がそれが機能すると想像する方法です。これは、(1)ユーザーに(LXCコンテナまたはcgroup(これについてはあまり知りません))にwhat feel like完全な "ファイルを提示する方法があることを確認する方法ですシステム」では、(2)独自の完全にカスタマイズ可能なディレクトリ構造(まったく異なる仮想ファイルシステムと同じ名前のファイル/ディレクトリ/パスを持つ場合があります)を作成できます。これにより、(3)複数の異なる仮想ファイルファイルシステム/コンテナはお互いを上書きしません。

これがどのように機能するか、そうでない場合は実際にどのように機能するか(またはそれがどのように機能するかの概要)。

2
Lance Pollard

マウント名前空間は、マウントされたファイルシステムの配置が異なります。

マウントはファイルシステム内のサブディレクトリのバインドマウントになるため、これは非常に柔軟です。

_# unshare --mount  # run a Shell in a new mount namespace

# mount --bind /usr/bin/ /mnt/
# ls /mnt/cp
/mnt/cp

# exit  # exit the Shell, and hence the mount namespace

# ls /mnt/cp
ls: cannot access '/mnt/cp': No such file or directory
_

findmntコマンドを使用して、現在のマウントのセットを一覧表示できます。

完全なコンテナでは、ルートマウントが置き換えられ、完全に別のマウントツリーで作業します。これには、pivot_root()システムコールなどの追加の詳細が含まれます。おそらく、その方法を正確に知る必要はありません。いくつかの詳細はここにあります: Linux名前空間でchrootを実行する方法?

1
sourcejedi