Wie erhalte ich den Block-Gerätenamen aus dem Partitions-Gerätenamen?


12

Ich suche nach einem portablen Weg, um den übergeordneten Block-Gerätenamen (z. B. /dev/sda) anhand des Partitions-Gerätenamens (z /dev/sda1. B. ) zu erhalten. Ich weiß, dass ich das letzte Zeichen einfach fallen lassen könnte, aber das würde in einigen Fällen nicht funktionieren:

  • MMC-Kartenleser haben normalerweise Namen wie /dev/mmcblk0, während ihre Partitionen Namen wie /dev/mmcblk0p1(beachten Sie das Extra p) haben.
  • Optional: Einige Blockgeräte haben überhaupt keine Partitionstabelle und sind als einzelne Partition formatiert. In diesem Fall sind Partitionsgerät und übergeordnetes Blockgerät identisch.

LVM-Volumina sind ein ganz anderer Fischkessel. Ich brauche sie momentan nicht zu unterstützen, aber wenn es ein wenig mehr Aufwand kostet, sie in Betracht zu ziehen, hätte ich nichts dagegen.


Wie portabel? Mein Laptop hat seine Root-Partition auf, /dev/sd0aaber es gibt kein /dev/sd0Gerät (es gibt ein /dev/sd0c...)
Thrig

@don_crissti /dev/sda1und /dev/mmcblk0p1sind sowieso Linux-spezifisch. lsblkist allerdings relativ neu.
Stéphane Chazelas

lsblkVerwendet auch die Geräteknotennummern, um die richtige zu finden, anstatt nur den Namen zu verwenden. scheint die einfachste Lösung für Linux zu sein und util-linux wäre wahrscheinlich sowieso immer verfügbar.
Ilkkachu

1
@don_crissti lsblk -dpno pkname $devnamehat alle meine Tests bestanden! Vielleicht solltest du eine Antwort hinzufügen.
Dmitry Grigoryev

@thrig Nun ja, ich würde definitiv erwarten, dass das Skript /dev/sd0cin diesem Fall zurückkommt . Funktionieren die folgenden Antworten für Sie?
Dmitry Grigoryev

Antworten:


15

Wenn Sie unter Linux arbeiten, können Sie Folgendes verwenden lsblk(was Teil von ist util-linux):

lsblk -no pkname /dev/sda1

2
Mein lsblk( util-linux: 2.20.1, Ubuntu 14.04) hat die pknameSpalte einfach nicht kname.
Heemayl

3
@heemayl - es wurde erst vor vier Jahren hinzugefügt , daher nicht für Distributionen verfügbar, die ältere Releases verwenden ...
don_crissti

$ lsblk -no pkname /dev/nvme0n1p3gibt 7 Zeilen auf meinem System zurück. Ja, diese Partition ist verschlüsselt und enthält LVM. Dies ist keine triviale Situation. Ich weiß nicht, wie Sie zuverlässig die richtige Zeile aus einem Skript herausholen sollen.
Elboulangero

16

Wenn ein Gerät eine Partition eines anderen Geräts ist /sys/class/block/$dev, enthält es eine Datei mit dem Namen partition(deren Inhalt die Partitionsnummer ist).

In diesem Fall können Sie den Namen des übergeordneten Geräts abrufen mit:

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

Oder mit zsh:

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

Beispiel:

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

LVM-Volumes sind völlig unterschiedlich und keine Partitionen, es sei denn, es handelt sich um ein zusammenhängendes linearMapping eines physischen PV.

Wenn Sie in einem solchen Fall sind, können Sie den Namen dieser PV erhalten mit:

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

Wo $devist sowas dm-2(was du bekommen kannst "$(basename "$(readlink -f /dev/VG/LV)")").


Ich habe die Antwort von don_crissti akzeptiert, weil ich sie zufällig habe lsblkund die Syntax kurz ist, aber ich erkenne an , dass Ihre Antwort allgemeiner und portabler ist. Vielen Dank!
Dmitry Grigoryev
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.