Obter UUID de / filesystem do script

11

Como posso obter o UUID de um volume que contém o /sistema de arquivos? A melhor coisa que eu encontrei até agora é blkid -o list. Mas essa saída é legível por humanos e difícil de analisar. Talvez haja uma maneira melhor?

Eu preciso disso para parametrizar o gerenciamento de configuração com modelos específicos do sistema.

NOTA sobre blkidpegadinha para aqueles que podem reutilizar os resultados da minha pergunta no futuro: blkidarmazena em cache os resultados das execuções anteriores em /etc/blkid.tab. Isso significa que a execução blkidcomo usuário não raiz pela primeira vez não retornará nenhum dado. Além disso, a execução blkidcomo usuário não raiz após a execução raiz retornará dados obsoletos (possivelmente incorretos).

Dmitriusan
fonte
Nos meus próprios sistemas, atribuo rótulos legíveis e únicos a todas as partições. Então eu posso descobrir quase tudo sobre eles usando suas etiquetas e /dev/disk/by-label... Isso também funciona para partições que não estão montadas. Ele tem a vantagem de poder escrever scripts que fazem coisas como rsync de raiz para raiz, o que é muito menos propenso a erros do que usar 2 UUIDS que não "significam" nada.
Joe

Respostas:

25

Use 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

Ele também possui várias opções para controlar como ele procura informações e como as apresenta (incluindo a saída JSON!). Faz parte do mountpacote, disponível em qualquer instalação do Ubuntu.

muru
fonte
Isso funciona muito bem em 16.04. Não funcionou para mim em 14.04. Eu tive que usar essa abordagem para obter os resultados desejados no confiável.
Elder Geek
11

Outra solução:

lsblk -nr -o UUID,MOUNTPOINT | grep -Po '.*(?= /$)'
  • -n suprime o cabeçalho (não é realmente necessário, mas é mais seguro para análise)
  • -r torna a produção bruta (torna a análise mais segura)
  • -o UUID,MOUNTPOINT inclua apenas as informações necessárias
pLumo
fonte
5

Você pode usar o lsblkcomando para gerar o UUID, mas precisa do nome do dispositivo da partição (como / dev / sda2). Você pode obter isso usando o dfcomando e aparando a saída. Use substituição de comando para dar o nome do dispositivo lsblk. Parece que você precisa do sudo para acessar o UUID, embora a saída normal do lsblk não o exija:

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
Arronical
fonte
2
Isso funciona para mim sem sudono 16.04.
Eliah Kagan 30/09
somente se você (ou algum script) já executou esse comando como root antes. Além disso, o ouput pode ser interrompido (do cache), neste caso
Dmitriusan
@Dmitriusan Corri isso em um sistema 14.04 que nunca teve lsblkou foi blkidexecutado pela raiz e funcionou perfeitamente. Você sabe por que haveria um problema de armazenamento em cache com este comando e não com a versão postada pelo Rovo? A saída bruta contorna o cache de alguma maneira?
Arronical
Eu acho que qualquer comando que acesse o UUID de dispositivos exigiria acesso root (incluindo a versão publicada pelo Rovo). Em relação lsblk, aqui é uma questão relacionada unix.stackexchange.com/questions/210889/... (veja a primeira resposta)
Dmitriusan
Concordo que o sudo é necessário, mas não consigo encontrar nada que sugira que o lsblk dependa do cache. Mesmo que eu execute blkidcomo root, a criação do arquivo de cache em /dev/.blkid.tab, o uso não sudo de lsblknão mostrará nada da coluna UUID. Não acho que exista risco de saída obsoleta.
Arronical
4

A melhor solução que consegui encontrar é

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

Parece não ideal, mas funciona.

Nota: [[: espaço:]] significaSpace

Dmitriusan
fonte
Isso funciona para mim, mas com sudo.
pa4080
4

Ajuste o valor mountpointpara o ponto de montagem atual do sistema de arquivos em questão:

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

Aqui está o que eu uso:

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

O tune2fs está no pacote e2fsprogs, do qual não me lembro se ele está instalado por padrão.

sudo apt install e2fsprogs

se não estiver instalado.

John
fonte
Eu awk: not an option: -eeditei sua resposta para torná-la funcional. Se eu exceder os limites, sinta-se à vontade para revertê-lo. Felicidades! :-)
Elder Geek
Estranho, parece funcionar com ou sem o -e para mim. -e está documentado na página de manual do awk. Eu sempre o usei em scripts e fiquei surpreso que funcionou bem sem ele :) Eu acho que -e é um antigo hábito do UNIX. Mas eu deveria ter sido consistente em meu uso e usado em ambos os lugares ou em nenhum dos lugares para não confundir as pessoas.
John
Ah, eu recebo o mesmo resultado que você em 14.04 que usa gawk. Eu recebo o erro especificado em 16.04, que parece usar em seu mawklugar.
Elder Geek
É uma daquelas coisas / etc / alternativas. / etc / alternative / awk -> / usr / bin / gawk para mim no meu 16.04. O Mawk está instalado, mas não está ativo no / etc / alternative. No meu gnomo 17.04, ele aponta para awk. Na minha nova instalação 17.10 é mawk. Depois de instalar o gawk, o link aponta para o gawk, a desinstalação do gawk o retorna para o mawk.
John
:-) É estas pequenas diferenças entre os programas supostamente semelhantes que provavelmente levou a declarações como "Menos é mais"
Elder Geek
1

Testado para funcionar em 14.04 e 16.04

Um one-liner simples que sempre deve produzir o UUID de uma raiz /é

exportar DRIVE = $ (mount | grep '/' | awk -F "em" '{print $ 1}'); blkid $ DRIVE | cut -d '"' -f2`

O que estamos fazendo aqui é saudar a saída de mount para corresponder ao símbolo raiz com espaços em ambos os lados /para evitar a correspondência quando /é usado como um símbolo de extensão de caminho, canalizando isso awkusando "on" como um separador de campo para produzir apenas o nome do dispositivo e atribuindo THAT à variável de ambiente $ DRIVE, usando a saída do blkid $DRIVEcanal de corte usando o "como um separador de campo e selecionando apenas o segundo campo que retira todo o resto, deixando apenas o UUID.

Observe que o que pertence após grep no comando acima é na verdade ' space/ space' e não '/' como aparece.

Isso tem o benefício de não exigir sudoe retornará o resultado apropriado, independentemente de como o inversor esteja montado.

Seria sensato garantir que você não esteja usando a variável de ambiente $ DRIVE para qualquer outra coisa antes de tentar essa abordagem echo $DRIVEretornará uma linha em branco se você não estiver usando a variável.

Elder Geek
fonte