有没有一种便捷的方式获取所有信息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)