バインドマウントとは何ですか?

バインドマウントとは何ですか?

「バンドルのインストール」とは何ですか?どうやって作りますか?利点は何ですか?

何かをするためにバインドマウントを使用するように言われましたが、それが何であるか、どのように使用するのかわかりません。

ベストアンサー1

バインドマウントとは何ですか?

バインドマウントディレクトリツリーの別のビューです。通常、インストール時にストレージデバイスビューがディレクトリツリーとして作成されます。対照的に、バインドマウントは既存のディレクトリツリーを取得し、別のポイントにコピーします。バインドマウントのディレクトリとファイルはソースと同じです。両方のビューは同じデータを表示するため、一方の変更はもう一方の側にもすぐに反映されます。

たとえば、Linuxコマンドを実行した後 -

mount --bind /some/where /else/where

ディレクトリ/some/where/else/where同じ内容、つまり/some/where。 (/else/where空でない場合、以前の内容は非表示になります。)

ハードリンクやシンボリックリンクとは異なり、バインドマウントはファイルシステムに保存されている内容には影響しません。これはリアルタイムシステムの属性です。

バンドルインストールをどのように作成しますか?

ファイルシステムバインディング

これbindfsファイルシステムはヒューズファイルシステムのディレクトリツリービューを作成します。たとえば、次のコマンドは

bindfs /some/where /else/where

マウントポイントを作成し/else/where、マウントポイントの下のコンテンツを/some/where表示します。

bindfsは別々のファイルシステムなので、ファイルと/some/where/fooアプリケーション/else/where/fooはアプリケーションに対して別のファイルとして表示されます(bindfsファイルシステムには固有のst_dev値があります)。一方の変更は他方にも「魔法のように」反映されますが、ファイルが同じであるという事実は、バインドがどのように機能するかを知っている場合にのみ明らかになります。

Bindfsはマウントポイントを認識しないため、その下にマウントポイントがある場合は、/some/whereその下に別のディレクトリとして表示されます/else/where。以下のファイルシステムをマウントまたはアンマウントすると、そのディレクトリに対する変更が/some/where表示されます。/else/where

Bindfsは特定のファイルメタデータを変更できます。つまり、ファイルの偽の権限と所有権を明らかにすることができます。より手動詳細については、以下の例をご覧ください。

binfsファイルシステムはrootではなくユーザーとしてマウントでき、FUSEファイルシステムをマウントするための権限のみが必要です。展開によっては、fuseグループに属する必要があるか、すべてのユーザーに許可する必要があります。 FUSEファイルシステムをアンマウントするには、fusermount -u代わりにumountを使用してください。

fusermount -u /else/where

空のファイルシステム

FreeBSDは以下を提供します。nullfsファイルシステムの代替ビューを生成するファイルシステム。次の2つのコマンドは同じです。

mount -t nullfs /some/where /else/where
mount_nullfs /some/where /else/where

2つのコマンドのいずれかを実行すると、その内容のマウントポイントが表示され/else/whereます。/some/where

nullfsは別々のファイルシステムなので、ファイル/some/where/foo/else/where/fooアプリケーションはアプリケーションに対して異なるファイルとして表示されます(nullfsファイルシステムには固有のst_dev値があります)。一方の変更はすべて反対側に「魔法のように」反映されますが、ファイルが同じであるという事実は、nullfsがどのように機能するかを知っている場合にのみ明らかになります。

ディレクトリツリーレベルで動作するFUSE binfsとは異なり、FreeBSDのnullfsはカーネルの奥深くに動作するため、以下のマウントポイントは/else/where表示されません。/some/where以下に反映されているのと同じマウントポイントの一部であるツリーのみが表示されます/else/where

nullfsファイルシステムは、他のBSDバリアント(OS X、OpenBSD、NetBSD)で使用できますが、基本システムの一部としてコンパイルされません。

Linuxバインドマウント

Linuxでは、バインドマウントをカーネル機能として使用できます。次のコマンドを使用して作成できますmount--bindコマンドラインオプションまたはbindインストールオプションを渡してコマンドを実行します。次の2つのコマンドは同じです。

mount --bind /some/where /else/where
mount -o bind /some/where /else/where

ここで、「デバイス」/some/whereは、ディスクファイルシステムなどのディスクパーティションではなく、既存のディレクトリです。通常通り、マウントポイントは既存のディレクトリでなけれ/else/whereばなりません。ファイルシステムタイプはどちらにも指定されません。バインドマウントの実行には、元のマウントからカーネルデータ構造をコピーするファイルシステムドライバは含まれません。

mount --bindまた、非ディレクトリを非ディレクトリにマウントする機能もサポートされています。/some/whereこれは通常のファイルにすることができます(この場合は通常のファイルでなければなりません/else/where)。

Linuxバンドルインストールは、rawインストールとほとんど区別できません。このコマンドは、df -T /else/where同じデバイスと同じファイルシステムタイプを表示しますdf -T /some/where。これらのファイルは、ハードリンクのように互いに区別することはできません/some/where/foo/else/where/foo削除することができ/some/where、この場合はインストール/else/whereされたままになります。

以前のカーネルの場合(正確にいつであるかはわかりません。いくつかの3.xまでは思います)、バンドルインストールと元のカーネルの間には実際に違いはありません。最新のカーネルはバインドマウントを追跡し、<code/proc/を介して情報を公開します。PID/mountinfo: 以下を許可します。findmntバンドルのインストールを指示します。

にバインドマウント項目を入れることができます/etc/fstab。他のオプションと一緒にオプションに含めるbind(またはなど)するだけです。rbind「デバイス」は既存のツリーです。ファイルシステム列には、noneまたはを含めることができますbind(無視されますが、ファイルシステム名を使用すると混乱する可能性があります)。たとえば、

/some/where /readonly/view none bind,ro

下にマウントポイントがある場合、/some/whereその内容は下に表示されません/else/where。代わりに、以下のコピーされたマウントポイントを使用することもできますbind。たとえば、マウントポイントの場合rbind/some/where/some/where/mnt

mount --rbind /some/where /else/where

等しい

mount --bind /some/where /else/where
mount --bind /some/where/mnt /else/where/mnt

また、Linuxではマウントを次のように宣言できます。共有奴隷プライベートまたはバインドできません。これは、マウントポイントを複製するバインドマウントにマウント操作が反映されているかどうかに影響します。詳細については、次を参照してください。カーネル文書

Linuxはまた、マウントの移動方法(マウントポイントの--bindコピーと移動)を提供します。--move

2つのバンドルインストールディレクトリには異なるインストールオプションがあります。しかし、珍しいことがあります。バインドマウントを実行してマウントオプションを設定することは原子的には実行できず、2回の連続操作を実行する必要があります。 (以前のカーネルではこれを許可しません。)たとえば、次のコマンドは読み取り専用ビューを生成しますが、/else/where短時間の読み取り/書き込みが可能です。

mount --bind /some/where /else/where
mount -o remount,ro,bind /else/where

バインドマウントを操作できません!

システムがFUSEをサポートしていない場合、同じ効果を得るための一般的な方法は、NFSサーバーを実行して公開したいファイルをエクスポート(アクセスを許可localhost)して同じシステムにマウントすることです。これはメモリとパフォーマンスの面でかなりのオーバーヘッドがあるため、バインドマウントは利用可能な場合は明らかな利点があります(FUSEのため、ほとんどのUnixバリアントにあります)。

はい

読み取り専用ビュー

セキュリティ上の理由から、または誤って変更しないように、セキュリティ層でファイルシステムの読み取り専用ビューを作成すると便利です。

バインドを使用してください:

bindfs -r /some/where /mnt/readonly

Linuxの場合、簡単な方法は次のとおりです。

mount --bind /some/where /mnt/readonly
mount -o remount,ro,bind /mnt/readonly

/mnt/readonlyこれにより、読み出しと書き込みの間に短い間隔が生じる。これがセキュリティ上の問題の場合は、まずルートのみアクセスできるディレクトリにバインドマウントを作成し、それを読み取り専用にしてからパブリックマウントポイントに移動します。以下のコードスニペットでは、/root/privateマウントポイントの上のディレクトリがプライベートであることに注意することが重要です。元の権限は/root/private/mntマウントポイントの後ろに隠されているため、関係ありません。

mkdir -p /root/private/mnt
chmod 700 /root/private
mount --bind /some/where /root/private/mnt
mount -o remount,ro,bind /root/private/mnt
mount --move /root/private/mnt /mnt/readonly

ユーザーとグループの再マッピング

ファイルシステムは、数値IDでユーザーとグループを記録します。場合によっては、同じ人物に異なるユーザーIDを割り当てる複数のシステムが発生することがあります。これはネットワークアクセスの問題ではありませんが、ディスク上のデータをあるシステムから別のシステムに転送すると、ユーザーIDが意味をなさなくなります。 AliceのユーザーIDが1000で、BobのユーザーIDが1001のマルチユーザーファイルシステム(ext4、btrfs、zfs、UFSなど)を使用してシステムにディスクを作成し、ディスクを使用可能にしたいとします。 AliceのユーザーIDが1001で、BobのユーザーIDが1000のシステムで。ディスクが直接マウントされると、AliceのファイルはBobが所有しているように見え(ユーザーIDは1001なので)、BobのファイルはAliceが所有しているように見えます(ユーザーIDは1000なので)。

Bindfsを使用してユーザーIDを再マップできます。まず、ルートのみにアクセスできるようにプライベートディレクトリにディスクパーティションをマウントします。次に、パブリック領域にbinfsビューを作成し、ユーザーIDとグループIDを再マップして、AliceとBobのユーザーIDとグループIDを交換します。

mkdir -p /root/private/alice_disk /media/alice_disk
chmod 700 /root/private
mount /dev/sdb1 /root/private/alice_disk
bindfs --map=1000/1001:1001/1000:@1000/1001:@1001/1000 /root/private/alice_disk /media/alice_disk

バラよりシステムを起動しないユーザーのホームフォルダにあるファイルへのアクセスを許可するには?そしてmount - 他のユーザーを自分でバインドする他の例。

刑務所またはコンテナに設置

chroot 刑務所またはコンテナシステムディレクトリツリーのサブツリーでプロセスを実行します。これは、独自のファイルと提供されているファイルにのみアクセスでき、同じコンピュータに保存されている他のデータにはアクセスできないネットワークサーバーを実行するなど、アクセス制限のあるプログラムを実行するのに役立ちます。 chrootの1つの制限は、プログラムがサブツリーに制限されることです。つまり、独立したサブツリーにアクセスできません。バインドマウントを使用すると、他のサブツリーをメインツリーに結合できます。これは、Linuxでコンテナを最も実用的に使用するための基盤となります。

たとえば、マシンだけ/usr/sbin/somethingdがアクセスできるサービスを実行しているとします/var/lib/something。これら2つのファイルを含む最小のディレクトリツリーはルートディレクトリです。サービスをどのように制限しますか?一つの可能​​性/usr/sbin/somethingd/var/lib/something。より良い解決策は、一時ルートを作成し、インストールで埋めることです。/var/lib/something/usr

mkdir /run/something
cd /run/something
mkdir -p etc/something lib usr/lib usr/sbin var/lib/something
mount --bind /etc/something etc/something
mount --bind /lib lib
mount --bind /usr/lib usr/lib
mount --bind /usr/sbin usr/sbin
mount --bind /var/lib/something var/lib/something
mount -o remount,ro,bind etc/something
mount -o remount,ro,bind lib
mount -o remount,ro,bind usr/lib
mount -o remount,ro,bind usr/sbin
chroot . /usr/sbin/somethingd &

Linuxマウントネームスペースchroot を一般化します。バインドマウントは、柔軟な方法でネームスペースを埋める方法です。バラよりプロセスが同じファイル名を持つ別のファイルを読み取るようにします。例えば。

各種ディストリビューションの実行

chrootのもう1つの目的は、基本システムに存在しない場合や、異なる内容のハードコーディングされたパスにファイルが必要な場合でも、ディレクトリに別のディストリビューションをインストールし、そのディストリビューションでプログラムを実行することです。たとえば、混合パッケージをサポートしていない64ビットシステムに32ビットディストリビューションをインストールしたり、以前のバージョンのディストリビューションや他のディストリビューションをインストールして互換性をテストしたり、最新バージョンをインストールしてテストしたりする場合に便利です。 。最新機能を搭載するとともに、安定したベースシステムの維持などより64ビットDebian / Ubuntuで32ビットプログラムを実行するにはどうすればよいですか?Debian/Ubuntu を例に挙げます。

ディストリビューションの最新パッケージがディレクトリにインストールされていると仮定すると、を使用してその/f/unstableディレクトリに切り替えてプログラムを実行できますchroot /f/unstable。このインストールでホームディレクトリを使用できるようにするには、そのホームディレクトリをchrootにバインドマウントします。

mount --bind /home /f/unstable/home

プログラムシュルートこれは自動的に行われます。

マウントポイントの後ろに隠されたファイルにアクセスする

ディレクトリにファイルシステムをマウントすると、ディレクトリの後ろの内容が非表示になります。このディレクトリのファイルは、ディレクトリがアンマウントされるまでアクセスできません。 BSD nullfs および Linux バインドマウントはマウントインフラストラクチャより低いレベルで動作するため、ファイルシステムの nullfs マウントまたはバインドマウントは元のサブマウントの後ろに隠されたディレクトリを公開します。

たとえば、tmpfsファイルシステムがにマウントされているとします/tmp/tmptmpfsファイルシステムの作成時にファイルが存在した場合、そのファイルはそのまま残り、事実上アクセスできませんが、ディスク容量を占有できます。走る

mount --bind / /mnt

(Linux)または

mount -t nullfs / /mnt

(FreeBSD)にルートファイルシステムのビューを作成します/mnt。このディレクトリ/mnt/tmpはルートファイルシステムのディレクトリです。

別のパスにNFSをエクスポートする

一部のNFSサーバー(NFSv4以前のLinuxカーネルNFSサーバーなど)は、ディレクトリをエクスポートするときに常に物理ディレクトリの場所を宣伝します。つまり、クライアントが要求すると、server:/requested/locationサーバーはその場所でツリーを提供します/requested/location。場合によってはクライアント要求を許可し/request/locationますが、実際に提供することが/actual/location望ましい場合は、NFSサーバーが代替の場所の提供をサポートしていない場合、予想される要求のバインドマウントを作成できます。

/requested/location *.localdomain(rw,async)

そして/etc/exports/etc/fstab

/actual/location /requested/location bind bind

シンボリックリンクの代替

/some/where/is/my/file時には、ファイルが下に表示されるようにシンボリックリンクを作成したいが、使用/else/where中のアプリケーションがfileシンボリックリンクを拡張して拒否することがあります/some/where/is/my/file。バインドマウントはこの問題を解決でき/some/where/is/myます/else/where/is/myrealpathダウンではなくダウン/else/where/is/my/fileとして報告されます。/else/where/some/where

バインドマウントの副作用

再帰的なディレクトリの探索

バインドマウントを使用する場合は、バックアップやインデックスなど、ファイルシステムツリーを繰り返し参照するアプリケーションを処理する必要があります(例:場所データベース)。

通常、各ディレクトリツリーが元の場所で一度だけ移動されるように、バインドマウントを再帰ディレクトリ検索から除外する必要があります。可能であれば、binfs と nullfs を使用し、これらのファイルシステムタイプを無視するようにナビゲーションツールを設定します。 Linuxバンドルマウントはこの方法では認識されません。新しい場所は元の場所と同じです。 Linuxバインドマウントを使用するか、パスのみを除外でき、ファイルシステムタイプを除外できないツールを使用する場合は、バインドマウントのマウントポイントを除外する必要があります。

ファイルシステム境界(たとえばfind -xdev、、、rsync -x... du -x)で停止するナビゲーションは、マウントポイントが異なるファイルシステムであるため、binfsまたはnullfsマウントポイントに遭遇すると自動的に停止します。 Linuxバインドマウントの場合、状況はもう少し複雑です。ファイルシステムの境界は、バインドマウントが同じファイルシステムの他の部分を移植するのではなく、異なるファイルシステムを移植する場合にのみ存在します。

バンドルのインストール以上

バンドルマウントは、さまざまな場所のディレクトリツリービューを提供します。異なるマウントオプションと(bindfsを使用)、異なる所有権と権限を使用して同じファイルを公開します。ディレクトリツリーの変化するビューを提供するファイルシステムファイルシステムの上書きまたはスタック型ファイルシステム。高度な変換を実行できる他のオーバーレイファイルシステムがたくさんあります。以下はいくつかの一般的な事項です。必要なユースケースがここで取り上げられていないことを確認してください。FUSEファイルシステムリポジトリ

表示されるファイルのフィルタリング

  • 貝殻- ファイルの読み取り中にウイルススキャナーを介してファイルを実行します。

  • フィルター— ファイルシステムの一部を隠す

  • ロープス— 読み取り専用ビューです。に似ていて、bindfs -rより軽いです。

  • アライアンスマウント— ファイルシステムが複数あります(木の枝)単一のディレクトリに:とがtree1含まれている場合は、統合ビューにもとが含まれます。新しいファイルは、特定のブランチまたはより複雑なルールに従って選択されたブランチに記録されます。この概念は、次のようなさまざまな方法で実装できます。footree2barfoobar

ファイル名とメタデータの変更

  • CIOPFS- 大文字と小文字を区別しないファイル名(Windowsファイルシステムをマウントするのに役立ちます)
  • ファイルシステム変換— 文字セット間でファイル名を変換します(はい)
  • ポジショブル- Unixファイル名とその他のメタデータ(権限、所有権など)をVFAT(はい)

変更されたファイルの内容を見る

コンテンツの保存方法の変更

おすすめ記事