ファイルまたはディレクトリがどのサブボリュームにあるかを確認したいと思います。たとえば、サブボリュームのマウントポイント/mnt/btrfs-subvol
とディレクトリがあり、それを/mnt/btrfs-subvol/some/dir
実行した場合。something /mnt/btrfs-subvol/some/dir
btrfs-subvol
私が考えることができる最善の方法は、戻ってstat
256個のinodeで各ディレクトリをテストすることですが、それが唯一の方法とは想像できません。それとも走ることができます。
until btrfs sub show `pwd`; cd ..;done; echo `pwd`
しかし、私はもう少しエレガントな解決策が必要だと思います。
答え1
これが利用可能でありstat
(POSIXでは不要)、そのオプションが十分に豊富である場合、次のコマンドは次のようになります。
stat --format=%m /mnt/btrfs-subvol/some/dir
欲しいものを教えてくれます。コメントはdir
どんなタイプでも構いません。文書、必ずしもディレクトリである必要はありません。
メモ:
マニュアル
%m
にはBtrfsのマウントポイントを意味するとされていますが、これはやや誤解を招くことがあります。 Kubuntu 18.04.5 LTSでテストしたところ、明示的なマウントポイントではない(/mnt/btrfs-subvol/
つまりmount whatever /mnt/btrfs-subvol/
発生しなかった)サブボリューム(/
またはとして明示的にマウントされたサブボリューム内/mnt/
)の場合、コマンドはマウントとして処理されます。指す。これがあなたが望むようです。出力は、デバイスのBtrfsディレクトリ(およびサブボリューム)ツリーの有効なパスではなく、オペレーティングシステムのディレクトリ構造内の有効なパスです(違いがわからない場合は、以下を参照してください)。この問題そして私の答え)。今回もこの動作が正確にあなたが望む動作のようです。
このコマンドは、Btrfs以外のファイルシステム(Kubuntuから
stat --format=%m /dev/null
印刷/dev
など)で機能します。明らかに、他のファイルシステムには通常、サブボリュームの概念はありません。探しているファイルがBtrfsファイルシステムにあることを最初に確認する必要があるかもしれません。stat --file-system --format=%T /mnt/btrfs-subvol/some/dir
この内容が表示されたら、デフォルト
btrfs
のコマンドを使用してサブボリュームを探します。残念ながら、1回の呼び出しでstat
2つの情報(インクルードまたは除外)を印刷する方法はありません。--file-system
上記の結論は、2回実行する必要があることを意味します
stat
。dir
ルートの下に同じコンテンツが表示されるという保証はありません/mnt/btrfs-subvol/some/dir
。途中でいくつかの(削除)インストールが発生した場合はどうなりますか?比較するトゥクトゥ。 Linuxでは、stat
ファイル記述子を使用して、TOCTOUなしで同じファイルで2つのsを確実に実行できます。( stat --dereference --file-system --format=%T /proc/self/fd/3 stat --dereference --format=%m /proc/self/fd/3 ) 3</mnt/btrfs-subvol/some/dir
シンボリックリンク自体の場合、
dir
コマンドはそれに従います。後で作業できるようにサブボリュームを知りたい場合があります。何があっても、あなたはそれを道として扱うでしょう。使用前に状況が変わることがあり、TOCTOUがあなたに当たる可能性があります。
関連パスがあなたの同意なしに意味を変更しないと確信している場合は、
stat
sとその結果を簡単な方法で処理できます。私のテストでは、
stat --file-system …
動作は次のとおりですstat --file-system --dereference …
。これは、ターゲットファイルがシンボリックリンクの場合、sがstat
あるかどうか、または--file-system
(両方とも明示的に)一貫性のない結果を生成できることを意味します。--dereference