findmnt結果リストからバインドマウントを除外する方法は?

findmnt結果リストからバインドマウントを除外する方法は?

Bashスクリプトには次の行があります。

TARGETS="$(findmnt -n -v -t btrfs -o TARGET --list)"
UUIDS="$(findmnt -n -v -t btrfs -o UUID --list)"

私は一部のサーバー(Arch Linuxを実行)でこのスクリプトを実行しています。ただし、NFSサーバーでは失敗します。この場合、findmnt は次を返します。マルチマウントポイント特定のUUIDの場合(NFSサーバーのバインドマウントによる)ㅏ必要私のスクリプトの最終結果はリストを取得することです。UUIDごとに1つのマウントポイント

ここで本当に良い答えを見つけました(「興味深い」マウントポイントのみを表示/面白いタイプのフィルタリング)そこで議論されたすべての提案を試しましたが、与えられたUUIDに対して複数のマウントポイントを返すfindmntを削除することはできません。問題がバインドマウントによってのみ発生する冗長性によって範囲が狭くなったにもかかわらずです。 (私が逃したものは何ですか?)

一時的な回避策として表示したいインストールのみを含む制限付きタブファイルを作成し、-Ffindmntのオプションを使用しました。私のカスタムタブファイルは、すべてのバインドマウントが削除されたfstabのコピーです。

TARGETS="$(findmnt -n -v -t btrfs -o TARGET --list -F /etc/fstab.custom)"
UUIDS="$(findmnt -n -v -t btrfs -o UUID --list -F /etc/fstab.custom)"

明らかに、これは/etc/fstabに変更が適用され、私のカスタムタブファイルが手動で更新されない場合は壊れやすいアプローチです。 (また、カスタムファイルの重複を引き起こすいくつかの非バンドルインストールを手動で削除する必要があるため、現段階では確かに信頼できるソリューションではありません。)

希望の結果を得るためのより良い方法はありますか?私はこれを想像できます可能この問題は、findmntフィルタを使用するか、findmntから返されたリストに適用された外部フィルタを使用して解決できます。

すべてのバインドマウントは「/srv/nfs/」で始まります。これをリストからフィルタリングすることは良いスタートになります。ただし、これはかなり脆弱な解決策であると考えられます(いつか誰かがNFSバインドマウントがサーバー上でどのように構成されるかを変更することを決めることができるからです)。

また、私はbashやawkに精通しておらず、findmntから返された結果を後処理する適切な方法がわかりません。私はそれについて考えました:

findmnt -n -t btrfs -o UUID,TARGET --list | grep -v -E "/srv/nfs|.tapp|/var/log"

しかし、これはパス名を変更すると壊れるため、カスタムタブファイルと同じくらい脆弱なようです。

findmnt -n -t btrfs -o UUID,TARGET --list以下は、私のシステムの1つが返すものの例です(マウントポイントが単純化されています)。

473c1g34-23ec-41dd-671f-c71473ad7d36 /
473c1g34-23ec-41dd-671f-c71473ad7d36 /srv/nfs/foo/wunder
473c1g34-23ec-41dd-671f-c71473ad7d36 /srv/nfs/foo/tinder
473c1g34-23ec-41dd-671f-c71473ad7d36 /.tapp
473c1g34-23ec-41dd-671f-c71473ad7d36 /var/log
473c1g34-23ec-41dd-671f-c71473ad7d36 /var/log/.tapp
13f4361e-771e-44b3-7413-a613bf4e331b /bar
13f4361e-771e-44b3-7413-a613bf4e331b /srv/nfs/bar/user1/Documents
13f4361e-771e-44b3-7413-a613bf4e331b /srv/nfs/bar/user6/Desktop
13f4361e-771e-44b3-7413-a613bf4e331b /srv/nfs/bar/user3/Documents
13f4361e-771e-44b3-7413-a613bf4e331b /srv/nfs/bar/user4/Documents
13f4361e-771e-44b3-7413-a613bf4e331b /srv/nfs/bar/user5/Documents
13f4361e-771e-44b3-7413-a613bf4e331b /srv/nfs/bar/user6/Documents
13f4361e-771e-44b3-7413-a613bf4e331b /bar/.tapp
3ac663cc-e7e4-4764-7a7a-1d3fa16b376b /foo/files
3ac663cc-e7e4-4764-7a7a-1d3fa16b376b /srv/nfs/foo/files
4c61646e-1a1d-4d67-7d47-1446e41d6341 /bar/baz
4c61646e-1a1d-4d67-7d47-1446e41d6341 /srv/nfs/bar/baz/goop/stuff
4c61646e-1a1d-4d67-7d47-1446e41d6341 /srv/nfs/bar/baz/goop/widgets
4c61646e-1a1d-4d67-7d47-1446e41d6341 /srv/nfs/bar/baz/pie
4c61646e-1a1d-4d67-7d47-1446e41d6341 /srv/nfs/bar/baz/goop/gadgets
4c61646e-1a1d-4d67-7d47-1446e41d6341 /bar/baz/.tapp

すべてのnfsバインドマウント(/ srv / nfsで始まるマウント)と/ .tappと/ var / logを含むすべてのマウントポイントをフィルタリングする必要があります。 findmntオプションを使用してこれを行う方法はありますか?そうでない場合は、bashでどうすればよいですか?

修正する:質問に集中するためにfindmnt結果リストからバインドマウントを除外する方法があることを嬉しく思います。答えを提供するために、/ var / logによって生成されたものなど、他の重複したマウントポイントを無視してもかまいません。

アップデート2:json 形式の findmnt 出力の例です。保存したい出力でバインドマウントとバインドマウント(/foo/files)を区別する方法が見つかりませんでした。

{"target": "/srv/nfs/bar/user1/Documents", "uuid": "13f4361e-771e-44b3-7413-a613bf4e331b"},
{"target": "/srv/nfs/home/user5/Desktop", "uuid": "13f4361e-771e-44b3-7413-a613bf4e331b"},
{"target": "/srv/nfs/home/user3/Documents", "uuid": "13f4361e-771e-44b3-7413-a613bf4e331b"},
{"target": "/srv/nfs/home/user4/Documents", "uuid": "13f4361e-771e-44b3-7413-a613bf4e331b"},
{"target": "/foo/files", "uuid": "3ac663cc-e7e4-4764-7a7a-1d3fa16b376b"},

ベストアンサー1

~からバンドルマウントのみ一覧表示、バインドマウントはマウント後に元のマウントと区別できないようです。部分バインディング(マウントポイントのサブディレクトリにどこかにマウントバインディングがある)が出力に異なるように表示されますが、findmnt他の場所にマウントバインディングがあるマウントポイントを区別する方法はありません。

その場合は、次のようにしてください。

sudo mount -o bind / /srv
sudo mount -o bind /media /mnt

/とのインストール情報は区別できませんが、 と/srvは区別できるようです。/media/mnt

したがって、残りは単に重複した項目を削除することですfindmnt

findmnt -n -t btrfs -o UUID,TARGET -r | awk '!a[$1]++'

-r代わりに、このオプションを使用すると、-l出力から特殊文字をエスケープしてパスを安全に処理できます。

$ findmnt -n -t ext4 -o UUID,TARGET -r
d4873b63-0956-42a7-9dcf-bd64e495a9ff /
..
d4873b63-0956-42a7-9dcf-bd64e495a9ff /srv/media
d4873b63-0956-42a7-9dcf-bd64e495a9ff /a\x20b
d4873b63-0956-42a7-9dcf-bd64e495a9ff /srv/a\x20b

ここでa bは にエスケープされますa\x20bprintf "%b"以下を使用してbash内のエスケープ文字を拡張できます。

$ findmnt -n -t ext4 -o UUID,TARGET -r | bash -c 'while read -r uuid point; do printf "%b\n" "$point"; done'
/
...
/srv/media
/srv/a b
/a b
/srv/a b

おすすめ記事