Trova il filesystem di una partizione non montata da uno script


16

Sto scrivendo un'installazione automatica personalizzata utilizzando AIF (Arch Installation Framework) e ho bisogno di trovare il filesystem su una partizione data una partizione.

Finora ho questo:

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

Questo ha funzionato bene sulla mia macchina con un solo disco rigido, ma non è riuscito (ovviamente) durante l'esecuzione nella mia VM in esecuzione su un LiveCD (il LiveCD veniva raccolto come un'altra unità, / dev / sr0).

Ho pensato a un paio di hack che potrei provare:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • utilizzare parted -mls, ma estrarre la partizione a cui tengo con script intelligenti, quindi analizzare come già faccio nello scriptt

C'è un modo migliore e più semplice per farlo? Ho già le partizioni che mi interessano e ho solo bisogno di trovare i loro filesystem (oltre a trovare lo swap disponibile).


3
@Mikel No, quella domanda esamina un filesystem montato. Mentre puoi montare il filesystem e vedere che tipo è montato, questo è lento, non robusto, non funziona per lo scambio, funziona solo per i filesystem supportati dal kernel in esecuzione ...
— Gilles 'SO- smetti di essere malvagio'

Risposte:


16

Penso di aver trovato la risposta: blkid

Dalla pagina man:

Il programma blkid è l'interfaccia della riga di comando per lavorare con la libreria libblkid (3). Può determinare il tipo di contenuto (ad es. Filesystem o swap) contenuto in un dispositivo a blocchi e anche attribuire (token, NAME = coppie di valori) dai metadati del contenuto (ad es. Campi LABEL o UUID).

Apparentemente stampa il nome del dispositivo insieme al tipo di filesystem (insieme ad alcune altre informazioni utili). Per ottenere un elenco di tutti i dispositivi con i loro tipi:

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

Per trovare tutti i /dev/sd*/dispositivi, basta aggiungere un grep:

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

Quindi solo cuto awkper ottenere ciò di cui hai bisogno.


11
blkid può filtrare ciò di cui hai bisogno da solo - non c'è bisogno di sed / grep / awk magic:blkid -s TYPE -o value /dev/sda3
— Petr Uzel,

@PetrUzel - Fantastico! Questo è esattamente quello che stavo cercando!
— Beatgammit,

2
Ricordati di correre con sudose non sei root! Questo mi ha sorpreso perché blkidnon stampa alcun messaggio di errore ed esce con il codice di stato 0 se non può accedere ai dispositivi a blocchi ...
— Asfand Qazi

Raramente c'è un bisogno di pipe grepa sed. grep foo | sed 's/pattern/repl/'è scritto in modo più pulitosed '/foo/s/pattern/repl/'
— William Pursell il

9

file -s /path/to/device identificherà il filesystem su un disco / partizione / slice.

Alla:

[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)

almeno, su Linux lo fa.


Esiste un modo per filtrare in modo affidabile il tipo di filesystem da uno script?
— Beatgammit,

dipende dal fatto che si consideri il nome completo del filesystem sufficientemente filtrato, come in | cut -d: -f2 | cut -d( -f1o qualcosa del genere. Non è così bello blkid, questo è certo. :)
— Tim Kennedy,

2

Mostra solo il tag TYPE del dispositivo a blocchi e mostra solo il suo valore:

blkid -s TYPE -o value "$device"

Esempio:

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

0

Un'opzione secondaria che funziona con molti filesystem e ha il vantaggio di lavorare anche con filesystem che hanno strutture danneggiate testdisk. (È possibile eseguire sudo apt install testdiskper installarlo.)

Script per restituire solo il tipo di filesystem in questo modo:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.