이동식 하드 드라이브(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;
}
그러나 적절한 오류 처리 기능이 없다는 점에 유의하세요. 즉, 장치가 존재하고 사용자에게 루트 권한이 있을 것으로 예상합니다.