Suchen Sie das Dateisystem einer nicht gemounteten Partition in einem Skript

16

Ich schreibe eine benutzerdefinierte automatische Installation mit AIF (Arch Installation Framework) und muss das Dateisystem auf einer Partition finden, die einer Partition zugeordnet ist.

Bisher habe ich das:

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

Dies funktionierte auf meinem Computer mit nur einer Festplatte einwandfrei, schlug jedoch (offensichtlich) fehl, wenn ich meine VM auf einer LiveCD laufen ließ (die LiveCD wurde als ein anderes Laufwerk aufgenommen, / dev / sr0).

Ich habe mir ein paar Hacks ausgedacht, 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 scriptt getan habe

Gibt es einen besseren, einfacheren Weg, dies zu tun? Ich habe bereits die Partitionen, an denen ich interessiert bin, und ich muss nur deren Dateisysteme finden (sowie den verfügbaren Swap finden).

Beatgammit
quelle
3
@Mikel Nein, diese Frage bezieht sich auf ein bereitgestelltes Dateisystem. Während Sie das Dateisystem mounten kann dann sehen , was es gibt als angebracht, das ist langsam, nicht robust, funktioniert nicht für Swap, funktioniert nur für durch den laufenden Kernel unterstützt Dateisysteme ...
Gilles ‚SO- Anschlag, die bösen‘

Antworten:

16

Ich glaube, ich habe die Antwort gefunden: blkid

Von der Manpage:

Das Programm blkid ist die Befehlszeilenschnittstelle zum Arbeiten mit der Bibliothek libblkid (3). Er kann den Inhaltstyp (z. B. Dateisystem oder Swap) eines Blockgeräts sowie Attribute (Token, NAME = Wertepaare) aus den Inhaltsmetadaten (z. B. LABEL- oder UUID-Felder) bestimmen.

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

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 einfach cutoder um awkzu bekommen, was Sie brauchen.

Beatgammit
quelle
11
blkid kann filtern, was Sie selbst brauchen - keine Notwendigkeit für sed / grep / awk Magie:blkid -s TYPE -o value /dev/sda3
Petr Uzel
@PetrUzel - Super! Genau das habe ich gesucht!
Beatgammit
2
Denken Sie daran, mit zu laufen, sudowenn Sie nicht root sind! Dieser hat mich erwischt, weil er blkidkeine Fehlermeldungen druckt und mit Statuscode 0 beendet wird, wenn er nicht auf Blockgeräte zugreifen kann ...
Asfand Qazi,
Es gibt selten ein Bedürfnis, grepzu sed. grep foo | sed 's/pattern/repl/'ist sauberer geschriebensed '/foo/s/pattern/repl/'
William Pursell
9

file -s /path/to/device wird das Dateisystem auf einer Festplatte / Partition / Slice identifizieren.

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.

Tim Kennedy
quelle
Gibt es eine Möglichkeit, den Dateisystemtyp zuverlässig aus einem Skript herauszufiltern?
Beatgammit
hängt davon ab, ob Sie den vollständigen Namen des Dateisystems als ausreichend gefiltert betrachten, wie in | cut -d: -f2 | cut -d( -f1oder so. Es ist nicht so hübsch blkid, das ist sicher. :)
Tim Kennedy
2

Nur das TYPE-Tag des Blockgeräts anzeigen und nur dessen Wert ausgeben:

blkid -s TYPE -o value "$device"

Beispiel:

$ blkid -s TYPE -o value /dev/mapper/vg_svelte-home 
btrfs
Tom Hale
quelle
0

Eine sekundäre Option, die mit vielen Dateisystemen funktioniert und den Vorteil hat, auch mit Dateisystemen zu arbeiten, die beschädigte Strukturen haben, ist testdisk. (Sie können laufen , sudo apt install testdiskes zu installieren.)

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

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Setzen Sie Monica wieder ein
quelle