예를 들어, 파티션을 알고 있는 경우 해당 파티션이 포함된 디스크의 이름을 /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이 아닌 "실제" 디스크에서만 작동합니다.