Trouver le système de fichiers d'une partition non montée à partir d'un script

16

J'écris une installation automatisée personnalisée en utilisant AIF (Arch Installation Framework), et j'ai besoin de trouver le système de fichiers sur une partition donnée une partition.

Jusqu'à présent, j'ai ceci:

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

Cela a bien fonctionné sur ma machine avec un seul disque dur, mais cela a échoué (évidemment) lors de l'exécution dans ma machine virtuelle fonctionnant sur un LiveCD (le LiveCD était récupéré comme un autre lecteur, / dev / sr0).

J'ai pensé à quelques astuces que je pourrais essayer:

  • mount $partition; grep $partition /etc/mtab | awk ...
  • utiliser parted -mls, mais retirez la partition qui m'importe avec un script intelligent, puis analysez comme je le fais déjà dans le scriptt

Existe-t-il une manière meilleure et plus simple de procéder? J'ai déjà les partitions qui m'intéressent et j'ai seulement besoin de trouver leurs systèmes de fichiers (ainsi que de trouver les swaps disponibles).

beatgammit
la source
3
@Mikel Non, cette question concerne un système de fichiers monté. Bien que vous puissiez monter le système de fichiers puis voir quel type il est monté, c'est lent, pas robuste, ne fonctionne pas pour l'échange, ne fonctionne que pour les systèmes de fichiers pris en charge par le noyau en cours d'exécution ...
Gilles 'SO- arrêtez d'être mauvais'

Réponses:

16

Je pense avoir trouvé la réponse: blkid

Depuis la page de manuel:

Le programme blkid est l'interface de ligne de commande pour travailler avec la bibliothèque libblkid (3). Il peut déterminer le type de contenu (par exemple, système de fichiers ou échange) qu'un périphérique de bloc contient, ainsi que les attributs (jetons, NOM = paires de valeurs) à partir des métadonnées de contenu (par exemple, champs LABEL ou UUID).

Apparemment, il imprime le nom du périphérique avec le type de système de fichiers (ainsi que d'autres informations utiles). Pour obtenir une liste de tous les appareils avec leurs types:

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

Pour trouver tous les /dev/sd*/appareils, ajoutez simplement un grep:

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

Alors juste cutou awkpour obtenir ce dont vous avez besoin.

beatgammit
la source
11
blkid peut filtrer ce dont vous avez besoin seul - pas besoin de magie sed / grep / awk:blkid -s TYPE -o value /dev/sda3
Petr Uzel
@PetrUzel - Génial! C'est exactement ce que je cherchais!
beatgammit
2
N'oubliez pas de courir avec sudosi vous n'êtes pas root! Celui-ci m'a rattrapé car blkidn'imprime aucun message d'erreur et se termine avec le code d'état 0 s'il ne peut pas accéder aux périphériques
bloqués
Il y a rarement besoin de se diriger grepvers sed. grep foo | sed 's/pattern/repl/'est plus clairement écritsed '/foo/s/pattern/repl/'
William Pursell
9

file -s /path/to/device identifiera le système de fichiers sur un disque / partition / tranche.

À 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)

du moins, sous Linux, c'est le cas.

Tim Kennedy
la source
Existe-t-il un moyen de filtrer de manière fiable le type de système de fichiers à partir d'un script?
beatgammit
dépend si vous considérez le nom complet du système de fichiers suffisamment filtré, comme dans | cut -d: -f2 | cut -d( -f1ou quelque chose. Ce n'est pas aussi joli que blkid, c'est sûr. :)
Tim Kennedy
2

Afficher uniquement la balise TYPE du périphérique de bloc et afficher uniquement sa valeur:

blkid -s TYPE -o value "$device"

Exemple:

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

Une option secondaire qui fonctionne avec de nombreux systèmes de fichiers et a l'avantage de fonctionner même avec des systèmes de fichiers dont les structures sont endommagées est testdisk. (Vous pouvez exécuter sudo apt install testdiskpour l'installer.)

Créez un script pour renvoyer uniquement le type de système de fichiers comme ceci:

$ testdisk /list "$path_to_partition" | grep " P " | awk '{print $2}'
Réintégrer Monica
la source