Encuentre el sistema de archivos de una partición desmontada de un script

16

Estoy escribiendo una instalación automatizada personalizada usando AIF (Arch Installation Framework), y necesito encontrar el sistema de archivos en una partición dada una partición.

Hasta ahora tengo esto:

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}
}

Esto funcionó bien en mi máquina con solo un disco duro, pero falló (obviamente) cuando se ejecutaba en mi VM ejecutándose en un LiveCD (el LiveCD se estaba recogiendo como otra unidad, / dev / sr0).

He pensado en un par de trucos que podría probar:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • uso parted -mls, pero extraiga la partición que me interesa con secuencias de comandos inteligentes, luego analice como ya lo hago en la secuencia de comandos

¿Hay una manera mejor y más simple de hacer esto? Ya tengo las particiones que me interesan, y solo necesito encontrar sus sistemas de archivos (así como encontrar el intercambio disponible).

beatgammit
fuente
3
@Mikel No, esa pregunta analiza un sistema de archivos montado. Si bien puede montar el sistema de archivos, entonces vea de qué tipo está montado, esto es lento, no robusto, no funciona para intercambio, solo funciona para sistemas de archivos compatibles con el núcleo en ejecución ...
Gilles 'SO- deja de ser malvado'

Respuestas:

16

Creo que encontré la respuesta: blkid

Desde la página del manual:

El programa blkid es la interfaz de línea de comandos para trabajar con la biblioteca libblkid (3). Puede determinar el tipo de contenido (por ejemplo, sistema de archivos o intercambio) que contiene un dispositivo de bloque, y también los atributos (tokens, NOMBRE = pares de valores) de los metadatos de contenido (por ejemplo, campos LABEL o UUID).

Aparentemente imprime el nombre del dispositivo junto con el tipo de sistema de archivos (junto con alguna otra información útil). Para obtener una lista de todos los dispositivos con sus tipos:

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

Para encontrar todos los /dev/sd*/dispositivos, solo agregue un grep:

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

Entonces solo cuto awkpara obtener lo que necesita.

beatgammit
fuente
11
blkid puede filtrar lo que necesita por sí mismo, sin necesidad de magia sed / grep / awk:blkid -s TYPE -o value /dev/sda3
Petr Uzel
@PetrUzel - ¡Impresionante! ¡Eso es exactamente lo que estaba buscando!
beatgammit
2
¡Recuerde correr con sudosi no es root! Este me sorprendió porque blkidno imprime ningún mensaje de error y sale con el código de estado 0 si no puede acceder a dispositivos de bloqueo ...
Asfand Qazi
Rara vez hay una necesidad de tubería grepa sed. grep foo | sed 's/pattern/repl/'está más limpiamente escritosed '/foo/s/pattern/repl/'
William Pursell
9

file -s /path/to/device identificará el sistema de archivos en un disco / partición / segmento.

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)

al menos, en Linux lo hace.

Tim Kennedy
fuente
¿Hay alguna manera de filtrar de manera confiable el tipo de sistema de archivos de un script?
beatgammit
depende de si considera que el nombre completo del sistema de archivos se ha filtrado lo suficiente, como en | cut -d: -f2 | cut -d( -f1o algo así. No es tan bonito como blkid, eso es seguro. :)
Tim Kennedy
2

Muestre solo la etiqueta TYPE del dispositivo de bloque y solo muestre su valor:

blkid -s TYPE -o value "$device"

Ejemplo:

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

Una opción secundaria que funciona con muchos sistemas de archivos y tiene la ventaja de trabajar incluso con sistemas de archivos que tienen estructuras dañadas es testdisk. (Puedes ejecutarlo sudo apt install testdiskpara instalarlo).

Escríbelo para devolver solo el tipo de sistema de archivos como este:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Reinstalar a Mónica
fuente