Encontre um sistema de arquivos de uma partição desmontada a partir de um script

16

Estou escrevendo uma instalação automatizada personalizada usando o AIF (Arch Installation Framework) e preciso encontrar o sistema de arquivos em uma partição, dada uma partição.

Até agora eu tenho isso:

grok_partitions () {
    local partitions=
    for label in `ls /dev/disk/by-label | grep "Arch"`
    do
        if [ $label == "Arch" ]
        then
            mount_point="/"
        else
            IFS="-" read base mount <<< "${label}"
            mount_point="/${mount}"
        fi

        local partition=$(readlink -f /dev/disk/by-label/${label})
        local part_no=$(echo ${partition} | grep -Po '\d+')
        local fs=$(parted -mls | grep "^${part_no}" | cut -d: -f5)
        partitions+="${partition} raw ${label} ${fs};yes;${mount_point};target;no_opts;${label};no_params\n"
    done

    # do the swap
    if [ -e /dev/disk/by-label/swap ]
    then
        local partition=$(readlink -f /dev/disk/by-label/swap)
        partitions+="$partition raw swap swap;yes;no_mountpoint;target;no_opts;swap;no_params"
    else
        # if there's no labeled swap, use the first one we find
        local partition=$(fdisk -l | grep -m1 swap | awk '{ print $1 }')
        if [ ! -e $partition ]
        then
            echo "No swap detected. Giving up."
            exit 1
        fi
        partitions+="$partition raw no_label swap;yes;no_mountpoint;target;no_opts;no_label;no_params"
    fi

    echo -n ${partitions}
}

Isso funcionou bem na minha máquina com apenas um disco rígido, mas falhou (obviamente) ao executar na minha VM executando em um LiveCD (o LiveCD estava sendo escolhido como outra unidade, / dev / sr0).

Pensei em alguns hacks que eu poderia tentar:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • use parted -mls, mas retire a partição que me interessa com scripts inteligentes e analise como já faço no scriptt

Existe uma maneira melhor e mais simples de fazer isso? Já tenho as partições em que estou interessado e só preciso encontrar seus sistemas de arquivos (assim como encontrar a troca disponível).

beatgammit
fonte
3
@ Mikel Não, essa pergunta aborda um sistema de arquivos montado. Enquanto você pode montar o sistema de arquivos e depois ver que tipo ele é montado, é lento, não é robusto, não funciona para troca, funciona apenas para sistemas de arquivos suportados pelo kernel em execução ...
Gilles 'SO- stop be evil'

Respostas:

16

Eu acho que encontrei a resposta: blkid

Na página do manual:

O programa blkid é a interface da linha de comandos para trabalhar com a biblioteca libblkid (3). Ele pode determinar o tipo de conteúdo (por exemplo, sistema de arquivos ou swap) que um dispositivo de bloco mantém e também atribui (tokens, NAME = pares de valor) dos metadados do conteúdo (por exemplo, campos LABEL ou UUID).

Aparentemente, imprime o nome do dispositivo junto com o tipo de sistema de arquivos (junto com outras informações úteis). Para obter uma lista de todos os dispositivos com seus tipos:

blkid | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

Para encontrar todos os /dev/sd*/dispositivos, basta adicionar um grep:

blkid | grep "/dev/sd.*" | sed 's!\(.*\):.*TYPE="\(.*\)".*!\1: \2!'

Então apenas cutou awkpara obter o que você precisa.

beatgammit
fonte
11
O blkid pode filtrar o que você precisa por si só - sem a necessidade de magia sed / grep / awk: blkid -s TYPE -o value /dev/sda3
Petr Uzel
@PetrUzel - Awesome! Era exatamente o que eu estava procurando!
Beatgammit
2
Lembre-se de executar com sudose você não é root! Este me chamou a atenção porque blkidnão imprime nenhuma mensagem de erro e sai com o código de status 0 se não puder acessar dispositivos de bloco ...
Asfand Qazi
Raramente há uma necessidade de tubulação greppara sed. grep foo | sed 's/pattern/repl/'é escrito de maneira mais limpased '/foo/s/pattern/repl/'
William Pursell
9

file -s /path/to/device identificará o sistema de arquivos em um disco / partição / fatia.

À la:

[root@node2 ~]# file -s /dev/mapper/VolGroup00-LogVol00
/dev/mapper/VolGroup00-LogVol00: Linux rev 1.0 ext3 filesystem data (needs journa recovery) (large files)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv1 
/dev/mapper/coraid--pool-coraid--lv1: Linux GFS2 Filesystem (blocksize 4096, lockproto lock_dlm)
[root@node2 ~]# file -s /dev/mapper/coraid--pool-coraid--lv2 
/dev/mapper/coraid--pool-coraid--lv2: SGI XFS filesystem data (blksz 4096, inosz 256, v2 dirs)

pelo menos no Linux ele faz.

Tim Kennedy
fonte
Existe uma maneira de filtrar com segurança o tipo de sistema de arquivos de um script?
Beatgammit 18/07/2012
depende se você considera o nome completo do sistema de arquivos filtrado o suficiente, como em | cut -d: -f2 | cut -d( -f1algo assim. Não é tão bonito quanto blkidisso, com certeza. :)
Tim Kennedy
2

Mostrar apenas a tag TYPE do dispositivo de bloco e gerar apenas seu valor:

blkid -s TYPE -o value "$device"

Exemplo:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs
Tom Hale
fonte
0

Uma opção secundária que funciona com muitos sistemas de arquivos e tem o benefício de trabalhar mesmo com sistemas de arquivos que possuem estruturas danificadas testdisk. (Você pode corrersudo apt install testdisk para instalá-lo.)

Script para retornar apenas o tipo de sistema de arquivos como este:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Restabelecer Monica
fonte