Come ottenere il nome del dispositivo a blocchi dal nome del dispositivo di partizione?


13

Sto cercando un modo portatile per ottenere il nome del dispositivo a blocchi parent (ad es. /dev/sda) Dato il nome del dispositivo di partizione (ad es /dev/sda1.). So che potrei semplicemente rilasciare l'ultimo personaggio, ma in alcuni casi non funzionerebbe:

  • I lettori di schede MMC hanno in genere nomi simili /dev/mmcblk0, mentre le loro partizioni hanno nomi simili /dev/mmcblk0p1(notare il supplemento p).
  • opzionale: alcuni dispositivi a blocchi non hanno alcuna tabella delle partizioni e sono formattati come un'unica partizione. In questo caso, il dispositivo di partizione e il dispositivo di blocco padre sono gli stessi.

I volumi LVM sono un bollitore di pesce completamente diverso. Non ho bisogno di supportarli in questo momento, ma se prenderli in considerazione richiede un piccolo sforzo extra, non mi dispiacerebbe.


Quanto portatile? Il mio laptop ha la sua partizione di root attiva /dev/sd0ama non c'è alcun /dev/sd0dispositivo (c'è un /dev/sd0c...)
thrig

@don_crissti, /dev/sda1e /dev/mmcblk0p1sono comunque specifici di Linux. lsblkè relativamente recente però.
Stéphane Chazelas,

lsblkutilizza anche i numeri di nodo del dispositivo per trovare quello corretto, invece di utilizzare semplicemente il nome. sembra che la soluzione più semplice per Linux e util-linux sarebbe probabilmente sempre disponibile comunque.
ilkkachu,

1
@don_crissti ha lsblk -dpno pkname $devnamesuperato tutti i miei test! Forse dovresti aggiungere una risposta.
Dmitry Grigoryev,

@thrig Beh, sì, mi aspetto sicuramente che la sceneggiatura ritorni /dev/sd0cin quel caso. Le risposte qui sotto funzionano per te?
Dmitry Grigoryev,

Risposte:


15

Se sei su Linux potresti usare lsblk(di cui fa parte util-linux):

lsblk -no pkname /dev/sda1

2
Il mio lsblk( util-linux: 2.20.1, Ubuntu 14.04) non ha la pknamecolonna, solo kname.
heemayl

3
@heemayl - è stato aggiunto solo quattro anni fa, quindi non disponibile nelle distribuzioni che utilizzano versioni precedenti ...
don_crissti

$ lsblk -no pkname /dev/nvme0n1p3restituisce 7 righe sul mio sistema. Sì, questa partizione è crittografata e contiene LVM, questa non è una situazione banale. Non so come dovresti prendere in modo affidabile la linea giusta da una sceneggiatura.
elboulangero,

16

Se un dispositivo è una partizione di un altro dispositivo /sys/class/block/$dev, conterrà un file chiamato partition(il cui contenuto è il numero di partizione).

In tal caso, puoi ottenere il nome del dispositivo genitore con:

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

O con zsh:

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

Esempio:

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

I volumi LVM sono completamente diversi, non sono partizioni tranne nel caso speciale in cui sono una linearmappatura contigua di un PV fisico.

In tal caso, puoi ottenere il nome di quel PV con:

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

Dov'è $devqualcosa del genere dm-2(che puoi ottenere da "$(basename "$(readlink -f /dev/VG/LV)")").


Ho accettato la risposta di don_crissti perché mi è capitato di avere lsblke la sintassi è breve, ma riconosco che la tua risposta è più generica e portatile. Grazie!
Dmitry Grigoryev,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.