我想确保可安全移除可移动硬盘(USB,但这不重要)。假设这个驱动器是sdb
.
显然我需要确保该驱动器上没有安装文件系统。grep /dev/sdb /proc/mounts
会告诉我的。
但这还不是故事的全部。例如,如果 上有一个 LVM 物理卷sdb
,我需要停用包含位于sdb
(lvchange -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 权限。