¿Cómo encuentro el UUID de un sistema de archivos?

134

Estoy ejecutando Ubuntu, y quiero averiguar el UUIDde un sistema de archivos en particular (no partición). Sé que puedo usar e2label /dev/sda1para encontrar la etiqueta del sistema de archivos, pero no parece haber una forma similar de encontrarlo UUID.

Brad Gilbert
fuente
Gracias por todas las respuestas, estoy seguro de que las usaré en diferentes circunstancias.
Brad Gilbert
2
Tenga en cuenta que el título solía ser "Cómo encuentro el UUID de una partición". Esa pregunta solo tiene sentido cuando se usa una tabla de particiones GPT. Aquí hay una respuesta a esa pregunta .
Alastair Irvine

Respuestas:

165

Otro comando que podría estar disponible y que también funciona bastante bien para esto es 'blkid'. Es parte del paquete e2fsprogs. Ejemplos de su uso:

Busque datos en / dev / sda1:

topher@crucible:~$ sudo blkid /dev/sda1
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"

Mostrar datos UUID para todas las particiones:

topher@crucible:~$ sudo blkid
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"
/dev/sdb: UUID="467c4aa9-963d-4467-8cd0-d58caaacaff4" TYPE="ext3"

Muestra los datos de UUID para todas las particiones en un formato más fácil de leer: (Nota: en versiones más recientes, blkid -Ltiene un significado diferente y blkid -o listdebería usarse en su lugar)

topher@crucible:~$ sudo blkid -L
device     fs_type label    mount point    UUID
-------------------------------------------------------------------------------
/dev/sda1 ext3             /              727cac18-044b-4504-87f1-a5aefa774bda
/dev/sdc  ext3             /home          467c4aa9-963d-4467-8cd0-d58caaacaff4

Mostrar solo el UUID para / dev / sda1 y nada más:

topher@crucible:~$ sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda
Christopher Cashell
fuente
1
En mi computadora Ubuntu, no necesito usar sudo.
Brad Gilbert
Simplemente escribiendo blkid, me consiguió exactamente lo que quería, pero no exactamente lo que pedí. (Lo estoy aceptando de todos modos, porque estoy seguro de que lo usaré a menudo)
Brad Gilbert,
3
En las versiones más nuevas de Ubuntu, el comando equivalente para blkid -Les ahora blkid -o list; la -Lopción se ha cambiado para -L labelbuscar un dispositivo que usa la etiqueta especificada.
aculich
@aculich He actualizado la respuesta para incluir la sintaxis reciente de blkid. Gracias por mencionarlo.
Christopher Cashell
2
Excelente, nunca lo supe blkid; Siempre lo acabo de hacer ls -l /dev/disk/by-uuid. En Gentoo, blkidestá ensys-apps/util-linux
AdmiralNemo
10

Solo para discos particionados GPT

En un disco con formato GPT, a cada partición se le asigna un GUID, que es una forma de UUID, aunque probablemente no a lo que se refería el póster original. Por lo tanto, esta respuesta probablemente sea menos útil para el interrogador original. Sin embargo, creo que hay una distinción importante a destacar.

Para obtener el GUID de la partición 1 en el disco con formato GPT / dev / sda, así como su etiqueta de partición, etc.:

sudo sgdisk -i 1 /dev/sda

o todos con:

ls -l /dev/disk/by-partuuid

Para arrancar con la raíz del sistema de archivos en una determinada partición, usaría la sintaxis del parámetro del kernel de Linux de:

root=PARTUUID=87654321-4321-4321-abcd-123456789012

En este caso, puede especificar solo el comienzo del UUID, lo suficiente como para ser único. Este parámetro es más primitivo y puede ser entendido por el núcleo anteriormente en su proceso de arranque.


Hay una diferencia en la semántica entre estos:

Un disco contiene particiones, una partición contiene un sistema de archivos, un sistema de archivos contiene directorios y archivos. Para algunas configuraciones y sistemas operativos hay más capas.

El UUID GUID y la etiqueta asociada se refieren a una partición, pero no al contenido de la partición. Una nueva partición en el mismo disco o una partición en un nuevo disco tendrá un nuevo GUID UUID. La misma partición podría contener un sistema de archivos un día y otro en un día diferente. Solo existe para discos formateados GPT, pero no para discos particionados heredados. Por lo general, no hay más utilidad aquí que especificar root=/dev/sda1o root=8:1.

Las otras respuestas actuales se refieren al UUID de un sistema de archivos en algunas particiones que contienen. Si el sistema de archivos se copia, como un todo, a otra partición o disco duro, ese valor permanece igual. Este UUID es útil para encontrar un sistema de archivos movido. Por lo tanto, esto es probablemente más pertinente para la mayoría de las personas. El parámetro del kernel de Linux se root=UUID=87654321-4321-4321-a567-123456789012refiere a esto.

Creo root=LABEL=y estoy root=UUID=implementado por el espacio de usuario temprano, el código de inicio que vi el otro día en mi sistema tradujo estos parámetros a / dev / disk / by-uuid y / dev / disk / by-label (creo que los enlaces son creados por udev en espacio de usuario en mi sistema).

[1] http://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/init/do_mounts.c#n183

John S Gruber
fuente
El uso correcto parece ser -i1o -i 1, a diferencia de -i:1, con sgdisk 1.0.1.
Charles Duffy
@CharlesDuffy gracias por encontrar ese error. He editado la respuesta para corregirlo.
John S Gruber
7

La forma limpia de script para hacer esto que funciona en cualquier tipo de sistema de archivos es:

lsblk -no UUID <device-containing-FS>

O, dado el punto de montaje (o cualquier archivo dentro de él):

lsblk -no UUID $(df -P <file> | awk 'END{print $1}')

La salida es el UUID, el UUID completo y nada más que el UUID.

Tom Hale
fuente
1
Es mejor que blkiden la respuesta de @ christopher-cashell, porque no necesitas convertirte en root. Para un punto de montaje o un archivo mejor hacer: lsblk -no UUID $(findmnt -n -o SOURCE --target <file>).
marcz
@marcz Eso falla en subvolúmenes btrfs: findmnt -n -o SOURCE --target ~da:/dev/mapper/vg_svelte-home[/@home]
Tom Hale
Derecha @ tom-hale, lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)debe deshacerse del subvolumen cuando está presente.
marcz
5

La forma más fácil de hacer esto para ext2 / ext3 / ext4 es:

/sbin/tune2fs -l /dev/sda1
Eddie
fuente
3
Esto funcionará siempre que su sistema de archivos esté formateado como ext2, ext3 o ext4. La mayoría de los sistemas de archivos son uno de estos, pero no todos. Tampoco funcionará para particiones de intercambio. Vea mi respuesta de manera universal.
Hamish Downer
Esto resulta en mi caso enCouldn't find valid filesystem superblock.
Michel
3

La forma recomendada de hacer esto es hacer

sudo vol_id -u /dev/sda2

Para obtener más información sobre el uso de UUID, consulte este artículo (de la ayuda de ubuntu, pero debería funcionar para cualquier distribución de Linux que use UUID).

Como se señaló en los comentarios a esta pregunta, es posible que vol_id no esté en su camino. En ubuntu está en / sbin, por lo que lo anterior funcionará. Para fedora parece necesitar

sudo /lib/udev/vol_id -u /dev/sda2

Si otras distribuciones tienen vol_id en otros lugares, publique un comentario y lo agregaré a esta respuesta.

Hamish Downer
fuente
Esto no funciona en mi computadora portátil Fedora 10.
Eddie
Esta es una solución mucho mejor que la mía. Eddie, vol_id se encuentra en / lib / udev. mish, ¿podrías editar tu respuesta para prefijar la ruta completa frente a vol_id? / lib / udev no está en la ruta raíz de forma predeterminada en ninguna distribución que conozca.
Mihai Limbăşan
"/ lib / udev / vol_id / dev / sda2" parece funcionar. Pocas personas tendrán / lib / udev en su camino.
Eddie
En mi equipo Ubuntu hay un enlace simbólico desde /sbin/vol_ida/lib/udev/vol_id
Brad Gilbert
44
vol_id se ha eliminado de Ubuntu a partir de Karmic (9.10), por lo que ya no es útil ni relevante. Pasó por muchas contorsiones para llegar allí ya que vol_id fue construido en un punto para reemplazar a blkid .
Alain O'Dea
3

Esto parece funcionar para mí:

sudo dumpe2fs /dev/sda1 | grep UUID
Marcus Junius Brutus
fuente
2

Suponiendo que desea el UUID para sda1, puede intentar algo como esto:

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sda1 | cut -d\: -f2 | cut -d/ -f5 ; done

Ajuste sda1 en consecuencia. Para obtener los UUID para todas las particiones, suelte los greps y cortes, a la:

for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" ; done

Salida de muestra para sda1 en mi escritorio:

[mihailim@home ~]$ for v in /dev/disk/by-uuid/* ; do echo "`readlink $v`: $v" | grep ../sdb3 | cut -d\: -f2 | cut -d/ -f5 ; done
dc8c49f1-e2dc-46bc-ba02-013f26c85f70

Editar: Tenga en cuenta que esta solución, aunque es más ingeniosa que la udev-> vol_id, no requiere privilegios de root, funcionará en cualquier núcleo posterior a 2005 o más, y se basa en herramientas presentes en cualquier distribución de Linux que están por defecto en La ruta para cualquier usuario.

Mihai Limbăşan
fuente
Esto funcionará en cualquier computadora que ejecute un devfs lo suficientemente reciente.
Eddie
1

También puede usar esto para imprimir todos los UUID:

for disk in /dev/disk/by-uuid/*; do 
    basename "$(readlink "$disk")"
    basename "$disk"
    echo
done

o este comando posiblemente más simple, reemplazando sda1con el dispositivo que desea buscar:

disk=sda1
find /dev/disk/by-uuid -type l -exec sh -c "readlink {} | grep -o $disk && basename {}" \;

Una adaptación del segundo método para imprimir todos los UUID:

find /dev/disk/by-uuid -type l -exec sh -c 'basename $(readlink {}); basename {}; echo' \;
kiri
fuente
1
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

Lo anterior parece funcionar en la mayoría de los sistemas Linux (todo lo que he encontrado) durante muchos años. Puede tener defectos, no lo sé. Preferiría obtener el número de serie pero ... este es el UUID del sistema de archivos raíz.

Si alguien tiene una forma de obtener el número de serie sin necesidad de ser root (como el mío) y no instalar paquetes "inusuales" que son diferentes en diferentes versiones de Unix, lo agradecería, siempre puede aprender algo. Y sé que estoy mezclando cosas: es el UUID del sistema de archivos raíz, no un disco.

El propósito, por cierto, es generar un número único por máquina que no pueda modificarse (como un número de serie del disco y como las direcciones MAC que fueron hace mucho tiempo).

Se utiliza para codificar software en una sola máquina. La dirección MAC estuvo bien hasta que les permitió ser virtuales ... algunos clientes de mala calidad simplemente establecieron su dirección MAC en una constante (en diferentes redes, por supuesto) y evitaron pagarme.

En AIX hay una sola llamada para obtener un número que identifica la máquina. No importa si los cambios de hardware o las actualizaciones de software ocurren, así que no tengo idea de cómo lo hacen ... Si la placa base cambia, entonces el número cambia, así que creo que lo ocultan allí. Y eso es más que raro.

Eric Eberhard
fuente
0

Puede usar lo siguiente para obtener el UUID para una unidad en particular,

sudo vol_id -u /dev/sda1

o puede usar esto para enumerar todos los UUID para los medios adjuntos,

ls /dev/disk/by-uuid
Rich Adams
fuente
Ya no es aplicable a partir de Ubuntu 9.10 ya que vol_id se ha eliminado.
Alain O'Dea