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ę).


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.


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.


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

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}'
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.