Suchen Sie das Dateisystem einer nicht gemounteten Partition über ein Skript

Suchen Sie das Dateisystem einer nicht gemounteten Partition über ein Skript

Ich schreibe eine benutzerdefinierte automatisierte Installation mit AIF (Arch Installation Framework) und muss das Dateisystem auf einer angegebenen Partition finden.

Bisher habe ich Folgendes:

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

Auf meinem Rechner mit nur einer Festplatte funktionierte dies problemlos, schlug aber (offensichtlich) beim Ausführen in meiner VM auf einer LiveCD fehl (die LiveCD wurde als anderes Laufwerk ausgewählt, /dev/sr0).

Mir sind ein paar Hacks eingefallen, die ich ausprobieren könnte:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • benutze parted -mls, aber ziehe die Partition, die mir wichtig ist, mit cleverem Scripting heraus und analysiere sie dann, wie ich es bereits im Script mache.

Gibt es eine bessere, einfachere Möglichkeit, dies zu tun? Ich habe bereits die Partitionen, die mich interessieren, und muss nur ihre Dateisysteme finden (sowie den verfügbaren Swap).

Antwort1

Ich glaube, ich habe die Antwort gefunden:blkid

Aus der Manpage:

Das Programm blkid ist die Befehlszeilenschnittstelle für die Arbeit mit der Bibliothek libblkid(3). Es kann den Inhaltstyp (z. B. Dateisystem oder Swap) bestimmen, den ein Blockgerät enthält, sowie Attribute (Token, NAME=Wert-Paare) aus den Inhaltsmetadaten (z. B. LABEL- oder UUID-Felder).

Offenbar gibt es den Gerätenamen zusammen mit dem Dateisystemtyp aus (und einigen anderen nützlichen Informationen). So erhalten Sie eine Liste aller Geräte mit ihren Typen:

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

Um alle /dev/sd*/Geräte zu finden, fügen Sie einfach ein grep hinzu:

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

Dann holen Sie sich einfach, was Sie brauchen cut.awk

Antwort2

file -s /path/to/deviceidentifiziert das Dateisystem auf einer Festplatte/Partition/Slice.

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)

zumindest unter Linux ist dies der Fall.

Antwort3

Zeigt nur das TYPE-Tag des Blockgeräts an und gibt nur seinen Wert aus:

blkid -s TYPE -o value "$device"

Beispiel:

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

Antwort4

Eine zweite Option, die mit vielen Dateisystemen funktioniert und den Vorteil hat, dass sie sogar mit Dateisystemen funktioniert, deren Strukturen beschädigt sind, ist testdisk. (Sie können es ausführen sudo apt install testdisk, um es auf Debian-basierten Systemen zu installieren.)

Erstellen Sie ein Skript, um nur den Dateisystemtyp wie folgt zurückzugeben:

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

verwandte Informationen