Como encontro o UUID de um sistema de arquivos


133

Estou executando o Ubuntu e quero descobrir o UUIDsistema de arquivos específico (não a partição). Eu sei que posso usar e2label /dev/sda1para descobrir o rótulo do sistema de arquivos, mas não parece haver uma maneira semelhante de encontrar o UUID.


Obrigado por todas as respostas, tenho certeza de que as usarei em diferentes circunstâncias.
— 5309 Brad Gilbert

2
Observe que o título costumava ser "Como encontro o UUID de uma partição". Essa pergunta só faz sentido ao usar uma tabela de partição GPT. Aqui está uma resposta para essa pergunta .
— Alastair Irvine

Respostas:


164

Outro comando que pode estar disponível e também funciona muito bem para isso é 'blkid'. Faz parte do pacote e2fsprogs. Exemplos de seu uso:

Procure dados em / dev / sda1:

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

Mostrar dados UUID para todas as partições:

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

Mostrar dados UUID para todas as partições em um formato mais fácil de ler: (Nota: em versões mais recentes, blkid -Ltem um significado diferente e blkid -o listdeve ser usado)

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

Mostre apenas o UUID para / dev / sda1 e nada mais:

topher@crucible:~$ sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda

1
No meu computador Ubuntu, não preciso usar o sudo.
— 23420 Brad Gilbert

Apenas digitando blkid, consegui exatamente o que eu queria, mas não exatamente o que eu pedi. (Eu estou aceitando isso de qualquer maneira, porque eu tenho certeza que vai usá-lo muitas vezes)
— Brad Gilbert

3
Nas versões mais recentes do Ubuntu, o comando equivalente blkid -Lé agora blkid -o list; a -Lopção foi alterada para -L labelprocurar um dispositivo que usa o rótulo especificado.
— Aculich

@aculich Atualizei a resposta para incluir a sintaxe recente de blkid. Obrigado por mencionar.
— Christopher Cashell

2
Excelente, eu nunca soube blkid; Eu sempre acabei ls -l /dev/disk/by-uuid. No Gentoo, blkidestá dentrosys-apps/util-linux
— AdmiralNemo 27/03

10

Somente para discos particionados GPT

Em um disco formatado por GPT, a cada partição é atribuído um GUID, que é uma forma de UUID, embora provavelmente não seja o que o pôster original estava se referindo. Portanto, essa resposta é provavelmente menos útil para o questionador original. No entanto, acredito que há uma distinção importante a ser notada.

Para obter o GUID da partição 1 no disco formatado GPT / dev / sda, assim como o rótulo da partição e assim por diante:

sudo sgdisk -i 1 /dev/sda

ou todos com:

ls -l /dev/disk/by-partuuid

Para inicializar com a raiz do sistema de arquivos em uma determinada partição, você usaria a sintaxe do parâmetro linux kernel de:

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

Nesse caso, você pode especificar apenas o início do UUID - o suficiente para ser único. Este parâmetro é mais primitivo e pode ser entendido pelo kernel no início de seu processo de inicialização.


Há uma diferença na semântica entre estes:

Um disco contém partições, uma partição contém um sistema de arquivos, um sistema de arquivos contém diretórios e arquivos. Para algumas configurações e sistemas operacionais, há mais camadas.

O GUID UUID e o rótulo associado referem-se a uma partição, mas não ao conteúdo da partição. Uma nova partição no mesmo disco ou uma partição em um novo disco terá um novo GUID UUID. A mesma partição pode conter um sistema de arquivos em um dia e outro em um dia diferente. Existe apenas para discos formatados em GPT, mas não para discos particionados herdados. Geralmente, não há mais utilidade aqui do que especificar root=/dev/sda1ou root=8:1.

As outras respostas atuais se referem ao UUID de um sistema de arquivos em algumas partições que contêm. Se o sistema de arquivos for copiado, como um todo, para outra partição ou disco rígido, esse valor permanecerá o mesmo. Esse UUID é útil para encontrar um sistema de arquivos movido. Portanto, isso é provavelmente mais pertinente para a maioria das pessoas. O parâmetro do kernel do Linux root=UUID=87654321-4321-4321-a567-123456789012se refere a isso.

Acredito root=LABEL=e root=UUID=sou implementado pelo espaço de usuário inicial, o código init que vi outro dia no meu sistema traduziu esses parâmetros para / dev / disk / by-uuid e / dev / disk / by-label (links que acredito serem criados pelo udev no espaço de usuário no meu sistema).

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


O uso correto parece ser -i1ou -i 1, ao contrário -i:1, com o sgdisk 1.0.1.
— Charles Duffy

@CharlesDuffy obrigado por encontrar esse erro. Eu editei a resposta para corrigi-la.
— John S Gruber

7

A maneira limpa de script de fazer isso que funciona em qualquer tipo de sistema de arquivos é:

lsblk -no UUID <device-containing-FS>

Ou, dado o ponto de montagem (ou qualquer arquivo dentro dele):

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

A saída é o UUID, o UUID inteiro e nada além do UUID.


1
É melhor do que blkidna resposta de @ christopher-cashell, porque você não precisa se tornar root. Para um ponto de montagem ou um arquivo melhor fazer: lsblk -no UUID $(findmnt -n -o SOURCE --target <file>).
— Marcz

@marcz Isso falha nos subvolumes btrfs: findmnt -n -o SOURCE --target ~dá:/dev/mapper/vg_svelte-home[/@home]
— Tom Hale

Direito @ tom-hale, lsblk -no UUID $(findmnt -n -o SOURCE --target <file> | cut -d[ -f1)deve se livrar do subvolume quando presente.
— Marcz

5

A maneira mais fácil de fazer isso para ext2 / ext3 / ext4 é:

/sbin/tune2fs -l /dev/sda1

3
Isso funcionará desde que seu sistema de arquivos esteja formatado como ext2, ext3 ou ext4. A maioria dos sistemas de arquivos é um desses, mas não todos. Também não funcionará para partições de troca. Veja minha resposta de uma maneira universal.
— 2129 Hamish Downer

Isso resulta no meu caso emCouldn't find valid filesystem superblock.
— Michel

3

A maneira recomendada de fazer isso é fazer

sudo vol_id -u /dev/sda2

Para saber mais sobre o uso de UUIDs, consulte este artigo (da ajuda do ubuntu, mas deve funcionar para qualquer distribuição Linux usando UUIDs).

Conforme observado nos comentários a esta pergunta, vol_id pode não estar no seu caminho. No ubuntu, ele está em / sbin, para que o procedimento acima funcione. Para o fedora, parece precisar

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

Se outras distribuições tiverem vol_id em outros lugares, publique um comentário e o adicionarei a esta resposta.


Isso não funciona no meu laptop Fedora 10.
— Eddie

Esta é uma solução muito melhor que a minha. Eddie, vol_id está localizado em / lib / udev. mish, você poderia editar sua resposta para prefixar o caminho completo na frente de vol_id? / lib / udev não está no caminho do root por padrão em qualquer distribuição que eu conheço.
— Mihai Limbăşan

"/ lib / udev / vol_id / dev / sda2" parece funcionar. Poucas pessoas terão / lib / udev em seu caminho.
— Eddie

No meu computador Ubuntu há um link simbólico de /sbin/vol_idque/lib/udev/vol_id
— Brad Gilbert

4
O vol_id foi retirado do Ubuntu a partir do Karmic (9.10), portanto não é mais útil ou relevante. Ele passou por muitas contorções para chegar lá, já que o vol_id foi criado para substituir o blkid .
— Alain O'Dea


2

Supondo que você queira o UUID para sda1, tente algo como isto:

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

Ajuste sda1 de acordo. Para obter os UUIDs para todas as partições, solte os greps e recortes, à la:

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

Exemplo de saída para sda1 na minha área de trabalho:

[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

Edit: Observe que esta solução, embora seja mais artificial que a udev-> vol_id, não requer privilégios de root, funcionará em qualquer kernel pós-2005 ou mais e depende de ferramentas presentes em qualquer distribuição Linux que são, por padrão, o caminho para qualquer usuário.


Isso funcionará em qualquer computador executando um devfs recente o suficiente.
— Eddie

1

Você também pode usar isso para imprimir todos os UUIDs:

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

ou este comando sem dúvida mais simples, substituindo sda1 pelo dispositivo que você deseja procurar:

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

uma adaptação do segundo método para imprimir todos os UUIDs:

find /dev/disk/by-uuid -type l -exec sh -c 'basename $(readlink {}); basename {}; echo' \;

1
ls -l /dev/disk/by-uuid | grep `lsblk | grep "/" | awk '{print $1}'` | awk '{print $9}'

O exposto acima parece funcionar na maioria dos sistemas Linux (tudo que eu encontrei) ao longo de muitos anos. Pode ter falhas, não sei. Eu preferiria obter o número de série, mas ... este é o UUID do sistema de arquivos raiz.

Se alguém tiver uma maneira de obter o número de série sem precisar ser root (como o meu é) e não instalar pacotes "incomuns" que são diferentes em diferentes versões do Unix, eu apreciaria - sempre pode aprender algo. E estou ciente de que estou misturando coisas - o UUID do sistema de arquivos raiz, não um disco.

O objetivo, BTW, é gerar um número único por máquina que não pode ser modificado (como um número de série do disco e como endereços MAC, há muito tempo).

É usado para codificação de software em uma única máquina. O endereço MAC estava bom até permitirem que eles fossem virtuais ... alguns clientes desprezíveis simplesmente definiram seu endereço MAC como uma constante (em diferentes redes, é claro) e evitaram me pagar.

No AIX, há uma única chamada para obter um número que identifica a máquina. Ele não se importa se as alterações de hardware ou atualizações de software ocorrem, então eu não tenho idéia de como eles fazem isso ... Se a placa-mãe muda, o número muda, então acho que eles a escondem lá. E isso é mais do que raro.


0

Você pode usar o seguinte para obter o UUID para uma unidade específica,

sudo vol_id -u /dev/sda1

ou você pode usar isso para listar todos os UUIDs da mídia anexada,

ls /dev/disk/by-uuid

Não é mais aplicável a partir do Ubuntu 9.10, pois o vol_id foi removido.
— Alain O'Dea
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.