GNU/Linuxの場合ディレクトリとbtrfsサブボリュームの違いを知るための最良の方法はどのようなものですか?
私は彼らが同じに見えると仮定していることを知っています、そしてそれはクールです。しかし、メンテナンスの目的で、ディレクトリを見るときに、それが単なるディレクトリなのか、それともサブボリュームなのかを知りたいのです。 (さらに言えば、マウントされているかどうか、マウントされているかどうか、どのように、どこからマウントされているかを知っておくとよいでしょう。)
目的:たとえば、 ここ のように、サブボリュームの構造を変更したい。私が何をしているかを確認するために、何をしているかを確認する方法が必要です。ありがとう。 :-)
私が見たもの:
ls -d
またはtree -d
の出力はフォルダを表示しますが、directoriesとを区別しませんbtrfsサブボリューム。 ls -l
を使用すると、実際には同じに見えます。
ls --classify
およびls --file-type
であっても、この違いを明確に示していないようです。
可能な解決策:
フォルダーのiノード番号を確認できることがわかりました。これが256の場合、それはサブボリュームであると言えます。 (参照 1 、 2 、)
inode = 256を使用して、ディレクトリとサブボリュームを区別するのに最適なヒューリスティックですか?(基盤となるファイルシステムによっては、iノードが= 256になる別の理由があると想定しています。確実なチェックを行うには、問題のディレクトリがbtrfsファイルシステムの一部であることも確認する必要があります。)
別のアプローチコマンドbtrfs Subversion list .
を使用して、出力を解析する場合があります。場合によっては、btrfsディスク、ディスク、パーティション、または複数のパーティションのルートマウントを処理するために、これにmount | grep /\
などを追加する必要があります。
Future:サブボリュームとマウントポイントに関する情報を提供する新しいオプションがls
にあれば、すばらしいと思います。ソフトリンクの表示方法と同様の形式、つまり.
$ ls --show-mounts
/ <-- mounted from /dev/sdc
.snapshots <-- subvolume of /
shapshot <-- subvolume of .snapshots mounted to it's folder /2
背景:
ディレクトリとサブボリュームは、管理するものとは大きく異なります。
rmdir
またはrm -rf
を使用してサブボリュームを削除することはできませんが、代わりにbtrfs subvolume delete
を使用する必要があります。
また、特定のサブボリューム内にいない限り、ディレクトリやファイルをハードリンクすることはできません。
サブボリュームは自動マウントされているように見えますが、手動で別のマウントポイントにマウントすることもできます。
snapperを使用するか、スナップショットを作成する場合、スナップショットは実際にはサブボリュームであり、少なくとも特殊なタイプのサブボリュームです。
たとえば、ルートツリーは部分的に次のようになります。
/
/.snapshots
/.snapshots/1
/.snapshots/1/snapshot
/.snapshots/2
/.snapshots/2/snapshot
...
ここでは/1
と/2
だけが通常のディレクトリですが、/
、/.snapshots
、/snapshot
はbtrfsサブボリュームのようです。
stat(2)
によって返されるst_dev
フィールドは、ファイルを含むデバイスのIDと呼ばれ、BTRFSサブボリューム間およびファイルシステム間で異なります。コマンドラインを使用して、つまり
if [ btrfs != "$(findmnt -noFSTYPE --target=.)" ]
then
echo "not btrfs"
Elif findmnt . >/dev/null
then
echo "btrfs mountpoint"
Elif [ "$(stat -c%d .)" -ne "$(stat -c%d ..)" ]
then
echo "btrfs subvolume"
else
echo "btrfs directory"
fi
btrfs subvolume show /directory/in/question
ほとんどの場合、Sudo
が必要です。サブボリュームの場合、コマンドは成功します。それ以外の場合は失敗します。出力を/dev/null
にリダイレクトし、終了ステータスのみに依存することができます。
これは、ディレクトリツリーで利用可能なすべてのディレクトリをテストします。
Sudo find / -type d -exec sh -c '
for d do
btrfs subvolume show "$d" >/dev/null 2>&1 && printf "%s\n" "$d"
done' find-sh {} +
疑いの余地のないパスを除外することができます。次のコードでは、/proc
、/sys
、および/dev
を除外しています。
Sudo find / -type d \( \
\( -path /proc -Prune \) -o \
\( -path /sys -Prune \) -o \
\( -path /dev -Prune \) -o \
\( -exec sh -c '
for d do
btrfs subvolume show "$d" >/dev/null 2>&1 && printf "%s\n" "$d"
done
' find-sh {} + \) \)