すべての情報を便利に入手する方法はありますか?BTFSファイルシステムサブボリュームCに頼らず、つまりPOSIXシェル?
/sys/fs/btrfs
サブボリュームではなくファイルシステムに関する情報のみが含まれているため、現在の一時フォルダにすべてのファイルシステムをマウントしてを使用して検索し、結果のbtrfs subvol list
出力を解析します。言うまでもなく、これはかなり醜いものです。
これは3.16.xカーネルとbtrfs-progs v3.14.1(在庫Ubuntu 14.10以降)。
以下は、現在使用中の(醜い)スクリプトです。私は必要な情報を得るために純粋なCを使うことができることを知っていて、最終的にそうするでしょう。しかし、もっとシンプルでエレガントな方法があるのだろうか。
#!/bin/bash
for i in /sys/fs/btrfs/*[!features]; do
device="/dev/$(basename $i/devices/*)"
mountpoint=/var/lib/btrfs/tmp/mnt/$(basename "$i")
[ -d "$mountpoint" ] || mkdir "$mountpoint"
grep -qs $mountpoint /proc/mounts
[ $? -ne 0 ] && mount -v "$device" "$mountpoint"
while read -r subvol; do
# whatever you want
done < <(btrfs subvolume list "$mountpoint")
umount $mountpoint
rmdir $mountpoint
done
答え1
/sys/fs/btrfs
Debian / Ubuntu(4.14.0-1/4.10.0-42)でテストされたすべてのbtrfsファイルシステムはリストされていません(マウント解除されたファイルシステムなど)。
btrfs progsを使用して検索します。
btrfs filesystem show | awk '/ path /{print $NF}'
btrfs progsはfsがマウントされているサブボリュームのみをリストすることができるので、あなたのスクリプトは私が使用しているものと大きく変わりません。
#!/bin/bash
readarray -t btdev < <(sudo btrfs filesystem show | awk '/ path /{print $NF}' )
for i in "${btdev[@]}"; do
device="${i}"
mountpoint=/var/lib/btrfs/tmp/mnt/$(basename "$i")
[ -d "$mountpoint" ] || mkdir "$mountpoint"
grep -qs $mountpoint /proc/mounts
[ $? -ne 0 ] && mount -v "$device" "$mountpoint"
while read -r subvol; do
# whatever you want
done < <(btrfs subvolume list "$mountpoint")
umount $mountpoint
rmdir $mountpoint
done
マルチデバイスファイルシステムではテストされていません(raid-0/1/10/5/6)