ln -s
とmount --bind
の使用の違いを理解しようとしています。基本的なシナリオでは、両方を使用して別の場所から1つのディレクトリにアクセスできます。これらの2つの動作はどのようなシナリオで異なりますか?
これらは、少なくとも2つの場合に異なる動作をします。
A
)がマウントされている何か(B
)へのシンボリックリンクにも拡張されます。リンクには、元の(B
)ではなく、マウントターゲット(A
)の内容が表示されます。また、既存のディレクトリまたはファイルにディレクトリまたはファイルをバインドマウントし、元のコンテンツをマスクできます(元のコンテンツが他の場所にバインドマウントされていない限り、元のコンテンツにアクセスできなくなります)。シンボリックリンクでは、オリジナルを移動または削除する必要があります。
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/mount
とls /var/target
は同じディレクトリであるため、/var/mount
を実行すると、/var/target
を実行した場合と同じことが起こります。 。
マウントはファイルではありません。 /var/mount
の名前を変更または削除しようとするとどうなるかわかりません。 /var/mount
には何もマウントできないことに注意してくださいnless/var/mount
に既にディレクトリがあります.
さらに、ln -sは再起動後も存続します。一方、mount --bindは、/ etc/fstabを編集して永続化しない限り、そうしません。
他の答えに加えて。システムは、ディレクトリへのハードリンクを許可しません。
# 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(読み取り専用)を要求した場合でも、マウントは引き続き読み書きされます。