findmntはどのようにバインドマウントを一覧表示できますか?


11

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

  • ここのコメントの1つから:

    IIRCこの情報はどこにも保持されませんmount --bind。2つのコピーは同等であり、もう一方よりも「オリジナル」なものはありません。結局のところ、すでにマウントを解除して/mntいると、オリジナルは存在しません。

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

    したがって、どのマウントがバインドマウントであったかを記憶する唯一の方法は、に残って/etc/mtabいるマウントコマンドのログです。バインドマウント操作は、バインドマウントオプションで示されます(ファイルシステムタイプが無視されます)。しかし、mountには、特定のオプションセットでマウントされたファイルシステムのみをリストするオプションはありません。

  • Debianのバグレポート

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

上記はナンセンスです。このツールfindmntは、バインドマウントのソースパスを一覧表示できます(の形式で、デバイスではなくソースパスのみdevice[source-path]を一覧表示することも試みています)。Linuxカーネルがバインドマウントを維持する場合は、その情報をどこかに保存する必要があります。それ以外の場合は、バインドされていることがわかりません。では、このデータはどこにあるのでしょうか?RAMのあいまいな領域に格納されていますか?DOESはに見てどこか?/home/usersfindmnt/proc


findmnt実行しているのはどのバージョンで、どのオプションを使用していますか?鉱山はそれをそのように出力せず、使用しているように見えるソースコードを見ると、この情報も含まれていない_PATH_PROC_MOUNTINFOように見え/proc/self/mountinfoます。
Bratchley 2016

OK /proc/self/mountinfo比較的最近再構築されたと思います。私は以前RHEL6マシンを使用していましたが、パス情報がありませんでしたが、私のRHEL7マシンはそうであり、あなたのリンクで述べたようにWheezyも同様です。
Bratchley 2016

それはナンセンスではありません。古いカーネルでも同じでしたが、新しいカーネルは情報を追跡します。
Gilles「SO-邪悪なことをやめなさい」

@Gillesでは、あるディレクトリが別のディレクトリにマウントされているという情報が追跡されない場合、バインドマウントはどのように存続するのでしょうか。
MELAB

@Melab実際には、バインドマウントであることを追跡しないと、バインドマウントが存続しやすくなります。とき/dev/Aに装着されている/Bと、あなたはmount --bind /B /C、古いカーネルは唯一覚えている/B → /dev/A/C → /dev/A、彼らはとの一切の関係覚えていない/Bとします/C。アンマウントだから/B自然には影響を与えません/C。新しいカーネルは、それ/Cがのバインドマウントだったことを覚えていますが、マウント解除されても動作し続けることを/B妨げないので、正確な方法はわかりません。/C/B
Gilles「SO-邪悪なことをやめなさい」2016

回答:


12

あなたは少し誤解しました。バインドは1つのパスから別のパスにアクセスを効果的にリダイレクトするため、2つのマウントポイントは、アクセス許可、フラグなどの点で同等です。しかし、それらはまだ区別されます。

見てみると/proc/self/mountinfo、このプロセスのマウントワールドのカーネルビューが表示されます(名前空間は物事をより複雑にします。マウントテーブルのビューが1つだけではありません)。

man 5 procこのファイルの形式について説明しますが、ツリー階層とバインドマウントの「親」の場所を確認できます。これはfindmnt解析するファイルです。


9

Linuxは、どのマウントがバインドマウントであったかに関する情報を保持しません。バインドマウントを含むすべてのマウントに関する情報を保持します

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

ハードリンクを作成すると、ファイルシステムはどのファイル名が元のファイル名で、どのファイル名がハードリンクだったかを保存しません。どちらも単に同じiノードを指します。元のファイルのリンクを解除すると、2番目のファイル名でファイルを直接作成した場合と区別がつかなくなります。

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

ルートが/dev/sda1major:minorで8: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

あなた/home/dev/sda2major:minor 8:2を使用して実行したmount --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などの仮想ファイルシステムの場合は[0:カウンター ])、マウントポイントにバインドされているファイルシステムルートからの相対パス(通常/マウント、バインドマウントの場合は何でもかまいません)およびマウントポイント。
残りの列の意味については、Linuxカーネルのドキュメントを参照してください。

findmntファイルシステムのルート「FSROOT」からの相対パスを呼び出します。あなたはfindmnt -o TARGET,FSROOTそれを手に入れることができます。絶対ソースパスが必要な場合は、おそらく/proc/self/mountinfo自分で解析して、同じファイルシステムのマウントに関する情報を組み合わせる必要があります。

詳細については、「バインドマウントのみを一覧表示する」に対する私の回答を参照しください。


/proc/self/mountinfoような行を含めることができる場合2 1 8:1 /a /b rw - ext4 /dev/sda1 rw,errors=remount-ro、Linux バインドマウントに関する情報を確実に保持します。
Melab、2017

いいえ、私の2番目の例を見てください。マウントされたファイルシステムと、ファイルシステムルートからの相対パスがマウントされた情報を保持します。そうするためにmount --bind /home/melab /mnt結果の行がどのに応じて、次のいずれかのように見えるかもしれません/homeし、/home/melabマウントポイントである:3 1 8:1 /home/melab /mnt rw - ext4 /dev/sda1 rw3 1 8:2 /melab /mnt rw - ext4 /dev/sda2 rw3 1 8:3 / /mnt rw - ext4 /dev/sda3 rw
cg909

/4列目とは異なることがバインドマウントを示していることがよくあります。ただし、Btrfsサブボリュームの場合もあります。
cg909 2017

され/dev/sda3にマウントされることになって/home/melab
Melab 2017

はい。私の例では私が使用し/dev/sda1//dev/sda2など/home/dev/sda3など/home/melab
cg909
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.