qemu-nbd命令是否有一个选项可以获取下一个空闲,即像losetup -f那样未使用的NBD? 0.0.1 的联机帮助页(这是 qemu 当前稳定版本 1.7.0 的版本)没有提及任何内容。
可以在sysfs中查询nbd设备的属性。
例如:
cat /sys/class/block/nbd0/size
如果 /dev/ndb0 正在使用,则返回 0,或映射图像文件的大小。
因此,您可以迭代每个设备,直到找到一个值为 0 的设备,然后尝试使用
qemu-nbd
进行尝试。
类似这样的事情应该做到:
for x in /sys/class/block/nbd* ; do
S=`cat $x/size`
if [ "$S" == "0" ] ; then
qemu-nbd -c /dev/`basename $x` some_file.img
break
fi
done
/bin/bash
:
# Of course this can be improved a lot, like returning after N NBDs found
get-free-nbds()
{
local -n l="$1";
local d;
for d in /sys/block/nbd[0-9]*;
do
[ -r "$d" ] && [ ! -s "$d/pid" ] && l+=("/dev/${d##*/}");
done;
[ -n "$l" ];
}
像这样使用它:
# put all free NBDs into array variable NBDs
get-free-nbds NBDs || { printf 'no free NBDs\n' >&2; exit 1; }
# check for 2 free NBDs
[ -n "${NBDs[1]}" ] || { printf 'we need 2 free NBDs, only %d free\n' "${#NDBs[@]}" >&2; exit 1; }
# Use them somewhere
use-nbds "${NBD[0]}" "${NBD[1]}"
像往常一样,可能会出现竞争,因为另一个进程可以在检测到空闲 NBD 后获取该空闲 NBD。