qemu-nbd 的下一个免费设备选项

问题描述 投票:0回答:2

qemu-nbd命令是否有一个选项可以获取下一个空闲,即像losetup -f那样未使用的NBD? 0.0.1 的联机帮助页(这是 qemu 当前稳定版本 1.7.0 的版本)没有提及任何内容。

qemu
2个回答
6
投票

可以在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

0
投票

根据 https://sourceforge.net/p/nbd/mailman/nbd-general/thread/CAONrwUFBRk2qLXF7qYmqsQ8x6Oa95Qc4yUgNTxOWZcaLzv0-TA%40mail.gmail.com/ 我推荐如下

/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。

© www.soinside.com 2019 - 2024. All rights reserved.