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.