どのネットワークブロックデバイスが使用されているかを確認してください

どのネットワークブロックデバイスが使用されているかを確認してください

/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

実際に必要な2番目の指標は次のように表示されます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

したがって、以下は/dev/nbdXaが使用されていないことを確認する正しい方法です。

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"

関連情報