Localiza o sistema de arquivos de uma partição desmontada 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 com 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 em execução em um LiveCD (o LiveCD estava sendo captado como outra unidade, /dev/sr0).

Eu pensei em alguns hacks que eu poderia experimentar:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • use parted -mls , mas puxe a partição de que me importo com scripts inteligentes e, em seguida, analise como já faço no script

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

    
por beatgammit 17.07.2012 / 06:25

3 respostas

16

Acho que encontrei a resposta: blkid

Da página do manual:

The blkid program is the command-line interface to working with the libblkid(3) library. It can determine the type of content (e.g. filesystem or swap) that a block device holds, and also attributes (tokens, NAME=value pairs) from the content metadata (e.g. LABEL or UUID fields).

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

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

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

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

Em seguida, apenas cut ou awk para obter o que você precisa.

    
por 17.07.2012 / 07:10
9

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

A 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 isso acontece.

    
por 18.07.2012 / 06:12
2

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

blkid -s TYPE -o value "$device"

Exemplo:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs
    
por 31.10.2017 / 05:52