リムーバブルハードドライブ(USB、しかし重要ではありません)を安全に取り外しできることを確認したいと思います。このドライブがsdb
。
明らかに、そのドライブにファイルシステムがマウントされていないことを確認する必要があります。grep /dev/sdb /proc/mounts
私に言うでしょう。
しかし、それはすべてではありません。たとえば、サーバーにLVM物理ボリュームがある場合は、サーバー上の物理ボリュームを含むすべてのボリュームグループを無効にするsdb
必要があります。 RAIDボリュームが存在する場合は、それを無効にする必要があるかもしれません()、そのコンポーネントにエラーが発生したとマークする必要があります()。sdb
lvchange -an my_volume_group/my_logical_volume
vgchange -an my_volume_group
mdadm -S
mdadm -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権限があると予想します。