Obtenga UUID de / sistema de archivos del script

11

¿Cómo puedo obtener el UUID de un volumen que contiene el /sistema de archivos? Lo mejor para eso que he encontrado hasta la fecha es blkid -o list. Pero esta salida es legible por el ser humano y difícil de analizar. Tal vez hay una mejor manera?

Necesito eso para parametrizar la gestión de la configuración con plantillas específicas del sistema.

NOTA sobre blkidgotcha para aquellos que puedan reutilizar los resultados de mi pregunta en el futuro: blkidalmacena en caché los resultados de ejecuciones anteriores en /etc/blkid.tab. Eso significa que la ejecución blkidcomo usuario no root por primera vez no devolverá ningún dato. Además, la ejecución blkidcomo usuario no root después de la ejecución root devolverá datos obsoletos (posiblemente incorrectos).

Dmitriusan
fuente
En mis propios sistemas, asigno etiquetas legibles y únicas a todas las particiones. Entonces puedo descubrir casi cualquier cosa sobre ellos usando sus etiquetas y /dev/disk/by-label... Esto también funciona para particiones que no están montadas. Tiene la ventaja de poder escribir scripts que hacen cosas como rsync de root a root-bak, que es mucho menos propenso a errores que usar 2 UUIDS que no "significan" nada.
Joe

Respuestas:

25

Uso findmnt:

$ findmnt /        
TARGET SOURCE       FSTYPE OPTIONS
/      /dev/md127p1 ext4   rw,relatime,stripe=256,data=ordered
$ findmnt / -o UUID
UUID
046a554b-d9f5-4b23-82e6-ffaeb98284aa
$ findmnt / -o UUID -n
046a554b-d9f5-4b23-82e6-ffaeb98284aa

También tiene varias opciones para controlar cómo busca la información y cómo la presenta (¡incluida la salida JSON!). Es parte del mountpaquete, por lo que está disponible en cualquier instalación de Ubuntu.

muru
fuente
Esto funciona muy bien el 16.04. No funcionó para mí el 14.04. Tuve que usar este enfoque para obtener los resultados deseados en confianza.
Élder Geek
11

Otra solución:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n suprime el encabezado (no es realmente necesario, pero es más seguro para el análisis)
  • -r produce salida sin formato (hace que sea más seguro analizar)
  • -o UUID,MOUNTPOINT incluir solo la información necesaria
pLumo
fuente
5

Puede usar el lsblkcomando para generar el UUID, pero necesita el nombre del dispositivo de la partición (como / dev / sda2). Puede obtener esto utilizando el dfcomando y recortando la salida. Utilice la sustitución de comandos para dar el nombre del dispositivo lsblk. Parece que necesita sudo para acceder al UUID, aunque la salida normal de lsblk no lo requiere:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
Arronico
fuente
2
Esto funciona para mí sin sudoel 16.04.
Eliah Kagan
solo si usted (o algún script) alguna vez ha ejecutado este comando como root antes. Además, la salida puede ser obsoleta (desde el caché) en este caso
Dmitriusan
@Dmitriusan Ejecuté esto en un sistema 14.04 que nunca ha tenido lsblko blkidejecutado por root y funcionó perfectamente. ¿Sabes por qué habría un problema de almacenamiento en caché con este comando y no con la versión publicada por Rovo? ¿La salida sin procesar evita el almacenamiento en caché de alguna manera?
Arronical
Creo que cualquier comando que acceda a UUID de dispositivos requeriría acceso root (incluida la versión publicada por Rovo). Con respecto a lsblk, aquí hay una pregunta relacionada unix.stackexchange.com/questions/210889/… (ver la primera respuesta)
Dmitriusan
Estoy de acuerdo en que sudo es necesario, pero no puedo encontrar nada que sugiera que lsblk se basa en el almacenamiento en caché. Incluso si ejecuto blkidcomo root, al crear el archivo de caché en /dev/.blkid.tab, el uso de sudo lsblkno mostrará nada de la columna UUID. No creo que exista un riesgo de producción obsoleta.
Arronical
4

La mejor solución que pude encontrar es

blkid -o list | awk '/\/[[:space:]]+/{ print $0 }' | tr -s ' ' | cut -d ' ' -f 4

Se siente como no óptimo, pero funciona.

Nota: [[: espacio:]] significaSpace

Dmitriusan
fuente
Esto funciona para mí pero con sudo.
pa4080
4

Ajuste el valor de mountpointal punto de montaje actual del sistema de archivos en cuestión:

dev="$(exec awk -v mountpoint='/' '($2 == mountpoint){ print $1; quit; }' /proc/mounts)" &&
sudo blkid -o export -- "$dev" | sed -ne 's/^UUID=//p'
David Foerster
fuente
1

Esto es lo que uso:

sudo tune2fs -l $(df  / | tail -1 |awk '{print $1}') |grep UUID|awk '{ print $3 }'

tune2fs está en el paquete e2fsprogs, que no recuerdo si está instalado por defecto.

sudo apt install e2fsprogs

Si no está instalado.

John
fuente
Entiendo awk: not an option: -eque edité tu respuesta para que sea funcional. Si me he pasado de largo, no dudes en retroceder. ¡Salud! :-)
Élder Geek
Extraño, parece funcionar con o sin el -e para mí. -e está documentado en la página del manual para awk. Siempre lo he usado en scripts y me sorprendió que funcionara bien sin él :) Creo que es un viejo hábito de UNIX. Pero, debería haber sido consistente en mi uso y uso -e en ambos lugares o en ninguno para no confundir a las personas.
John
Ah, obtengo el mismo resultado que usted bajo 14.04 que usa gawk. Obtengo el error especificado en 16.04 que parece usar mawken su lugar.
Élder Geek
Es una de esas cosas / etc / alternativas. / etc / Alternatives / awk -> / usr / bin / gawk para mí en mi 16.04. Mawk está instalado, pero no está activo en / etc / alternative. En mi gnomo de 17.04 apunta a awk. En mi nueva instalación 17.10 es mawk. Después de instalar gawk, el enlace apunta a gawk, la desinstalación de gawk lo devuelve a mawk.
John
:-) Son estas pequeñas diferencias entre programas supuestamente similares que probablemente condujeron a declaraciones como "Menos es más"
Elder Geek
1

Probado para trabajar en 14.04 y 16.04

Una línea simple que siempre debe producir el UUID de una raíz /es

export DRIVE = $ (mount | grep '/' | awk -F "on" '{print $ 1}'); blkid $ DRIVE | cortar -d '"' -f2`

Lo que estamos haciendo aquí es agrupar la salida de mount para que coincida con el símbolo raíz con espacios a cada lado /para evitar la coincidencia cuando /se usa como un símbolo de extensión de ruta, canalizando eso mediante el awkuso de "on" como separador de campo para generar solo la salida nombre del dispositivo y asignar ESO a la variable de entorno $ DRIVE, luego usar la salida de blkid $DRIVEcorte canalizado usando "como separador de campo y seleccionar solo el segundo campo que elimina todo lo demás, dejando solo el UUID.

Tenga en cuenta que lo que pertenece después de grep en el comando anterior es en realidad ' space/ space' y no '/' como aparece.

Esto tiene el beneficio de no requerir sudoy devolverá el resultado apropiado independientemente de cómo esté montada la unidad.

Sería aconsejable asegurarse de que no está utilizando la variable de entorno $ DRIVE para otra cosa antes de intentar este enfoque echo $DRIVE, devolverá una línea en blanco si no está utilizando la variable.

Elder Geek
fuente