cClaude.rocks ☕ Le blog

[Nouvelles technologies du libre, 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 - 2024 | 🏠 Accueil du domaine | 🏡 Accueil du blog