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

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

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

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 em execução em um LiveCD (o LiveCD estava sendo selecionado como outra unidade,/dev/sr0).

Pensei em alguns hacks que 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 nas quais estou interessado e só preciso encontrar seus sistemas de arquivos (bem como encontrar os swaps disponíveis).

Responder1

Acho que encontrei a resposta:blkid

Na página de manual:

O programa blkid é a interface de linha de comando 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 contém e também atributos (tokens, pares NOME=valor) dos metadados de conteúdo (por exemplo, campos LABEL ou UUID).

Aparentemente, ele 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 /dev/sd*/os dispositivos, basta adicionar um grep:

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

Então é só cutou awkpara conseguir o que você precisa.

Responder2

file -s /path/to/deviceidentificará 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 sim.

Responder3

Mostre apenas a tag TYPE do dispositivo de bloco e produza apenas seu valor:

blkid -s TYPE -o value "$device"

Exemplo:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs

Responder4

Uma opção secundária que funciona com muitos sistemas de arquivos e tem a vantagem de funcionar mesmo com sistemas de arquivos que possuem estruturas danificadas é o testdisk. (Você pode executar sudo apt install testdiskpara instalá-lo em sistemas baseados em Debian.)

Faça um script para retornar apenas o tipo de sistema de arquivos como este:

$ testdisk /list "$path_to_partition" | awk '$1 == "P" {print $2}'

informação relacionada