Obtém o UUID do / filesystem from script

10

Como posso obter o UUID de um volume que contenha o sistema de arquivos / ? A melhor coisa que encontrei até hoje é blkid -o list . Mas esta saída é legível e difícil de analisar. Talvez exista uma maneira melhor?

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

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

    
por Dmitriusan 29.09.2017 / 13:16

7 respostas

22

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 tem várias opções para controlar como ele procura informações e como elas são apresentadas (incluindo a saída JSON!). Faz parte do pacote mount , então disponível em qualquer instalação do Ubuntu.

    
por muru 29.09.2017 / 22:02
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 produz saída bruta (torna mais seguro analisar)
  • -o UUID,MOUNTPOINT inclui apenas informações necessárias
por RoVo 29.09.2017 / 14:25
5

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

sudo lsblk -n -o UUID "$(df -P / | tail -n1 | cut -d' ' -f1)"
    
por Arronical 29.09.2017 / 13:40
4

A melhor solução que consegui criar é

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

Parece não-ideal, mas funciona.

Nota: [[: space:]] significa Espaço

    
por Dmitriusan 29.09.2017 / 13:36
4

Ajuste o valor de mountpoint para 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'
    
por David Foerster 29.09.2017 / 18:54
1

Veja o que eu uso:

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

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

sudo apt install e2fsprogs

se não estiver instalado.

    
por John 04.10.2017 / 00:52
1

Testado para trabalhar em 14,04 e 16,04

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

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

O que estamos fazendo aqui é mostrar a saída de mount para coincidir com o símbolo raiz com espaços em ambos os lados / para evitar correspondência quando / é usado como um símbolo de extensão de caminho, passando isso por awk usando " on "como um separador de campo para produzir apenas o nome do dispositivo e atribuir THAT à variável de ambiente $ DRIVE, usando a saída de blkid $DRIVE canalizada por recorte usando o " como separador de campo e selecionando apenas o segundo campo que elimina todo o resto, deixando apenas o UUID.

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

Isso tem o benefício de não exigir sudo e retornará o resultado apropriado, independentemente de como o drive está montado.

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

    
por Elder Geek 21.10.2017 / 22:00