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

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

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

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 un solo disco duro, pero falló (obviamente) cuando se ejecutó en mi VM con un LiveCD (el LiveCD se estaba seleccionando como otra unidad, /dev/sr0).

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

  • mount $partition; grep $partition /etc/mtab | awk ...
  • use 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

¿Existe una forma mejor y más sencilla de hacer esto? Ya tengo las particiones que me interesan y sólo necesito encontrar sus sistemas de archivos (así como encontrar el intercambio disponible).

Respuesta1

Creo que encontré la respuesta:blkid

Desde la página de 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 atributos (tokens, pares NOMBRE=valor) de los metadatos del contenido (por ejemplo, campos ETIQUETA o UUID).

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

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

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

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

Entonces solo cuto awkpara conseguir lo que necesitas.

Respuesta2

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

Respuesta3

Muestra solo la etiqueta TYPE del dispositivo de bloque y solo genera su valor:

blkid -s TYPE -o value "$device"

Ejemplo:

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

Respuesta4

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

Guíelo para que devuelva solo el tipo de sistema de archivos como este:

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

información relacionada