Znajdź system plików odmontowanej partycji ze skryptu

16

Piszę niestandardową automatyczną instalację za pomocą AIF (Arch Installation Framework) i muszę znaleźć system plików na partycji, na której jest partycja.

Do tej pory mam to:

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

Działa to dobrze na moim komputerze z tylko jednym dyskiem twardym, ale zawiodło (oczywiście) podczas działania na mojej maszynie wirtualnej działającej na LiveCD (LiveCD był odbierany jako inny dysk, / dev / sr0).

Pomyślałem o kilku hackach, które mogłem wypróbować:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • użyj parted -mls, ale wyciągnij partycję, na której mi zależy, dzięki sprytnemu skryptowi, a następnie przeanalizuj, jak już to zrobiłem w skryptach

Czy istnieje lepszy, prostszy sposób na zrobienie tego? Mam już partycje, którymi się interesuję, i muszę tylko znaleźć ich systemy plików (jak również znaleźć dostępną wymianę).

beatgammit
źródło
3
@Mikel Nie, to pytanie dotyczy zamontowanego systemu plików. Chociaż możesz zamontować system plików, a następnie zobaczyć, jakiego typu jest on zamontowany, jest on powolny, nie jest niezawodny, nie działa w trybie wymiany, działa tylko w systemach plików obsługiwanych przez działające jądro ...
Gilles „SO- przestań być zły”

Odpowiedzi:

16

Myślę, że znalazłem odpowiedź: blkid

Ze strony podręcznika:

Program blkid jest interfejsem wiersza poleceń do pracy z biblioteką libblkid (3). Może określać rodzaj treści (np. System plików lub swap), które posiada urządzenie blokowe, a także atrybuty (tokeny, NAME = pary wartości) na podstawie metadanych treści (np. Pola LABEL lub UUID).

Najwyraźniej drukuje nazwę urządzenia wraz z typem systemu plików (wraz z kilkoma innymi przydatnymi informacjami). Aby uzyskać listę wszystkich urządzeń z ich typami:

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

Aby znaleźć wszystkie /dev/sd*/urządzenia, po prostu dodaj grep:

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

Więc po prostu cutlub, awkaby uzyskać to, czego potrzebujesz.

beatgammit
źródło
11
blkid można filtrować co trzeba na własną rękę - nie ma potrzeby sed / grep / awk magii:blkid -s TYPE -o value /dev/sda3
Petr Uzel
@PetrUzel - Awesome! Właśnie tego szukałem!
beatgammit
2
Pamiętaj, aby biegać, sudojeśli nie jesteś rootem! Ten mnie przyłapał, ponieważ blkidnie drukuje żadnych komunikatów o błędach i wychodzi z kodem stanu 0, jeśli nie może uzyskać dostępu do urządzeń blokowych ...
Asfand Qazi
Rzadko trzeba rurować grep do sed. grep foo | sed 's/pattern/repl/'jest bardziej czytelnie napisanesed '/foo/s/pattern/repl/'
William Pursell
9

file -s /path/to/device zidentyfikuje system plików na dysku / partycji / plasterku.

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)

przynajmniej w Linuksie tak.

Tim Kennedy
źródło
Czy istnieje sposób, aby niezawodnie odfiltrować typ systemu plików ze skryptu?
beatgammit
zależy od tego, czy uważasz, że pełna nazwa systemu plików jest wystarczająco odfiltrowana, jak w | cut -d: -f2 | cut -d( -f1lub coś. Na blkidpewno nie jest tak ładny . :)
Tim Kennedy,
2

Pokaż tylko znacznik TYPE urządzenia blokowego i wyświetl tylko jego wartość:

blkid -s TYPE -o value "$device"

Przykład:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs
Tom Hale
źródło
0

Druga opcja, która działa z wieloma systemami plików i ma tę zaletę, że działa nawet z systemami plików, które mają uszkodzone struktury testdisk . (Możesz uruchomić, sudo apt install testdiskaby go zainstalować.)

Skryptuj go, aby zwrócić typ systemu plików taki jak ten:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Przywróć Monikę
źródło