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.

Brad Gilbert
fonte
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
Christopher Cashell
fonte
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

John S Gruber
fonte
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.

Tom Hale
fonte
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
Eddie
fonte
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.

Hamish Downer
fonte
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
3

Isso parece funcionar para mim:

sudo dumpe2fs /dev/sda1 | grep UUID
Marcus Junius Brutus
fonte
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.

Mihai Limbăşan
fonte
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' \;
kiri
fonte
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.

Eric Eberhard
fonte
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
Rich Adams
fonte
Não é mais aplicável a partir do Ubuntu 9.10, pois o vol_id foi removido.
Alain O'Dea