web-dev-qa-db-ja.com

マウント時の--rbindと--bindの違い

私は混乱しています。 Linuxファイルシステムは、ルートノード(開始ノード)をルートディレクトリとするツリー構造です。 /home/abcにフォルダabcがあり、/home/xyzに別のフォルダxyzがあるとします。

フォルダーxyzは、他のいくつかのフォルダーとその中のファイルで構成されます。 (ex defおよびmnoはその中のフォルダーです)

/
├── home/
│   ├── abc
│   └── xyz
│       ├── def
│       └── mno

コマンドを実行すると

mount --rbind /home/xyz /home/abc

(rbindは再帰的にバインドされます)xyz内のフォルダーabcのすべての内容が表示されます。さて、コマンドを実行すると

mount --bind /home/xyz /home/abc

xyz内のabcのすべてのコンテンツがまだ表示されます。

何故ですか?

--bindは、--rbindと同様に機能します。

7
Shray

--bind--rbindの両方で、バインドマウントの下にディレクトリが表示されることを正しく確認しました。

違いは、--rbindではなく--bindではなく、バインドマウントの下に他のバインドマウントの内容が表示されることです。


あなたの例に適用されるように、簡単にするために/home/xyz/def/home/xyz/mnoが空のディレクトリであると仮定します。さらに、バインドマウントとしてthemを使用するとします。つまり、それらをmount --bindまたはmount --rbindのマウントポイントとして使用します。これにより、空ではないように見えます。次に、以下を実行するとします。

mount --bind /home/xyz /home/abc

次に、/home/abc/def/home/abc/mnoの両方が存在しますが、再帰的ではないmount --bindを使用したため、空に表示されます。

対照的に、次のコマンドを実行して、代わりに/home/abcをバインドマウントにしたとします。

mount --rbind /home/xyz /home/abc

次に、/home/abc/def/home/abc/mnoの両方が存在しますそしてそれらは空ではないように見えます-これらには/home/xyz/defおよび/home/xyz/mnoバインドマウントの内容があります-なぜなら再帰的なmount --bindを使用しました。


完全に計算された例を次に示します。

ek@Gnar:~$ mkdir original
ek@Gnar:~$ touch original/a-regular-file
ek@Gnar:~$ mkdir original/a-directory
ek@Gnar:~$ mkdir parent-of-mountpoint
ek@Gnar:~$ mkdir parent-of-mountpoint/mountpoint
ek@Gnar:~$ Sudo mount --bind ~/original ~/parent-of-mountpoint/mountpoint
ek@Gnar:~$ mkdir nonrecursive-other-mountpoint recursive-other-mountpoint
ek@Gnar:~$ Sudo mount --bind ~/parent-of-mountpoint ~/nonrecursive-other-mountpoint
ek@Gnar:~$ Sudo mount --rbind ~/parent-of-mountpoint ~/recursive-other-mountpoint
ek@Gnar:~$ tree -F original/
original/
├── a-directory/
└── a-regular-file

1 directory, 1 file
ek@Gnar:~$ tree -F parent-of-mountpoint/
parent-of-mountpoint/
└── mountpoint/
    ├── a-directory/
    └── a-regular-file

2 directories, 1 file
ek@Gnar:~$ tree -F nonrecursive-other-mountpoint/
nonrecursive-other-mountpoint/
└── mountpoint/

1 directory, 0 files
ek@Gnar:~$ tree -F recursive-other-mountpoint/
recursive-other-mountpoint/
└── mountpoint/
    ├── a-directory/
    └── a-regular-file

2 directories, 1 file
ek@Gnar:~$ mount | grep ~
/dev/sda2 on /home/ek/parent-of-mountpoint/mountpoint type ext4 (rw,relatime)
/dev/sda2 on /home/ek/nonrecursive-other-mountpoint type ext4 (rw,relatime)
/dev/sda2 on /home/ek/recursive-other-mountpoint type ext4 (rw,relatime)
/dev/sda2 on /home/ek/recursive-other-mountpoint/mountpoint type ext4 (rw,relatime)
4
Eliah Kagan

読んだ - man 8 mount 。それは言う(強調が追加された):

バインドマウント

ファイル階層の一部を別の場所に再マウントします。呼び出しは次のとおりです。

mount --bind olddir newdir

または、このfstabエントリを使用して:

/olddir /newdir none bind

この呼び出しの後、同じコンテンツに2か所でアクセスできます。 1つのファイルを(1つのファイルに)再マウントすることもできます。バインドマウントを使用して、通常のディレクトリからマウントポイントを作成することもできます。次に例を示します。

mount --bind foo foo

bindマウントコールは、単一のファイルシステム(の一部)のみをアタッチし、サブマウントは不可能です。サブマウントを含むファイル階層全体は、を使用して2番目の場所にアタッチされます。

mount --rbind olddir newdir

ファイルシステムのマウントオプションは、元のマウントポイントのオプションと同じであることに注意してください。

1
waltinator