it-swarm-pt.tech

Como encontro o UUID de um sistema de arquivos

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

135
Brad Gilbert

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:

[email protected]:~$ Sudo blkid /dev/sda1
/dev/sda1: UUID="727cac18-044b-4504-87f1-a5aefa774bda" TYPE="ext3"

Mostrar dados UUID para todas as partições:

[email protected]:~$ 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 -L tem um significado diferente e blkid -o list deve ser usado)

[email protected]:~$ 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:

[email protected]:~$ Sudo blkid -s UUID -o value /dev/sda1
727cac18-044b-4504-87f1-a5aefa774bda
169
Christopher Cashell

Apenas 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 seu 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 UUID GUID e o rótulo associado se referem 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 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/sda1 Ou 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-123456789012 Refere-se a isso.

Eu acredito que root=LABEL= E root=UUID= São implementados pelos primeiros usuários, o código init que eu vi outro dia no meu sistema traduziu esses parâmetros para/dev/disk/by-uuid e/dev/disk/por rótulo (links que acredito serem criados pelo udev no espaço do usuário no meu sistema).

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

11
John S Gruber

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.

8
Tom Hale

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

/sbin/tune2fs -l /dev/sda1
5
Eddie

A maneira recomendada de fazer isso é fazer

Sudo vol_id -u /dev/sda2

Para obter mais informações 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, poste um comentário e o adicionarei a esta resposta.

3
Hamish Downer

Isso parece funcionar para mim:

Sudo dumpe2fs /dev/sda1 | grep UUID
3
Marcus Junius Brutus

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:

[[email protected] ~]$ 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 mais artificial que a udev-> vol_id, não requer privilégios de root, funcionará em qualquer kernel posterior a 2005 e depende de ferramentas presentes em qualquer Distribuição Linux que, por padrão, está no caminho para qualquer usuário.

2
Mihai Limbăşan

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 com o 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
kiri
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é que eles permitissem ser 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 eu acho que eles a escondem lá. E isso é mais do que raro.

1
Eric Eberhard

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
0
Rich Adams