Estoy buscando una forma portátil de obtener el nombre del dispositivo de bloque primario (por ejemplo /dev/sda
) dado el nombre del dispositivo de partición (por ejemplo /dev/sda1
). Sé que podría dejar caer el último personaje, pero eso no funcionaría en algunos casos:
- Los lectores de tarjetas MMC suelen tener nombres similares
/dev/mmcblk0
, mientras que sus particiones tienen nombres similares/dev/mmcblk0p1
(observe el extrap
). - opcional: algunos dispositivos de bloque no tienen ninguna tabla de particiones y están formateados como una sola partición. En este caso, el dispositivo de partición y el dispositivo de bloque primario son iguales.
Los volúmenes LVM son una caldera de peces completamente diferente. No necesito apoyarlos en este momento, pero si tomarlos en cuenta requiere poco esfuerzo adicional, no me importaría.
shell-script
partition
block-device
Dmitry Grigoryev
fuente
fuente
/dev/sd0a
pero no hay/dev/sd0
dispositivo (hay un/dev/sd0c
...)/dev/sda1
y/dev/mmcblk0p1
son específicos de Linux de todos modos.lsblk
Sin embargo, es relativamente reciente.lsblk
también usa los números de nodo del dispositivo para encontrar el correcto, en lugar de solo usar el nombre. Parece que la solución más simple para Linux y util-linux probablemente siempre estará disponible de todos modos.lsblk -dpno pkname $devname
pasó todas mis pruebas! Quizás deberías agregar una respuesta./dev/sd0c
en ese caso. ¿Las respuestas a continuación funcionan para usted?Respuestas:
Si estás en Linux puedes usar
lsblk
(que es parte deutil-linux
):fuente
lsblk
(util-linux
: 2.20.1, Ubuntu 14.04) no tiene lapkname
columna, solokname
.$ lsblk -no pkname /dev/nvme0n1p3
devuelve 7 líneas en mi sistema. Sí, esta partición está encriptada y contiene LVM, esta no es una situación trivial. No sé cómo se supone que debes elegir de forma confiable la línea correcta de un script.Si un dispositivo es una partición de otro dispositivo
/sys/class/block/$dev
, contendrá un archivo llamadopartition
(cuyo contenido es el número de partición).Si ese es el caso, puede obtener el nombre del dispositivo principal con:
O con
zsh
:Ejemplo:
Los volúmenes LVM son completamente diferentes, no son particiones, excepto en el caso especial donde son un
linear
mapeo contiguo de un PV físico.Si se encuentra en ese caso, puede obtener el nombre de ese PV con:
¿Dónde
$dev
está algo asídm-2
(que puede obtener de"$(basename "$(readlink -f /dev/VG/LV)")"
).fuente
lsblk
y la sintaxis es corta, pero reconozco que su respuesta es más genérica y portátil. ¡Gracias!