cClaude.rocks ☕ Le blog

[Nouvelles technologies, sciences et coups de gueule…]

Menu

Nous avons déjà traité la problématique du montage d’un disque dur sous Linux.

Ici, nous allons nous concentrer sur cette opération dans la cadre d’une machine sans interface graphique, typiquement le cas d’un serveur auquel on ajoute un disque déjà près et que l’on souhaite monter durant la séquence de démarrage.



En pleine migration du serveur Nextcloud, alors que je prépare l’automatisation de l’installation de la nouvelle plateforme, j’en profite pour expliquer comment monter un disque (ici externe, mais cela n’est pas important) déjà formaté (en ext4)

Pour voir comment préparer ce disque (et éventuellement avec une interface graphique, c’est vraiment plus simple), je vous invite à revenir sur l’article : 🖴 Gestion des disques sous Linux : partition et formatage



Identifier le disque

Il faut prendre en compte les éléments suivant :

  • Lorsqu’il n’y a pas d’interface graphique, le disque ne monte pas tout seul.
  • Sur un serveur, on souhaite monter le disque dans un dossier déjà identifié.

Une fois le disque branché (déjà formaté), le plus compliqué finalement est de trouver où il se trouve, mais finalement, la commande suivante rend cela très clair :

lsblk -f

Vous obtiendrez quelque chose comme :

NAME       FSTYPE FSVER LABEL      UUID                                 FSAVAIL FSUSE% MOUNTPOINT
sda
└─sda1     ext4   1.0   Disque_2To
                                   57c3950d-4866-fd27-a746-0b8efb7ef254
mmcblk0
├─mmcblk0p1
│          vfat   FAT32 bootfs     3CA7-E39C                             224.4M    12% /boot
└─mmcblk0p2
           ext4   1.0   rootfs     a413afc6-d516-a9f6-4cbd-fef8255dc961     23G    15% /

Et là, on a très rapidement toutes les informations requises :

  • Le libellé (« LABEL ») du disque, qui permet de l’identifier, ici : Disque_2To,
  • Le système de fichier utilisé (« FSTYPE », pour « File System Type »), ici : ext4
  • et l’« UUID », ici : 57c3950d-4866-fd27-a746-0b8efb7ef254.
  • Usage alternatif de lsblk

    Vous pouvez également utiliser bsblk comme suit :

    lsblk -o MOUNTPOINT,LABEL,NAME,FSTYPE,UUID
    

    Et vous obtiendrez :

    MOUNTPOINT LABEL       NAME        FSTYPE UUID
                           sda
               Disque_2To  └─sda1      ext4   57c3950d-4866-fd27-a746-0b8efb7ef254
                           mmcblk0
    /boot      bootfs      ├─mmcblk0p1 vfat   3CA7-E39C
    /          rootfs      └─mmcblk0p2 ext4   a413afc6-d516-a9f6-4cbd-fef8255dc961
    

    Mieux avec le paramètre --json :

    lsblk -o MOUNTPOINT,LABEL,NAME,FSTYPE,UUID --json
    
    {
       "blockdevices": [
          {"mountpoint":null, "label":null, "name":"sda", "fstype":null, "uuid":null,
             "children": [
                {"mountpoint":null, "label":"Disque_2To", "name":"sda1", "fstype":"ext4", "uuid":"57c3950d-4866-fd27-a746-0b8efb7ef254"}
             ]
          },
          {"mountpoint":null, "label":null, "name":"mmcblk0", "fstype":null, "uuid":null,
             "children": [
                {"mountpoint":"/boot", "label":"bootfs", "name":"mmcblk0p1", "fstype":"vfat", "uuid":"3CA7-E39C"},
                {"mountpoint":"/", "label":"rootfs", "name":"mmcblk0p2", "fstype":"ext4", "uuid":"a413afc6-d516-a9f6-4cbd-fef8255dc961"}
             ]
          }
       ]
    }
    

    Du coup, c’est magique :

    lsblk -o MOUNTPOINT,LABEL,NAME,FSTYPE,UUID --json |  jq '.blockdevices // [] | .[] | .children // [] | .[] | select( .mountpoint == null )'
    

    on a :

    {
      "mountpoint": null,
      "label": "Disque_2To",
      "name": "sda1",
      "fstype": "ext4",
      "uuid": "57c3950d-4866-fd27-a746-0b8efb7ef254"
    }
    

    Autre solution s’appuyer sur le champ label :

    lsblk -o MOUNTPOINT,LABEL,NAME,FSTYPE,UUID --json | jq '.blockdevices // [] | .[] | .children // [] | .[] | select( .label == "Disque_2To" )'
    

    Dans le cadre d’une automatisation, j’utiliserais probablement les deux critères :

    lsblk -o MOUNTPOINT,LABEL,NAME,FSTYPE,UUID --json | jq --arg LABEL "Disque_2To" '.blockdevices // [] | .[] | .children // [] | .[] | select( .mountpoint == null ) | select( .label == $LABEL )'
    

Si vous avez un doute sur le libellé, vous pouvez utiliser la commande mount qui sans paramètre affiche les partitions montées.

Pour obtenir les partitions montées et leur libellé on utilisa :

mount -l

L’affichage peut encore être assez long, on peut utiliser grep pour limiter l’affichage :

Pour n’avoir que la liste de partition monté avec un libellé (ligne finissant par ]):

mount -l | grep ']$'

Mais votre disque peut ne pas en avoir de libellé (déconseillé), dans ce cas, on peut tenter de filtrer sur le début de la ligne, normalement les points de montage standards se trouvent dans /dev/ :

mount -l | grep '^/dev/'

et vous aurez quelque chose comme (ici le cas d’un PI) :

/dev/mmcblk0p2 on / type ext4 (rw,noatime) [rootfs]
/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro) [bootfs]

On résume ce que l’on sait et qui est utile concernant le disque à monter :

UUID FSTYPE
57c3950d-4866-fd27-a746-0b8efb7ef254 ext4


Choisir et créer le point de montage

Dans notre cas, nous allons monter ce disque dans le dossier /mnt/data, il faut donc créer ce dossier.

sudo mkdir `/mnt/data`

Notez qu’il est préférable de créer ce point de montage dans une zone où seul l’administrateur peut écrire, il faudra utiliser sudo :



Configuration

Sur cette base, on peut écrire la ligne qui devra être ajoutée dans la table des partitions :

UUID="57c3950d-4866-fd27-a746-0b8efb7ef254"   /mnt/data  ext4    errors=remount-ro 0       2
sudo cp /etc/fstab /etc/fstab.old
sudo nano /etc/fstab # Ajouter la ligne et sauvegarder

Une fois le fichier sauvegardé, vous pouvez tester votre configuration avec :

sudo mount -a

Puis vérifier le contenu du point de montage :

ls -lF /mnt/disk1/

Vous devez à minima trouver un dossier lost+found pour les partitions formatées pour Linux :

drwx------ 2 root root 16384 Jun 14 13:38 lost+found/


Bases pour une automatisation

  • L'idée de base
    function create_fstab_entry_from_uuid {
      local -r disk_label="$1"
      local -r mount_point="$2"
    
      local infos_json=
      infos_json="$(
        lsblk -o MOUNTPOINT,LABEL,NAME,FSTYPE,UUID --json |
          jq -c --arg LABEL "${disk_label}" \
            '.blockdevices // [] | .[] | .children // [] | .[] | select( .mountpoint == null ) | select( .label == $LABEL )'
        )" || return $?
      if [ -z "${infos_json}" ] ; then
        echo >&2 "*** ERROR: Pas de label: '${disk_label}'"
        return 1
      fi
    
      local uuid=
      uuid="$( jq -r '.uuid // empty' <<<"${infos_json}" )" || return $?
      if [ -z "${uuid}" ] ; then
        echo >&2 "*** ERROR: uuid est vide: '${infos_json}'"
        return 1
      fi
    
      local fstype=
      fstype="$( jq -r '.fstype // empty' <<<"${infos_json}" )" || return $?
      if [ -z "${fstype}" ] ; then
        echo >&2 "*** ERROR: fstype est vide: '${infos_json}'"
        return 1
      fi
    
      printf 'UUID="%s"\t%s\t%s\terrors=remount-ro\t0\t2\n' "${uuid}" "${mount_point}" "${fstype}"
    }
    

    Qu’on utilisera :

    create_fstab_entry_from_uuid 'Samsung_2To' '/mnt/data'
    

Vous trouverez une version plus aboutie dans le dépôt bash-apis/fstab-api.



Liens

ᦿ


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