findmnt list バインドはどのようにマウントされますか?

findmnt list バインドはどのようにマウントされますか?

多くの人は、Linuxはバインドマウントに関する情報を保持していないので、バインドマウントのリストとソースを取得する方法がないと言います。ここにいくつかの例があります。

  • ~からここでコメントの一つ:

    IIRC この情報はどこにも保存されません。結局のところ、mount --bind両方のコピーは同じであり、どちらも他のコピーよりも「オリジナル」ではありません。最終的に削除した場合は、オリジナルを持つことはできません/mnt

  • ~からこのサイトの回答:

    したがって、どのマウントがバインドマウントであるかを覚える唯一の方法は、に留まることです/etc/mtab。バインドマウント操作はバインドマウントオプションとして表示されます(これによりファイルシステムの種類は無視されます)。ただし、マウントには、特定のオプションセットでマウントされたファイルシステムのみを一覧表示するオプションはありません。

  • ~からDebian のバグ報告:

    これは意図的なものです。両方のマウントポイントはすべての点でまったく同じであるため、カーネルはそれらを区別するためのフラグを保持しません。

上記の内容はすべて言葉にならない内容だが。このツールは、findmntバインドマウントへのソースパスを一覧表示できますdevice[source-path]ただデバイスの代わりにソースパス)。 Linuxカーネルがバインドマウントを維持するには、この情報を保存する必要があります。どこかに/homeそうでなければそれが何であるかわかりません/users。では、このデータはどこにありますか? RAMのあいまいな領域に保存されていますか?findmntどこかでそれをお探しですか/proc

答え1

2つのマウントポイントを少し誤解しました。同じこれは、権限、フラグなどの観点から、バインディングがアクセスをあるパスから別のパスに効果的にリダイレクトするためです。しかし、彼らはまだ明らかに

見てみると/proc/self/mountinfo、プロセスのマウントされた世界のカーネルビューを見ることができます(名前空間は状況をより複雑にします)。一つインストールテーブルを見る)。

man 5 procファイル形式は説明されていますが、ツリー階層とバンドルマウントの「親」位置を表示できます。これは解析されたファイルですfindmnt

答え2

Linux は次の情報を保持しません。バインドマウントはどのマウントですか?。次の情報を保持します。固定マウントを含むすべてのマウント

これはハードリンクと非常によく似ています。ファイル名が inode に接続されるように、マウントはファイルシステムに接続されます。唯一の違いは、マウントにもマウントポイント固有のフラグがあり、ファイルシステムのルートではなくターゲットファイルシステムのサブディレクトリを参照できることです。

ハードリンクを作成すると、ファイルシステムはどのファイル名が元のファイル名で、どのファイル名がハードリンクであるかを保存しません。どちらも同じインデックスノードを参照します。元のファイルのリンクを解除すると、2番目のファイル名で直接ファイルを作成することと状況が変わりません。

バインドマウントに戻ります。カーネルは、ファイルシステム(メイン:サブペアとして識別されます)、マウントポイント、ファイルシステムルートへの相対パス、およびいくつかのフラグを含むテーブルを保持します。を見ると、このリストにアクセスできます/proc/self/mountinfo。 (@stephen-harrisが述べたように、名前空間が関連している場合、状況はより複雑になります。)findmntこのリストを分析してください。

ルートが/dev/sda1major:minor8:1で、実行にmount --bind /a /b /proc/self/mountinfo次の行が含まれる場合:

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro

major:minorを使用し/homeて実行すると、次のようになります。/dev/sda28:2mount --bind /home /users

1 0 8:1 / / rw - ext4 /dev/sda1 rw,errors=remount-ro
2 1 8:2 / /home rw - ext4 /dev/sda2 rw
3 1 8:2 / /users rw - ext4 /dev/sda2 rw

あなたの質問に関連する列は3番目、4番目、5番目の列です。これはファイルシステムIDです(本物ファイルシステムtmpfsなどの仮想ファイルシステムの場合は、デバイスmajor:minorと同じです。カウンター])、マウントポイントにバインドされたファイルシステムのルートへの相対パス(通常は/通常マウントの場合はバインドマウントの場合は何でも可能)、およびマウントポイントです。
残りの列の意味については、次を参照してください。Linuxカーネルドキュメント

findmntソースパスはファイルシステムルート「FSROOT」に基づいています。これを利用しfindmnt -o TARGET,FSROOTて得ることができます。絶対ソースパスが必要な場合は、/proc/self/mountinfoそれを直接解析し、同じファイルシステムのマウント情報と組み合わせる必要があります。

詳細については、次を参照してください。「バンドルマウントのみ一覧表示」への私の答え

関連情報