cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

Monter au niveau du système un disque dur, une clé USB… peu sembler assez difficile sous Linux.

Une commande vient à votre secours : blkid (“Block Identifier”)

Elle permet d’afficher les attributs des partitions (Une partition est vue par Linux comme un périphérique de bloc, d’où le nom).



Présentation de « blkid »

Voici ce que peut retourner la commande blkid

blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="5DE4-665C" TYPE="vfat" PARTUUID="eac47f08-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="729c5bb3-bcb2-4267-9ca0-09ef59e10bf0" TYPE="ext4" PARTUUID="eac47f08-02"

On constate que toutes les informations requises au montage d’une partition sont présentes, à part bien évidement le chemin vers le point de montage.

L’option --output ou -o permet de modifier le format de sortie :

blkid -o export

On a alors quelque chose comme ça :

DEVNAME=/dev/mmcblk0p1
LABEL_FATBOOT=boot
LABEL=boot
UUID=5DE4-665C
TYPE=vfat
PARTUUID=eac47f08-01

DEVNAME=/dev/mmcblk0p2
LABEL=rootfs
UUID=729c5bb3-bcb2-4267-9ca0-09ef59e10bf0
TYPE=ext4
PARTUUID=eac47f08-02


Conversion de la sortie de « blkid » en JSON

( echo '[{' ; blkid -o export ; echo '}]' ) |
  sed -E -e 's|^([A-Z_]+)=(.*)$|"\1": "\2",|g' -e 's|^$|},{|g' |
  tr -d '\n' |
  sed -e 's|,}|}|g' -e 's,\\ , ,g' |
  jq .

Ce qui donnera :

[
  {
    "DEVNAME": "/dev/mmcblk0p1",
    "LABEL_FATBOOT": "boot",
    "LABEL": "boot",
    "UUID": "5DE4-665C",
    "TYPE": "vfat",
    "PARTUUID": "eac47f08-01"
  },
  {
    "DEVNAME": "/dev/mmcblk0p2",
    "LABEL": "rootfs",
    "UUID": "729c5bb3-bcb2-4267-9ca0-09ef59e10bf0",
    "TYPE": "ext4",
    "PARTUUID": "eac47f08-02"
  }
]

Ou encore, en enlevant un peu de bruit (dépend de votre installation), et en mettant les clés en minuscules :

( echo '[{' ; blkid -o export ; echo '}]' ) |
  sed -E -e 's|^([A-Z_]+)=(.*)$|"\1": "\2",|g' -e 's|^$|},{|g' |
  tr -d '\n' |
  sed -e 's|,}|}|g' -e 's,\\ , ,g' |
  jq 'map( with_entries( .key |= ascii_downcase ) | select( .type != "squashfs" ) )'

On formate un peu et on met dans une fonction :

function blkid_json {
  ( echo '[{' ; blkid -o export ; echo '}]' ) |
  sed -E -e 's|^([A-Z_]+)=(.*)$|"\1": "\2",|g' -e 's|^$|},{|g' |
  tr -d '\n' |
  sed -e 's|,}|}|g' -e 's,\\ , ,g' |
  jq 'map(
        with_entries( .key |= ascii_downcase ) |
        select( .type != "squashfs" )
      )' || return $?
}

Cela donnera :

[
  {
    "devname": "/dev/mmcblk0p1",
    "label_fatboot": "boot",
    "label": "boot",
    "uuid": "5DE4-665C",
    "type": "vfat",
    "partuuid": "eac47f08-01"
  },
  {
    "devname": "/dev/mmcblk0p2",
    "label": "rootfs",
    "uuid": "729c5bb3-bcb2-4267-9ca0-09ef59e10bf0",
    "type": "ext4",
    "partuuid": "eac47f08-02"
  }
]


Utilisation de "jc"

En s’appuyant sur le billet 🐚 jc : « JSONifier » les commandes Linux., on peut obtenir la commande équivalente à l’aide de jc :

jc --pretty blkid | jq 'map( select( .type != "squashfs" ) )'

On retrouve alors le code produit avec notre « bricolage » à l’aide de sed, tr et de jq.

Attention les anciennes versions de jc ne reconnaissent pas --pretty, utiliser alors -p à la place.



 Convertir le résultat de « blkid » pour « /etc/fstab »

Pour simplifier le code, on partira de la commande jc, mais l’adaptation à l’aide de la solution à base de sed, tr et jq est triviale.

Ici, on va monter la partition en se basant sur le champ UUID :

function create_fstab_entry_with_uuid {
  local -r key="$1"
  local -r value="$2"
  local -r mount_point="$3"

  jc -p blkid |
    jq -r --arg K "${key}" --arg V "${value}" --arg M "${mount_point}" '

    .[] |
    select( .[$K] == $V ) |
    "UUID=\"" + .uuid +"\"\t" + $M + "\t" + .type + "\terrors=remount-ro\t0\t2"
' || return $?
}

# Exemple d’utilisation
create_fstab_entry_with_uuid 'label' 'Samsung_2To' '/mnt/data'

Le code recherche la partition ayant pour libellé (« label ») : «  Samsung_2To » et va créer une entrée pour le fichier /etc/fstab pour monter la partition dans le dossier /mnt/data (qui doit exister et être vide).

Cela donnera quelque chose comme ça :

UUID="5c39570d-fd27-8646-a746-0b87eef25fb4" /mnt/data   ext4    errors=remount-ro   0   2

Si vous préférer utiliser le champ PARTUUID :

function create_fstab_entry_with_partuuid {
  local -r key="$1"
  local -r value="$2"
  local -r mount_point="$3"

  jc -p blkid |
    jq -r --arg K "${key}" --arg V "${value}" --arg M "${mount_point}" '

    .[] |
    select( .[$K] == $V ) |
    "PARTUUID=\"" + .partuuid +"\"\t" + $M + "\t" + .type + "\terrors=remount-ro\t0\t2"
' || return $?
}

On peut faire de même avec LABEL et .label (cependant, c’est un peu moins fiable — le libellé du disque ne devant en aucun cas être modifié).



Liens

ᦿ


ℹ 2006 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog