블록 장치가 사용되는 모든 방법을 나열합니다.

블록 장치가 사용되는 모든 방법을 나열합니다.

이동식 하드 드라이브(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;
}

그러나 적절한 오류 처리 기능이 없다는 점에 유의하세요. 즉, 장치가 존재하고 사용자에게 루트 권한이 있을 것으로 예상합니다.

관련 정보