GNU/Linuxでディレクトリとbtrfsサブボリュームを区別する最良の方法は何ですか?
私はそれらが同じように見なければならないことを知っている。それは素晴らしいです。しかし、メンテナンス目的でディレクトリを表示するときは、それが単純なディレクトリかサブボリュームかを知りたいと思います。 (その場合はインストールされているか、インストールされている場合はどのように、どこにインストールされているかを知ることをお勧めします。)
目的:たとえば、提案されているようにサブボリュームの構造を変更したいと思います。ここ。私が何をしているのかを確認する方法が必要です。ありがとうございます。 :-)
私が見たもの:
出力ls -d
またはtree -d
フォルダを表示するが区別しない目次そしてBtrfs サブボリューム。それらを使用すると、ls -l
実際には同じように見えます。
でもls --classify
そしてls --file-type
この区別は明確ではないようです。
考えられる解決策:
フォルダのinode番号を確認できることがわかりました。256これはサブボリュームであることを意味します。 (参考資料1、2、サム)
それでは、inode = 256を使用することがディレクトリとサブボリュームを区別するための最良の経験的方法ですか? (一部のデフォルトファイルシステムでは、inode = 256の別の理由がある可能性があると仮定しています。したがって、確実に確認するには、問題のディレクトリがbtrfsファイルシステムの一部であることを確認する必要があります。)
別の方法おそらく、コマンドを渡してbtrfs subversion list .
出力を解析することです。mount | grep /\
btrfsディスク、ディスク、およびパーティションのルートマウント(適切な場合)を処理するには、このエントリまたは同様のエントリを追加する必要があります。
未来: 新しいオプションがあればいいと思います。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
。特定のサブボリュームにないと、ディレクトリまたはファイルをハードリンクできません。
サブボリュームは自動的にマウントされているように見えますが、別のマウントポイントに手動でマウントすることもできます。
使用する場合ドミまたは、実際にはサブボリュームまたは少なくとも特殊なタイプのサブボリュームであるスナップショットを撮ります。
例えば、ルートツリーは次のとおりです。
/ /.snapshots /.snapshots/1 /.snapshots/1/snapshot /.snapshots/2 /.snapshots/2/snapshot ...
ここにのみ、および
/1
通常/2
のディレクトリがあり、、、およびbtrfsサブボリュームのようです。/
/.snapshots
/snapshot
答え1
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 {} + \) \)
答え2
st_dev
返されるフィールド(stat(2)
ファイルを含むデバイスの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