특정 파티션이 포함된 디스크의 이름을 얻는 방법

특정 파티션이 포함된 디스크의 이름을 얻는 방법

예를 들어, 파티션을 알고 있는 경우 해당 파티션이 포함된 디스크의 이름을 /dev/sda1어떻게 알 수 있습니까 (이 경우)?/dev/sda

  • 출력은 디스크 경로여야 합니다(예: /dev/sda.
  • 다른 디스크 유형에서 작동하는 데 필요하므로 문자열 조작이 필요하지 않습니다.

답변1

/sys블록 장치에서 주어진 파티션 이름을 관찰 할 수 있습니다 . 예를 들어, /dev/sda1:

$ ls -l /sys/class/block/sda1
lrwxrwxrwx 1 root root /sys/class/block/sda1 -> \
 ../../devices/pci0000:00/.../ata1/host0/target0:0:0/0:0:0:0/block/sda/sda1

/dev/sda1인수를 가져와 인쇄하는 스크립트는 /dev/sda다음과 같습니다.

part=$1
part=${part#/dev/}
disk=$(readlink /sys/class/block/$part)
disk=${disk%/*}
disk=/dev/${disk##*/}
echo $disk

시도해 볼 lvm 등이 없지만 비슷한 경로가 있을 수 있습니다.


게다가 lsblk:

$ lsblk -as /dev/sde1
NAME  MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sde1    8:65   1  7.4G  0 part 
`-sde   8:64   1  7.4G  0 disk 

@don_crissti가 말했듯 -o pkname이 이름 열만 가져오고 -n헤더를 제거하고 -d홀더 장치나 슬레이브 장치는 포함하지 않음으로써 상위 항목을 직접 가져올 수 있습니다.

lsblk -ndo pkname /dev/sda1

답변2

UTF-8 로케일에서만 작동합니다. lvm, zfs 및 raid 테스트는 정상입니다.

parent_tree_disk() {
  lsblk | awk '/^[A-Za-z]/{d0=$1; print d0};/^[└─├─]/{d1=$1; print d0, d1};/^  [└─├─]/{d2=$1; print d0, d1, d2}' | sed 's/[├─└─]//g'
}

alias pd='parent_tree_disk'

쉘 명령: #pd
이름
sda
sda sda1
sda sda2
sda sda2 cl-root
sda sda2 cl-swap

쉘 명령: #PD | awk '/sda2/{print $1}'
sda

pd 목록 출력에서 ​​sort, uniq...와 같은 다른 필터를 사용할 수 있습니다.

답변3

어쩌면 아름답지 않을 수도 있습니다:

for d in `fdisk -l 2>/dev/null | grep "^Disk " | cut -d":" -f1 | cut -f2`
do
  if [ `fdisk -l $d 2>/dev/null | grep -c "/dev/sda1"` -gt 0 ]
  then
    echo On disk $d
  fi
done

LVM이 아닌 "실제" 디스크에서만 작동합니다.

관련 정보