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