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/sd0apero no hay/dev/sd0dispositivo (hay un/dev/sd0c...)/dev/sda1y/dev/mmcblk0p1son específicos de Linux de todos modos.lsblkSin embargo, es relativamente reciente.lsblktambié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 $devnamepasó todas mis pruebas! Quizás deberías agregar una respuesta./dev/sd0cen 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 lapknamecolumna, solokname.$ lsblk -no pkname /dev/nvme0n1p3devuelve 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
linearmapeo contiguo de un PV físico.Si se encuentra en ese caso, puede obtener el nombre de ese PV con:
¿Dónde
$devestá algo asídm-2(que puede obtener de"$(basename "$(readlink -f /dev/VG/LV)")").fuente
lsblky la sintaxis es corta, pero reconozco que su respuesta es más genérica y portátil. ¡Gracias!