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


36

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


7
に警告する必要rm -rがありmount --bindます。aのln場合、リンクを削除しますが、aの--bind場合rm -r、ターゲットでを実行するのと同じ効果があります。私はすぐに私のサーバーのいずれかを再構築する前に見られるような...、良いではない
マーク・K・コーワン

@MarkKCowanこれは、ハードリンクを作成しない限り当てはまります。
ジョニーキュー

@JohnnyQことはできませんハードリンクディレクトリ
マーク・K・コーワン

回答:


33

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

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

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


16

さて、マウントを作成するのln -sに対し、シンボリックリンクをmount --bind作成します。

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

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

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

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


1
mount --bindを使用したことはありませんが、のようなsymlinkの動作を再現できるとは思えませんln -s ../../myfile .。別のディレクトリに移動すると、相対リンクであるため、別の場所をポイントします。これは、サブツリーをバックアップする必要があり、バックアップでリンクが機能する場合に役立ちます。
ジョー14

10

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


2

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

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

マウントを使用すると、ハードリンクのように、つまり同じ1つのiノードに複数の名前を付けることができます。

# 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(読み取り専用)を要求した場合でも、マウントは引き続き読み取りと書き込みを行います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.