프로그래밍 방식으로 파일 시스템의 블록 장치 식별 [닫기]

프로그래밍 방식으로 파일 시스템의 블록 장치 식별 [닫기]

다음 코드는 RedHat 7에서 사용 df verison 8.2및 테스트 되었습니다 lsblk version 2.23.2. lsblk 유틸리티에는 RedHat 6 버전(2.17.2)보다 더 많은 출력 옵션이 있으므로 이는 중요합니다.

파일이 포함된 파일 시스템을 결정하는 것은 매우 쉽습니다.

df -h /path/to/file | tail -n 1 | awk '{print $1}'

그러나 어떤 블록 장치에 파일 시스템이 포함되어 있는지 확인하는 것은 매우 어렵습니다. 물론 블록 장치를 수동으로 결정하는 방법을 사용할 수도 있지만 lsblk -f이를 자동화된 방법으로 수행하는 방법을 알고 싶습니다.

나는 꽤 깊이 파고 들었지만 이것을 할 수있는 방법을 찾지 못했습니다. 일반적인 사용 사례가 있는 것 같아서 이상합니다(드라이브의 디렉터리를 스캔하고 스캔한 물리적 디스크의 일련 번호를 다시 가져옵니다!).

나는 보기 흉한 텍스트 구문 분석을 수행하는 재귀적 bash 함수를 만들었습니다. 작동하지만 이상해 보입니다. lsblk 문서에서는 해당 --output스위치를 사용하면 버전 업데이트에 대한 안정적인 스크립트를 갖게 될 것이라고 제안하는 것 같습니다.

function findBlockDevice {
  fileSystem="${1}"
  count="${2}"

  potentialBlockDeviceOutput=$(lsblk --paths --output name,type | grep "${fileSystem}" -B${count} | head -n 1)
  blockDevice=$(echo ${potentialBlockDeviceOutput} | awk '{print $1}')
  blockType=$(echo ${potentialBlockDeviceOutput} | awk '{print $2}')

  if [[ "${blockType}" != "disk" ]]; then
    count=$(( count + 1 ))
    findBlockDevice "${fileSystem}" "${count}"
  else
    echo "${blockDevice}"
  fi
}

용법:

# Assume directory is on /dev/sda1
scanDirectory='/media/suspiciousDrive'
fileSystem=$(df -h ${scanDirectory} | tail -n 1 | awk '{print $1}')
blockDevice=$(findBlockDevice ${fileSystem} 0)

echo "${fileSystem}" # /dev/sda1
echo "${blockDevice}" # /dev/sda

# Now we can get the disk information to use in a report
lsblk --nodeps --paths --pairs --output NAME,SERIAL,MOUNTPOINT,VENDOR,\
    FSTYPE,UUID,MODEL,SIZE,TYPE,WWN,STATE ${fileSystem}

편집: 파일 시스템과 디스크가 제공될 때 lsblk 유틸리티에서 반환된 결과가 다르기 때문에 df의 출력은 충분하지 않습니다. 다음 명령은 파일 시스템뿐만 아니라 전체 블록 장치가 주어지면 다양한 정보를 반환합니다.

# Run this on your machine and notice the significant difference
lsblk --nodeps --paths --pairs --output NAME,SERIAL,VENDOR,MODEL /dev/sda
lsblk --nodeps --paths --pairs --output NAME,SERIAL,VENDOR,MODEL /dev/sda1

궁극적으로 저는 "드라이브에서 어떤 디렉터리를 검색하든 관계없이 이 하드 드라이브를 검색하고 자동으로 물리적 장치에 대한 드라이브 정보를 반환하는" 문제에 대한 간단한 솔루션을 원합니다.

해결책이 있는데, 꽤 복잡하고 더 쉬운 방법이 있는지 궁금합니다.

또 다른 편집: 너무 많은 사람들이 이것이 중복이라고 생각하거나 df의 출력이 충분하지 않은 이유에 대해 혼란스러워한다는 사실에 놀랐습니다. df는 블록 장치가 아닌 파일 시스템을 반환합니다. 파일 시스템에 정보를 쿼리하면 일련 번호나 모델과 같은 블록 장치에 대한 메타데이터가 반환되지 않습니다. 하드 드라이브의 일련 번호나 하드 드라이브 모델을 프로그래밍 방식으로 알아야 하는 이유는 무엇입니까? 이것이 누구의 심각한 후속 질문이 되지 않기를 바랍니다.

답변1

제공하신 코드를 살펴보면 파일 시스템의 파일을 해당 파일이 있는 물리적 디스크에 다시 매핑할 수 있기를 원하는 것 같습니다. RAID, LVM 또는 암호화된 파일 시스템에 대한 고려 사항이 없는 것 같습니다.

다음 코드는 지정된 파일이 포함된 디스크 장치를 인쇄합니다. RAID 및 LVM의 경우 파일이 여러 장치에 나타날 수 있습니다. 이 경우 모든 관련 디스크 장치 이름이 한 줄에 하나씩 인쇄됩니다.

read -p 'Filename: ' file
devpart=$(mount | awk -v mount=$(stat --format '%m' "$file") '$3 == mount {print $1}')
lsblk --list | awk -v part="${devpart/#*\/}" '$6 == "disk" {disk = $1} $6 != "disk" && $1 == part {print disk}'

관련 정보