列出块设备的所有使用方式

列出块设备的所有使用方式

我想确保可安全移除可移动硬盘(USB,但这不重要)。假设这个驱动器是sdb.

显然我需要确保该驱动器上没有安装文件系统。grep /dev/sdb /proc/mounts会告诉我的。

但这还不是故事的全部。例如,如果 上有一个 LVM 物理卷sdb,我需要停用包含位于sdblvchange -an my_volume_group/my_logical_volume然后vgchange -an my_volume_group)上的物理卷的所有卷组。如果存在 RAID 卷,我可能需要停用它 ( mdadm -S),或者我可能希望将该组件标记为故障 ( mdadm -f)。

有没有办法列出磁盘的所有使用方式?对于我的用例,我需要确信此列表是详尽的,以便在列表为空时我可以拔下设备。

答案1

如果您能够打开块设备O_EXCL,则内核尚未使用它(O_EXCL在这种特殊情况下需要设备锁)。 lsof(/proc 扫描)应该找到任何其他用户(虚拟机可能打开设备,并且通常无法以独占方式打开)。

答案2

加布里埃尔的答案+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 权限。

相关内容