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 Extrap
) 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.
shell-script
partition
block-device
Dmitry Grigoryev
quelle
quelle
/dev/sd0a
aber es gibt kein/dev/sd0
Gerät (es gibt ein/dev/sd0c
...)/dev/sda1
und/dev/mmcblk0p1
sind sowieso Linux-spezifisch.lsblk
ist allerdings relativ neu.lsblk
Verwendet 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.lsblk -dpno pkname $devname
hat alle meine Tests bestanden! Vielleicht solltest du eine Antwort hinzufügen./dev/sd0c
in diesem Fall zurückkommt . Funktionieren die folgenden Antworten für Sie?Antworten:
Wenn Sie unter Linux arbeiten, können Sie Folgendes verwenden
lsblk
(was Teil von istutil-linux
):quelle
lsblk
(util-linux
: 2.20.1, Ubuntu 14.04) hat diepkname
Spalte einfach nichtkname
.$ lsblk -no pkname /dev/nvme0n1p3
gibt 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.Wenn ein Gerät eine Partition eines anderen Geräts ist
/sys/class/block/$dev
, enthält es eine Datei mit dem Namenpartition
(deren Inhalt die Partitionsnummer ist).In diesem Fall können Sie den Namen des übergeordneten Geräts abrufen mit:
Oder mit
zsh
:Beispiel:
LVM-Volumes sind völlig unterschiedlich und keine Partitionen, es sei denn, es handelt sich um ein zusammenhängendes
linear
Mapping eines physischen PV.Wenn Sie in einem solchen Fall sind, können Sie den Namen dieser PV erhalten mit:
Wo
$dev
ist sowasdm-2
(was du bekommen kannst"$(basename "$(readlink -f /dev/VG/LV)")"
).quelle
lsblk
und die Syntax kurz ist, aber ich erkenne an , dass Ihre Antwort allgemeiner und portabler ist. Vielen Dank!