BASH: encontrando partição da saída diskutil

1

Estou tentando pesquisar a saída de um comando listando unidades locais para localizar uma partição chamada EFI no HDD de inicialização.

Eu escrevi um oneliner muito sujo, pois não consigo descobrir como encontrar efetivamente o HDD principal (presumivelmente sempre Macintosh HD) e, em seguida, descobrir qual é a partição EFI na mesma unidade e, em seguida, encontre o disco # s # IDENTIFICADOR para a partição EFI na unidade Macintosh HD.

A saída padrão de diskutil list é algo como isto

$ diskutil list
/dev/disk0
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *500.1 GB   disk0
1:                        EFI EFI                     209.7 MB   disk0s1
2:                  Apple_HFS Macintosh HD            499.1 GB   disk0s2
3:                 Apple_Boot Recovery HD             784.2 MB   disk0s3

/dev/disk1
#:                       TYPE NAME                    SIZE       IDENTIFIER
0:      GUID_partition_scheme                        *1.5 TB     disk1
1:                        EFI EFI                     209.7 MB   disk1s1
2:                  Apple_HFS Data                    1.5 TB     disk1s2

Então aqui está o forro sujo que eu tenho usado. Existe uma maneira melhor de fazer isso?

diskutil mount $(diskutil list | grep -i 'Macintosh\ HD' | awk '{print $6}' | grep -i 'disk0s')

    
por juliushibert 23.07.2015 / 09:36

3 respostas

0

Eu diria que / dev / disk0 é sempre o disco rígido "principal", certo? Se não, e você realmente deseja encontrar a partição EFI no disco chamado "Macintosh HD", seu oneliner está quase correto.

Para mim, $ 6 retorna 'GB' e também presumo que a partição EFI seja sempre a primeira desse disco em particular, então tente:

diskutil list | grep 'Macintosh HD' | awk '{print $(NF)}' | sed 's/s[0-9]/s1/'

ou algum truque mais awk (para uma boa medida):

diskutil list | awk '/Macintosh HD/ { sub(/s[0-9]/, "s1", $(NF)); print $(NF) }'
    
por 23.07.2015 / 12:06
0

Você pode tentar detectar o dispositivo de bloqueio principal usando:

mount | awk '/on \/ / {print $1}'

Não consigo encontrar uma maneira de detectar meu volume principal, já que minha saída não os lista, só consigo ver o dispositivo de bloqueio principal e alguma descrição do conteúdo:

/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         250.1 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           *249.8 GB   disk1
                                 Logical Volume on disk0s2
                                 XXXXXXXX-XXXX-XXXX-XXXX-7C6C089FXXXX
                                 Unencrypted

No meu caso, posso usar facilmente o awk '/Logical Volume/ {print $NF}' , mas um script mais robusto levará em conta a versão do Mac para verificar todos os casos possíveis.

BTW, estou usando o Yosemite 10.10.4 no MBP 15 "em meados de 2014.

    
por 23.07.2015 / 11:36
0

Ok, isso não está completo, mas fiquei sem tempo.

Então, eu uso o comando df, porque eu sei que isso terá o ponto de montagem no final. Então eu grep-lo com um padrão de slash newline. E então eu queria cortar tudo após o primeiro espaço sair. Mas o recorte não funciona agora. Não sei realmente o que estou fazendo de errado e tenho que começar a trabalhar para o meu trabalho agora, mas talvez você possa melhorar o corte do recurso bash. Desculpe, não há tempo para procurar o manual para encontrar o meu erro. Mas estamos quase lá:

Corrigido:

foo=$(df -h | grep -e ' /$'); loo=${foo%%" "*}; echo $loo

Agora funciona. Experimente:)

EDITAR: Ah, acabei de perceber que estou usando um lvg, portanto disk0s [0-4] será traduzido para disk1. Então, teste-o e diga-me se isso está mostrando corretamente o disco certo que você não está usando um lvg.

EDIT 2: Ainda não está funcionando para o grupo de volume lógico criptografado, mas se você pudesse testar este sem o FileVault, ele deveria funcionar

foo=$(mount | grep -e ' / '); foo=${foo%%" "*}; diskutil list | grep "[0-99]:" | grep ${foo##"/dev/"} | grep EFI)

Isso procuraria por um EFI no disco no qual ele é montado como root, então geralmente MacintoshHD

EDIT 3: Isso é ótimo para matar o tempo no trabalho. Ok, acho que isso deveria lhe dar a resposta certa. Ele pode fazer isso mesmo se for criptografado pelo FileVault.

#!/bin/bash

maindrive=$(mount | grep -e " / ")
maindrive_exact=${maindrive%%" "*}
maindrive_reduced=${maindrive_exact##"/dev/"}

if [ "$(diskutil list | grep Unlocked)" = "" ]
        then
                diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI)
                diskline_cut1=${diskline##*"B "}
                diskline_cut2=${diskline##*" "}
                echo "/dev/$diskline_cut2"

        else
                alldisk=$(diskutil list)
                alldisk_cut1=${alldisk##*${maindrive_reduced}}
                alldisk_cut2=${alldisk_cut1#*"Logical Volume on "}
                alldisk_cut3=${alldisk_cut2%%" "*}
                echo /dev/$alldisk_cut3
fi

Portanto, isso deve fornecer a partição EFI no mesmo disco rígido que a sua pasta raiz MacintoshHD.

EDIT 4 (Esperemos que a versão final)

#!/bin/bash

maindrive=$(mount | grep -e " / ")
maindrive_exact=${maindrive%%" "*}
maindrive_reduced=${maindrive_exact##"/dev/"} 


function getdisknumber {
diskline=$(diskutil list | grep "[0-99]:" | grep $maindrive_reduced | grep EFI)
                diskline_cut1=${diskline##*"B "}
                diskline_cut2=${diskline##*" "}
                echo "/dev/$diskline_cut2"
}

if [ "$(diskutil list | grep Unlocked)" = "" ] 
    then 
        getdisknumber   
    else 
        alldisk=$(diskutil list)
        alldisk_cut=${alldisk#*${maindrive_reduced}}
        alldisk_cut=${alldisk_cut#*"Logical Volume on "}
        alldisk_cut=${alldisk_cut%%" "*}
        alldisk_cut=${alldisk_cut%s*}
        maindrive_reduced=$alldisk_cut
        getdisknumber
fi

E aqui está a explicação

Okay, as ask in the comment, the explanation what %%,%,##,# means. 
All those symbols cut out information of a string.
%%pattern cuts out the biggest pattern matching part to the right.
%pattern cuts out the smallest pattern matching part to the right.
##pattern cuts out the biggest pattern matching part to the left
#pattern cuts out the smallest pattern matching part to the left

A outra parte do script agora tenta encontrar o disco rígido certo quando confrontado com um Volume criptografado criado pelo FileVault. Em seguida, a função corta esse disco rígido até as informações do disco neste disco rígido, procurando EFI como uma palavra-chave.

Aqui está um link sobre o corte de strings no bash Cortando strings

EDIT 5: Tudo bem. Outra iteração desse script. Muito, muito para baixo ao básico.

#!/bin/bash

## Find the main hard drive

maindrive=$(mount | grep -e " / ")
maindrive=${maindrive#/dev/}
maindrive=${maindrive%%" "*}


## Checking for FileVault

if [ "" != "$(diskutil list /dev/disk1 | grep "Unlocked Encrypted")" ]
        then
                maindrive=$(diskutil list | grep "Logical Volume on")
                maindrive=${maindrive#*"Logical Volume on "}
                maindrive=${maindrive%s*}
fi


## Checking for EFI

EFI_DRIVE=$(diskutil list /dev/$maindrive | grep EFI)
EFI_DRIVE=${EFI_DRIVE##*" "}
echo "/dev/$EFI_DRIVE"

Para completar, essa é a minha lista de diskutil:

/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *250.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         249.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           *248.8 GB   disk1
                                 Logical Volume on disk0s2
                                 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
                                 Unlocked Encrypted

E isso acontece quando eu executo o script:

Joes-MacBook-Pro:EFI_Script joe$ chmod +x EFI_Script
Joes-MacBook-Pro:EFI_Script joe$ ./EFI_Script
/dev/disk0s1
Joes-MacBook-Pro:EFI_Script joe$

Eu pensei em por que isso não funcionou para você até agora. Então, basicamente, se isso não funcionar, eu preciso de duas informações suas. Primeiro, precisarei saber sua saída para o comando 'mount'. O meu parece assim:

Joes-MacBook-Pro:EFI_Script joe$ mount
/dev/disk1 on / (hfs, local, journaled)
devfs on /dev (devfs, local, nobrowse)
map -hosts on /net (autofs, nosuid, automounted, nobrowse)
map auto_home on /home (autofs, automounted, nobrowse)

Como você pode ver, ele me fornece o ponto de montagem '/' on 'disk1'. Eu simplesmente presumi que, se o FileVault estivesse desativado, ele forneceria o seu ponto de montagem no disco0. Mas talvez eu esteja errado e não tenha nenhum sistema no qual o FileVault esteja desligado. Então, se o seu ponto de montagem também estiver no disco1 enquanto a EFI estiver no disco0, ele deve retornar vazio ou apenas com / dev /, já que é isso que eu adicionei manualmente. Por outro lado, se bem me lembro, você também tinha uma partição EFI no disk1.

De qualquer forma, a segunda coisa que eu preciso é que você execute este script com o comando 'bash -x script', para que ele mostre o que ele faz enquanto está rodando. Desta forma, podemos ver o que está errado.

De qualquer forma, espero que funcione e não tenhamos que ir a esse tamanho. Mas se não, temos que descobrir outra maneira de encontrar o disco rígido principal.

De qualquer forma, teste-o. Felicidades!

    
por 23.07.2015 / 11:42