web-dev-qa-db-ja.com

ln -sとmount --bindの違いは何ですか?

ln -smount --bindの使用の違いを理解しようとしています。基本的なシナリオでは、両方を使用して別の場所から1つのディレクトリにアクセスできます。これらの2つの動作はどのようなシナリオで異なりますか?

32
Łukasz

これらは、少なくとも2つの場合に異なる動作をします。

  • chroot では、リンクターゲットがchrootの外側にある場合、リンクは無効になります。バインドマウントは引き続きアクセス可能です。
  • いくつかのプログラムは、シンボリックリンクと実際のディレクトリまたはファイルを区別できます。ディレクトリまたはファイルとその上にマウントされたものを区別できるものはほとんどありません。これは、何か(A)がマウントされている何か(B)へのシンボリックリンクにも拡張されます。リンクには、元の(B)ではなく、マウントターゲット(A)の内容が表示されます。

また、既存のディレクトリまたはファイルにディレクトリまたはファイルをバインドマウントし、元のコンテンツをマスクできます(元のコンテンツが他の場所にバインドマウントされていない限り、元のコンテンツにアクセスできなくなります)。シンボリックリンクでは、オリジナルを移動または削除する必要があります。

33
muru

ln -sはシンボリックリンクを作成しますが、mount --bindはマウントを作成します。

シンボリックリンクは特別な種類のファイルです。 ln -s /var/target /var/linkを実行すると、/var/linkはパス「/var/target」を含むファイルになります。シンボリックリンクと通常のファイルの唯一の違いは、プログラムがシンボリックリンクで操作を実行しようとすると、通常、ファイルではなくターゲットで操作が実行されることです。したがって、ls /var/linkを実行すると、lsプログラムは/var/linkのディレクトリ一覧を取得しようとしますが、実際には/var/targetのディレクトリ一覧を取得します。

ただし、シンボリックリンクはまだ単なるファイルです。名前を変更して削除することができます。 /var/linkというファイルが既にある場合は、/var/linkというシンボリックリンク(または通常のファイル)を作成できないことに注意してください。最初にそれを取り除く必要があります。

マウントはファイルではありません。カーネルがメモリに保持する記録です。 mount --bind /var/target /var/mountを実行すると、カーネルは/var/mount/var/targetの新しい名前になったことを記録します。 (詳細はわかりません。特に、/var/targetのサブディレクトリに何かをマウントすると/var/mountにも表示されるかどうか、またはその理由と理由がわかりません。この回答をいただければ幸いです。)ls /var/mountls /var/targetは同じディレクトリであるため、/var/mountを実行すると、/var/targetを実行した場合と同じことが起こります。 。

マウントはファイルではありません。 /var/mountの名前を変更または削除しようとするとどうなるかわかりません。 /var/mountには何もマウントできないことに注意してくださいnless/var/mountに既にディレクトリがあります.

13
Tanner Swett

さらに、ln -sは再起動後も存続します。一方、mount --bindは、/ etc/fstabを編集して永続化しない限り、そうしません。

10
Mark Williams

他の答えに加えて。システムは、ディレクトリへのハードリンクを許可しません。

# ln mydir mpoint
ln: `mydir': hard link not allowed for directory

マウントを使用すると、ハードリンクのような、つまり同じ1つのiノードに対して2つ以上の名前を作成できます。

# mount -B mydir/ mpoint/
# ls -d -i *
807175  mpoint/  807175  mydir/

(古いバージョンのrsyncを使用したスナップショットバックアップに役立ちます。)

また、このマウントは完全ではないことに注意してください。

# mount -B -oro mydir/ mpoint/
mount: warning: mpoint/ seems to be mounted read-write.
# mount | grep mpoint
/root/learn/mydir on /root/learn/mpoint type none (rw,bind)

そのため、オプションro(読み取り専用)を要求した場合でも、マウントは引き続き読み書きされます。

2
Udi