Je cherche un moyen portable pour obtenir le nom du périphérique de bloc parent (par exemple /dev/sda
) étant donné le nom du périphérique de partition (par exemple /dev/sda1
). Je sais que je pourrais simplement supprimer le dernier caractère, mais cela ne fonctionnerait pas dans certains cas:
- Les lecteurs de cartes MMC ont généralement des noms comme
/dev/mmcblk0
, tandis que leurs partitions ont des noms comme/dev/mmcblk0p1
(notez le supplémentp
). - facultatif: certains périphériques de bloc n'ont pas de table de partition et sont formatés comme une seule partition. Dans ce cas, le périphérique de partition et le périphérique de bloc parent sont identiques.
Les volumes LVM sont une toute autre marmite de poisson. Je n'ai pas besoin de les soutenir pour le moment, mais si les prendre en compte nécessite peu d'efforts supplémentaires, cela ne me dérangerait pas.
shell-script
partition
block-device
Dmitry Grigoryev
la source
la source
/dev/sd0a
mais il n'y a pas d'/dev/sd0
appareil (il y a un/dev/sd0c
...)/dev/sda1
et/dev/mmcblk0p1
sont de toute façon spécifiques à Linux.lsblk
est relativement récent cependant.lsblk
utilise également les numéros de nœud de périphérique pour trouver le bon, au lieu d'utiliser simplement le nom. semble que la solution la plus simple pour Linux et util-linux serait probablement toujours disponible de toute façon.lsblk -dpno pkname $devname
réussi tous mes tests! Vous devriez peut-être ajouter une réponse./dev/sd0c
dans ce cas. Les réponses ci-dessous vous conviennent-elles?Réponses:
Si vous êtes sous Linux, vous pouvez utiliser
lsblk
(qui fait partie deutil-linux
):la source
lsblk
(util-linux
: 2.20.1, Ubuntu 14.04) n'a pas lapkname
colonne, justekname
.$ lsblk -no pkname /dev/nvme0n1p3
renvoie 7 lignes sur mon système. Oui, cette partition est cryptée et contient LVM, ce n'est pas une situation banale. Je ne sais pas comment vous êtes censé récupérer de manière fiable la bonne ligne d'un script.Si un périphérique est une partition d'un autre périphérique, il
/sys/class/block/$dev
contiendra un fichier appelépartition
(dont le contenu est le numéro de partition).Si tel est le cas, vous pouvez obtenir le nom du périphérique parent avec:
Ou avec
zsh
:Exemple:
Les volumes LVM sont complètement différents, ils ne sont pas des partitions, sauf dans le cas spécial où ils constituent un
linear
mappage contigu d'un PV physique.Si vous êtes dans un tel cas, vous pouvez obtenir le nom de ce PV avec:
Où
$dev
est quelque chose commedm-2
(que vous pouvez obtenir"$(basename "$(readlink -f /dev/VG/LV)")"
).la source
lsblk
et que la syntaxe est courte, mais je reconnais que votre réponse est plus générique et portable. Merci!