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
኿