파티션 장치 이름에서 블록 장치 이름을 얻는 방법은 무엇입니까?


14

/dev/sda파티션 장치 이름 (예 :)이 주어진 부모 블록 장치 이름 (예 :)을 얻는 휴대용 방법을 찾고 /dev/sda1있습니다. 마지막 캐릭터를 버릴 수는 있지만 어떤 경우에는 작동하지 않습니다.

  • MMC 카드 리더기는 일반적으로 이름이 같은 /dev/mmcblk0반면 파티션의 이름은 /dev/mmcblk0p1(추가에 유의하십시오 p)입니다.
  • 선택 사항 : 일부 블록 장치에는 파티션 테이블이 없으며 단일 파티션으로 포맷됩니다. 이 경우 파티션 장치와 상위 블록 장치가 동일합니다.

LVM 볼륨은 완전히 다른 물고기 주전자입니다. 지금 지원할 필요는 없지만 고려할 때 약간의 추가 노력이 필요하면 괜찮습니다.


얼마나 휴대용? 내 노트북에는 루트 파티션이 /dev/sd0a있지만 /dev/sd0장치는 없습니다 ( /dev/sd0c...가 있습니다)
thrig

@don_crissti, /dev/sda1그리고 /dev/mmcblk0p1리눅스 특정입니다. lsblk그래도 비교적 최근입니다.
Stéphane Chazelas

lsblk또한 이름을 사용하는 대신 장치 노드 번호를 사용하여 올바른 것을 찾습니다. 리눅스와 util-linux를위한 가장 간단한 솔루션은 항상 사용 가능할 것 같습니다.
ilkkachu

1
@don_crissti lsblk -dpno pkname $devname는 모든 테스트를 통과했습니다! 아마도 답을 추가해야 할 것입니다.
Dmitry Grigoryev

@thrig 글쎄, 나는 확실히 /dev/sd0c그 경우에 스크립트가 돌아올 것으로 기대할 것이다 . 아래 답변이 도움이 되나요?
Dmitry Grigoryev

답변:


16

리눅스를 사용한다면 lsblk(의 일부 util-linux)를 사용할 수 있습니다 :

lsblk -no pkname /dev/sda1

2
My lsblk( util-linux: 2.20.1, Ubuntu 14.04)에는 pkname열 이 없습니다 kname.
heemayl

3
@heemayl -이 추가되었습니다 4 년 전 이전 릴리스를 사용하는 배포판에 있으므로 사용할 수 없습니다 ...
don_crissti

$ lsblk -no pkname /dev/nvme0n1p3내 시스템에서 7 줄을 반환합니다. 그러나이 파티션은 암호화되어 있으며 LVM이 포함되어 있습니다. 이는 사소한 상황이 아닙니다. 스크립트에서 올바른 줄을 어떻게 안정적으로 선택해야하는지 모르겠습니다.
elboulangero

16

장치가 다른 장치의 파티션 인 경우 (콘텐츠는 파티션 번호) /sys/class/block/$dev라는 파일이 포함됩니다 partition.

이 경우 다음을 사용하여 상위 장치의 이름을 얻을 수 있습니다.

basename "$(readlink -f "/sys/class/block/$dev/..")"

또는과 zsh:

echo /sys/class/block/$dev(:A:h:t)

예:

$ dev=sda1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
sda
$ dev=nbd0p1
$ basename "$(readlink -f "/sys/class/block/$dev/..")"
nbd0

LVM 볼륨은 완전히 다릅니다 . 물리적 PV의 연속적인 매핑 인 특별한 경우를 제외하고는 파티션 이 아닙니다 linear.

이 경우 PV를 사용하여 다음과 같은 이름을 얻을 수 있습니다.

ls "/sys/class/block/$dev/slaves"

어디 $dev같은 것입니다 dm-2(당신이에서 얻을 수있다 "$(basename "$(readlink -f /dev/VG/LV)")").


나는 don_crissti의 대답을 받아 들였고 lsblk구문이 짧지 만 대답이 더 일반적이고 이식 가능하다는 것을 인정합니다. 감사!
Dmitry Grigoryev
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.