web-dev-qa-db-ja.com

ディレクトリとサブボリュームを区別するにはどうすればよいですか?

GNU/Linuxの場合ディレクトリとbtrfsサブボリュームの違いを知るための最良の方法はどのようなものですか

私は彼らが同じに見えると仮定していることを知っています、そしてそれはクールです。しかし、メンテナンスの目的で、ディレクトリを見るときに、それが単なるディレクトリなのか、それともサブボリュームなのかを知りたいのです。 (さらに言えば、マウントされているかどうか、マウントされているかどうか、どのように、どこからマウントされているかを知っておくとよいでしょう。)

目的:たとえば、 ここ のように、サブボリュームの構造を変更したい。私が何をしているかを確認するために、何をしているかを確認する方法が必要です。ありがとう。 :-)


私が見たもの:

ls -dまたはtree -dの出力はフォルダを表示しますが、directoriesを区別しませんbtrfsサブボリュームls -lを使用すると、実際には同じに見えます。

ls --classifyおよびls --file-typeであっても、この違いを明確に示していないようです。


可能な解決策:

フォルダーのiノード番号を確認できることがわかりました。これが256の場合、それはサブボリュームであると言えます。 (参照 12 、)


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サブボリュームのようです。

3
Elliptical view

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
1
izmw1cfg
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 {} + \) \)
1