mount --bindをシンボリックリンクの代わりとして使用することには、欠点がありますか?


55

シンボリックリンクのようなどのような機能に制限が持っているlsmvと、cpシェルのようなコマンドを開始したとは違っているので、それらを操作することができcd、これらの機能は、ユーザが論理パスに対するディレクトリのアクセス方法についての情報を持っていない(関連参照ポスト)。mount --bind代わりにオプションを使用するとこれを回避でき、リンクの代わりにマウントされたディレクトリに2つの独立した物理パスがあるため、sambaや他のファイルサーバーとの機能と互換性が向上します。

mount --bindこのオプションを使用して、すべてのシンボリックリンクを参照に置き換えたいと思いますが、これはfstabで150ポイント以上をマウントすることを意味します。これまたは潜在的に考慮すべきその他の欠点から生じる可能性のあるパフォーマンスの問題はありますか?


ハードリンクの使用を検討しましたか?
ire_and_curses

1
@ire_and_curses Unixライクなシステムのほとんどは、正当な理由でハードリンクを禁止しています(同じ理由で、できる限りシステム上でハードリンクを使用しないでください)。
エリアケイガン

3
@ire_and_curses:Eliahの声明を明確にするために、ディレクトリへのハードリンクを作成することはできません(ただし、HFS +はある程度サポートしています)。また、ハードリンクの再帰ツリーを作成しても、両方のディレクトリパスの同期は維持されません。
バハマ

回答:


62

ではmount --bind、ディレクトリツリーは、ディレクトリ階層内の2つ(またはそれ以上)の場所に存在しています。これは多くの問題を引き起こす可能性があります。バックアップおよびその他のファイルのコピーは、すべてのコピーを選択します。ファイルシステムをコピーすることを指定することが難しくなります。バインドマウントされたファイルを2回コピーすることになります。で検索しfindgrep -rlocate、など、その上のすべてのコピーを横断し、かつます。

バインドマウントによる「機能と互換性の向上」は得られません。他のディレクトリのように見えますが、ほとんどの場合、これは望ましい動作ではありません。たとえば、Sambaはデフォルトでシンボリックリンクをディレクトリとして公開します。バインドマウントを使用しても何も得られません。一方、バインドマウントは、NFSを介してディレクトリ階層を公開するのに役立ちます。

バインドマウントでパフォーマンスの問題は発生しません。あなたが持っているのは、管理の頭痛です。バインドマウントには、chrootからディレクトリツリーにアクセスできるようにする、マウントポイントによって隠されたディレクトリを公開するなどの用途があります(これは通常、ディレクトリ構造の再構築中の一時的な使用です)。必要がない場合は使用しないでください。

ルートのみがバインドマウントを操作できます。通常の方法では移動できません。彼らは自分の場所と祖先ディレクトリをロックします。

一般的に、コマンドにシンボリックリンクを渡すと、コマンドは、ファイルで動作する場合はリンク自体で動作し、ファイルの内容で動作する場合はリンクのターゲットで動作します。これはディレクトリにも当てはまります。これは通常正しいことです。一部のコマンドは、例えば、別々にシンボリックリンクを治療するためのオプションがありls -Lcp -drsync -l。何をしようとしても、バインドが適切なツールであるよりも、シンボリックリンクが適切なツールである可能性がはるかに高くなります。


ありがとう。バックアップ、コピー、ファイル検索への影響を考慮していなかったと思います。私はsmb.confに 'follow symlinks = yes'を追加することでSambaにシンボリックリンクを追跡させることができましたが、これはセキュリティを危険にさらします。システムファイルへのアクセス。これを回避する方法を見つけようとしています。知っていたら教えてください。
-mrtrujiyo

2
@mrtrujiyoその要件に関しては、chrootでsambaサーバーを実行し、そのchroot内でエクスポートしたいディレクトリをバインドマウントするのが理にかなっていると思います。バックアップなどからchrootのルートを除外するようにしてください(この組織では、トップレベルのディレクトリを1つだけ除外する必要があるため、メンテナンスの面倒はあまりありません)。
ジル 'SO-悪であるのをやめる

14

@Gillesが以前に書いことに加えて、一部のユーティリティバインドマウントされたディレクトリを別のファイルシステムと見なす可能性があることに注意してください。プログラムが同じiノード番号が同じファイルを参照することを前提とできない場合(異なるファイルシステム上にある場合はそうではない)、これはパフォーマンスまたは機能に影響を与える可能性があります。 target-then-unlink-sourceなど


ありがとう。dfやduのような単純なユーティリティが、バインドマウントを使用したファイルシステムでのディレクトリサイズの計算をどのように処理するのか疑問に思いました。
mrtrujiyo

1
少なくともdf私のシステムのGNU では、デフォルトではバインドマウントされたディレクトリさえ考慮されていませんが、特に尋ねられた場合、同じファイルシステムの別のマウントとして扱われます。(あなたが私に尋ねると、これはdfの目的を持つツールに期待される動作です。)
CVn

6

また、常に配置されているとは限らないサポート(外部ディスクなど)に依存している場合、シンボリックリンクの代わりにバインドマウントを使用し、サポートがあっても元のディレクトリ構造が配置されていることを確認する必要があります失敗するか、削除されます。

たとえば、/ var / tmpをsdカードに保持したい場合は、バインドマウントを使用します。これは、カードが取り外されても、/ var / tmpが有効なディレクトリであると想定するプログラムがあるためです。


1

私はいくつかのパッケージをインストールする問題を回避するためにマウントバインドを試してみましたpacman(archlinux、そのここで詳細システム上)/var(など/home/usr/local)したシンボリックリンク(:SSD SATAにファイルシステム全体で)。

最初は見栄えが良かったのですが、Gillesが指摘したように、locatePRUNE_BIND_MOUNTS = "yes"行にもかかわらず、1つのファイルに対して常に複数の結果を出しました/etc/updatedb.conf

$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2

さらに掘り下げてみると、より複雑なバインドマウントが正しくプルーニングされることがわかりました。

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
Rebuilding bind_mount_paths:
Matching bind_mount_paths:
Skipping `/SHARED/LOCALS/Manjaro/common': bind mount
Skipping `/usr/local/common': bind mount

$ locate \*/mmedia
/SHARED/LOCALS/common/mmedia

PRUNE_BIND_MOUNTオプションがなければ、3つの結果が得られます。

$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
$ locate \*/mmedia
/SHARED/LOCALS/Manjaro/common/mmedia
/SHARED/LOCALS/common/mmedia
/usr/local/common/mmedia
$ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf 

バインドマウントに関する別の問題:

もちろん、バインドマウント(mounpointまたはtarget)をPRUNEPATHSinに手動で追加でき /etc/updatedb.confます。

また、mountpointさまざまなstatコマンドまたは機能をツールで使用して、ここで提案されているファイルシステムの走査を改善できます。


0

ファイルバインドマウントに関しては、シンボリックリンクよりもハードリンクに近い動作をします。これは、例えば次のような微妙な結果をもたらす可能性があります。

# echo 1 > 1.txt
# touch 2.txt
# mount --bind 1.txt 2.txt
# cat 2.txt
1
# echo 1a > 1.txt
# cat 2.txt
1a

これまでのところは良いが、実際にファイルを変更するプログラム(エディター、適切に記述されたスクリプトなど)の数を考慮してください。

# echo 1new > 1new.txt
# mv 1new.txt 1.txt
# cat 1.txt
1new
# cat 2.txt
1a

それ2.txtまでのシンボリックリンクだった1.txt場合、最後のコマンドはoutputを持ち1new、これはおそらく予想されるものです。

これは、いくつかの微妙な問題を引き起こす可能性があります:にsystemdに私が使っていたBindReadOnlyPaths=特定のサービスの利用に異なる作るためにresolv.conf、システムの他の部分よりもファイルを、しかしのでそれは方法を診断するために奇妙な、ハードにフレーク状であることが判明しresolvconfます置き換えるの背後にあるソースファイルをサービスが戻ってきました。

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