「バンドルのインストール」とは何ですか?どうやって作りますか?利点は何ですか?
何かをするためにバインドマウントを使用するように言われましたが、それが何であるか、どのように使用するのかわかりません。
ベストアンサー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
。/tmp
tmpfsファイルシステムの作成時にファイルが存在した場合、そのファイルはそのまま残り、事実上アクセスできませんが、ディスク容量を占有できます。走る
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/my
。realpath
ダウンではなくダウン/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
含まれている場合は、統合ビューにもとが含まれます。新しいファイルは、特定のブランチまたはより複雑なルールに従って選択されたブランチに記録されます。この概念は、次のようなさまざまな方法で実装できます。foo
tree2
bar
foo
bar
- オブ—Linuxカーネルの実装ですが、アップストリームで何度も拒否されました
- 機能— ヒューズの実装
- マルチメディアファイルシステム- FUSE、利用可能なスペースに基づいてブランチにファイルを書き込みます。
- 書く— Linux カーネルの実装、Linux v3.18 でアップストリームをマージする
- UnionFS ヒューズ- FUSE、キャッシュ、書き込み時のコピー機能を含む
ファイル名とメタデータの変更
- CIOPFS- 大文字と小文字を区別しないファイル名(Windowsファイルシステムをマウントするのに役立ちます)
- ファイルシステム変換— 文字セット間でファイル名を変換します(はい)
- ポジショブル- Unixファイル名とその他のメタデータ(権限、所有権など)をVFAT(はい)
変更されたファイルの内容を見る
- AVFS- 各アーカイブファイルのアーカイブコンテンツを含むディレクトリ(はい、その他の例)。もっとあります特定のアーカイブをディレクトリに公開するFUSEファイルシステム。
- ヒューズ- テキストファイルやメディアファイルを再エンコードするなど、ファイルを読み取るときにパイプを介してファイルを実行します(はい)
- リゾフ— 圧縮ファイルの透明な解凍
- mp3fs- FLACファイルを読み込み、MP3にトランスコードします(はい)
- スクリプトファイルシステム- コンテンツ(一種の基本CGI)を提供するスクリプトを実行します(はい)
コンテンツの保存方法の変更
- シロン後— ファイルを複数のプライマリリポジトリにコピーします(ディレクトリツリーレベルのRAID-1)
- ファイルのコピー- ファイルのすべてのバージョンのコピーをアーカイブします。
- 環境ファイルシステム— ファイル暗号化
- PCachefs— 低速リモートファイルシステム用のディスクキャッシュ層
- 単純な牛- 元のファイルをそのまま維持しながら、メモリに表示されているビューを介して変更を保存します。
- 往復旅行- ファイルのすべてのバージョンのコピーをアーカイブします。