ブロックデバイスが使用されるすべての方法を一覧表示します。

ブロックデバイスが使用されるすべての方法を一覧表示します。

リムーバブルハードドライブ(USB、しかし重要ではありません)を安全に取り外しできることを確認したいと思います。このドライブがsdb

明らかに、そのドライブにファイルシステムがマウントされていないことを確認する必要があります。grep /dev/sdb /proc/mounts私に言うでしょう。

しかし、それはすべてではありません。たとえば、サーバーにLVM物理ボリュームがある場合は、サーバー上の物理ボリュームを含むすべてのボリュームグループを無効にするsdb必要があります。 RAIDボリュームが存在する場合は、それを無効にする必要があるかもしれません()、そのコンポーネントにエラーが発生したとマークする必要があります()。sdblvchange -an my_volume_group/my_logical_volumevgchange -an my_volume_groupmdadm -Smdadm -f

ディスクが使用されるすべての方法を一覧表示する方法はありますか?マイユースケースでは、リストが空の場合にデバイスを分離できるように、このリストが完全であることを確認する必要があります。

答え1

ブロックデバイスを開くことができる場合は、O_EXCLまだカーネルで使用されていません(O_EXCLこの特別な場合はデバイスロックが必要です)。 lsof(/procスキャン)は他のユーザーを見つける必要があります(仮想マシンではデバイスが開いている可能性があり、通常は単独で開くことはできません)。

答え2

Gabrielの答えに+1 - これはO_EXCLまさにこの状況で使用されたソリューションです。以下は、デバイスが使用中であることを確認するために作成したPerl関数です。

use Fcntl;
use Errno;

sub device_in_use($)
{
  my $device = shift;
  # open with O_EXCL returns EBUSY if a device is in use
  # http://www.kernel.org/doc/man-pages/online/pages/man2/open.2.html
  return $!{EBUSY} if (!sysopen my $fh, $device, O_EXCL);
  close $fh;
  return 0;
}

ただし、適切なエラー処理機能がないことに注意してください。つまり、デバイスが存在し、ユーザーにroot権限があると予想します。

関連情報