检查正在使用哪些网络块设备

检查正在使用哪些网络块设备

如何判断 /dev/nbd* 设备是否正在使用? “lsof”会告诉我吗?或者,还有更好的方法?是否有相当于“losetup -a”的东西可以告诉我下一个免费的?

答案1

man页面:

nbd-client -c /dev/nbdX

答案2

nbd-client -c /dev/nbdX没有正确完成工作。

它可能会告诉您,/dev/nbdX虽然它仍在内核驱动程序内部使用,但并未使用。在这种情况下,您既不会在 中也不会看到这dmsetup一点nbd-client

例子:

% nbd-client -c /dev/ndb2; echo $?
1
% e2fsck /dev/nbd2; echo $?
e2fsck 1.42.13 (17-May-2015)
/dev/nbd2 is in use.
e2fsck: Cannot continue, aborting.
8

实际上,您需要的第二个指标由以下内容揭示fsck

% strace e2fsck /dev/nbd2 2>&1 | grep open | grep /dev/nbd2
open("/dev/nbd2", O_RDONLY|O_EXCL) = -1 EBUSY (Device or resource busy)

将此与真正未使用的 NBD 设备进行比较:

% nbd-client -c /dev/ndb1; echo $?; strace e2fsck /dev/nbd1 2>&1 | grep open | grep /dev/nbd1
1
open("/dev/nbd1", O_RDONLY|O_EXCL) = 4

所以这是确定 a/dev/nbdX未被使用的正确方法:

nbd-available()
{
nbd-client -c "$1";
[ 1 = $? ] &&
python -c 'import os,sys; os.open(sys.argv[1], os.O_EXCL)' "$1" 2>/dev/null;
}
get-available-nbd()
{
local a;
for a in /dev/nbd[0-9] /dev/nbd[1-9][0-9];
do
  nbd-available "$a" || continue;
  echo "$a";
  return;
done
return 1;
}

像使用它一样nbd="`get-available-nbd`" || fail "no free NBD device"

相关内容