title: Environnement Linux: Gestion des utilisateurs, RAID LVM et MDADM
description: Rappels sur la gestion des utilisateurs, découverte de LVM, du RAID LVM et du RAID MDadm
published: true
date: 2025-10-01T19:05:01.043Z
tags: linux, basics, shell, raid
editor: markdown
dateCreated: 2025-10-01T18:29:19.272Z
EPSI B3: Environnement Linux
Gestion des utilisateurs et gestion des comptes
Ajout, suppression et modification d'utilisateurs
/etc/skel
Lorsqu'on ajoute un nouvel utilisateur, son répertoire HOME est créé à partir du contenu du répertoire /etc/skel (pour "skeleton").
useradd, adduser
On ne les présente plus, useradd et adduser nous permettent de créer nos utilisateurs:
useradd -ms /bin/bash utilisateur
adduser --home /home/user --shell /bin/bash user
adduser est plus interactif et "convivial" qu'useradd, et propose plus de possibilités de préconfiguration de notre utilisateur (par exemple pour préajouter notre utilisateur aux groupes de gestion du système, etc), et se configure dans le fichier /etc/adduser.conf.
userdel, deluser, newusers
De la même façon, on peut supprimer un utilisateur avec les commandes userdel et deluser:
userdel user
# pour supprimer le HOME dans la foulée:
userdel -r user
# deluser:
deluser user
# pour supprimer le HOME:
deluser --remove-home user
La commande newusers, elle, lit un fichier (ou son entrée standard) dont elle va utiliser les informations pour mettre à jour et/ou créer un ensemble d'utilisateurs. La syntaxe de ce fichier est identique à celle du fichier /etc/passwd (sauf que le mot de passe dans le fichier n'est pas chiffré et qu'il sera chiffré lors de la création des utilisateurs), cf plus bas pour ce qui concerne les fichier /etc/passwd et /etc/shadow
usermod, passwd, chpasswd
On peut aussi vouloir modifier un utilisateur, par exemple, changer son HOME, l'ajouter à un groupe, etc
# ajouter user au groupe docker (pratique ;))
usermod -aG docker user
# changer le home de l'user:
usermod -d /home/usernewhome user
De même, pour modifier le mot de passe d'un utilisateur, on peut utiliser la commande passwd:
# modifier son propre mdp
passwd
# modifier le mdp de l'utilisateur "user"
sudo passwd user
chpasswd nous permet de mettre à jour les mots de passe par lots. Il va lire depuis son entrée standard une liste de paire utilisateur:motdepasse et utiliser ces informations pour mettre à jour les utilisateurs correspondants (et chiffrer les mots de passe au passage, en utilisant PAM).
chpasswd < fichier
/etc/passwd et /etc/shadow
le fichier /etc/passwd contient différentes informations sur les comptes utilisateurs, séparées par des ":":
- le login de l'utilisateur
- optionnellement un mot de passe chiffré, ou "x" si le mot de passe se trouve dans /etc/shadow (le cas le plus générique).
- l'UID de l'utilisateur
- le GID du groupe principal de l'utilisateur
- le nom complet de l'utilisateur (si configuré lors de la création)
- le répertoire personnel de l'utilisateur
- le shell par défaut de l'utilisateur
ce qui nous donne quelque chose de ce style:
user:x:1000:1000:Michel User,,,:/home/user:/bin/zsh
Le fichier /etc/shadow contient, lui, les informations relatives aux mots de passes de nos utilisateurs, séparées là aussi par ":":
- login de l'utilisateur
- mot de passe chiffré (ou les caractères ! ou *, ou n'importe quelle chaîne de caractères n'étant pas un résultat de crypt(3), auquel cas l'utilisateur ne peut pas se connecter avec un couple login/mot de passe)
- date du dernier changement de mot de passe (notation Epoch)
- âge minimum du mot de passe à atteindre avant de pouvoir le changer à nouveau (en jour)
- âge maximum du mot de passe (en jour là aussi) avant de devoir le changer
- durée d'avertissement d'expiration de mot de passe
- durée d'inactivité du mot de passe (le temps pendant lequel le mot de passe reste valide après expiration)
- date de fin de validité du compte (Epoch)
- champ réservé pour une utilisation future
ce qui nous donne un truc du genre:
user:$9$AZertYu1Op/qSdFgHjklm:1633954707:30:365:7:14:1733954707:
Gestion des groupes
groupadd, groupdel, groupmod, addgroup, delgroup
De la même façon que nous manipulons nos utilisateurs avec les commandes useradd, adduser, deluser, usermod... etc, nous pouvons aussi créer, supprimer et manipuler des groupes:
groupadd testgroup
# en spécifiant un GID spécifique
groupadd -g 6000 testgroup2
# la même avec addgroup
addgroup --gid 6001 testgroup3
# suppression du groupe
delgroup testgroup
# éviter de delete un groupe avec des utilisateurs
delgroup --only-if-empty testgroup2
# groupdel
groupdel testgroup3
De même, un groupe peut avoir un mot de passe (et ouaip!) pour les utilisateurs non-membres du groupe:
gpasswd groupe
# ajouter ou supprimer un utilisateur d'un groupe
gpasswd -a utilisateur groupe
gpasswd -d utilisateur groupe
# configurer la liste des admins du groupe
gpasswd -A user1,user2.. groupe
# la liste des membres:
gpasswd -M user3,user4... groupe
/etc/group et /etc/gshadow
De la même façon que nos utilisateurs sont référencés dans les fichiers /etc/passwd et /etc/shadow, nos groupes sont référencés dans deux fichiers, /etc/group (qui référence aussi les utilisateurs appartenant à tel ou tel groupe), et /etc/gshadow (qui fonctionne de façon similaire à /etc/shadow).
On peut donc ajouter un utilisateur directement à un groupe en éditant le fichier /etc/group, par exemple.
Sa structure est similaire à celle d'/etc/passwd, en séparant chaque champ par ":":
- le nom du groupe
- le mot de passe du groupe (x si géré par gshadow)
- le GID du groupe
- la liste des utilisateurs appartenant à ce groupe, séparés par des virgules
De la même manière, le fichier /etc/gshadow est organisé comme suit (en utilisant toujours ":" comme séparateur):
- nom du groupe
- mot de passe chiffré, ou !,* pour interdire l'accès au groupe à des utilisateurs non membres, les membres du groupe n'ayant pas besoin de mot de passe pour y accéder. Idem si le champ est vide.
- administrateurs du groupe
- membres du groupe
Gestion des disques et périphériques
ajout de disque
on va ajouter un disque à notre machine virtuelle (pas besoin de plus d'1Go,
c'est pour test )
On va récupérer son nom de périphérique bloc (normalement /dev/sdb) en
regardant les logs du kernel via la commande:
sudo dmesg
partitionner le disque
Plusieurs utilitaires:
- fdisk
- cfdisk (un peu plus /user friendly/)
- gparted en GUI (pas dans notre /scope/)
on va utiliser cfdisk pour créer une partition sur notre nouveau disque:
sudo cfdisk /dev/sdb
formater le disque
Sous GNU/Linux, on peut utiliser une pléthore de systèmes de fichiers
différents:
- ext4, le système de fichiers "par défaut", qui fait le "job"
- btrfs, un système de fichiers plus avancé, avec des fonctionnalités de
snapshots, de déduplication, etc. Ne jamais l'utiliser sur une grappe
RAID-5 !!!! - XFS, un système de fichiers développé à l'époque par Silicon Graphics, très
efficace sur les écritures dans de gros fichiers (bases de données par exemple) - Les trucs de Microsoft: FAT32, NTFS (en lecture seule par défaut,
lecture/écriture via FUSE) - HFS et consorts (MacOS)
- FFS (Amiga), UFS et FFS2 (BSD)
- ZFS
Dans notre cas, on va faire simple: on va formater notre nouvelle partition en ext4
sudo mkfs.ext4 /dev/sdb1
monter les disques de façon temporaire, et persistante via /etc/fstab
Tout d'abord, on peut monter rapidement une partition (pour vérifier son
contenu, etc) dans n'importe quel répertoire (de préférence vide ):
sudo mount /dev/sdb1 /mnt
ls /mnt
sudo umount /mnt
Cependant, ce n'est pas vraiment pratique si on veut que nos partitions soient
automatiquement montées au démarrage de la machine... Pour celà, on utilise le
fichier /etc/fstab:
cat /etc/fstab
UUID=2fc007d9-01a1-4d21-bd63-9ece32cd8040 / btrfs defaults 0 0
UUID=2fc007d9-01a1-4d21-bd63-9ece32cd8040 /var btrfs subvol=/@/var 0 0
UUID=2fc007d9-01a1-4d21-bd63-9ece32cd8040 /usr/local btrfs subvol=/@/usr/local 0 0
UUID=2fc007d9-01a1-4d21-bd63-9ece32cd8040 /srv btrfs subvol=/@/srv 0 0
UUID=2fc007d9-01a1-4d21-bd63-9ece32cd8040 /root btrfs subvol=/@/root 0 0
UUID=2fc007d9-01a1-4d21-bd63-9ece32cd8040 /opt btrfs subvol=/@/opt 0 0
UUID=2fc007d9-01a1-4d21-bd63-9ece32cd8040 /home btrfs subvol=/@/home 0 0
UUID=2fc007d9-01a1-4d21-bd63-9ece32cd8040 /.snapshots btrfs subvol=/@/.snapshots 0 0
UUID=6c6ccd4a-21ab-422f-be50-458222e93276 swap swap defaults 0 0
Ici, UUID est l'identifiant unique de la partition obtenu avec la commande
#blkid*. On peut aussi tout à fait utiliser le nom du fichier bloc
correspondant à notre partition (/dev/sdb1 par exemple) cependant l'avantage
principal de l'UUID est que même si le périphérique change d'emplacement
(devenant, par exemple, /dev/sdc), il sera quand même retrouvé et monté au bon
endroit par le système.
La syntaxe fstab est la suivante:
- nom (ou blkid) de la partition
- point de montage
- système de fichiers
- options (noatime, par exemple (no access time))
- dump: sauvegarde du FS. En général toujours à 0 sauf cas particulier
- pass (fsck). Ne jamais, jamais mettre ce paramètre à 1 sur un montage réseau
(NFS), vous ne voulez pas fsck un montage NFS ou SMB
Dès lors, une ligne fstab valide pour notre partition /dev/sdb1 montée dans
/mnt/volume1 (pensez à mkdir le répertoire en question ) serait:
/dev/sdb1 /mnt/volume1 ext4 defaults,noatime 0 0
La même, avec LVM
LVM signifie Logical Volumes Manager. Il permet de créer des volumes
logiques pouvant être répartis sur plusieurs disques (ou plusieurs grappes
RAID), et facilement manipulés, c'est à dire étendus sur d'autres disques ou
partitions, sauvegardés via des instantanés (/snapshots/), etc.
Typiquement, une grappe LVM est composée de:
- PVs: Physical Volumes, disques ou partitions physiques
- VG: Volumes Groups, des groupes de volumes rassemblant plusieurs disques ou
partitions (PVs) - LV: Logical Volumes, nos volumes logiques qui apparaîtront comme un disque,
et que nous pourrons manipuler comme tels via mkfs, mount, fstab, etc.
Tout d'abord, ajoutons un nouveau disque à notre VM, normalement il devrait
s'agir de /dev/sdc, et déclarons le comme un PV - on va devoir installer lvm2 avant:
sudo apt install lvm2
sudo pvcreate /dev/sdc
On va ensuite l'ajouter à notre groupe de volumes, que nous allons créer dans
la foulée, et que nous allons nommer epsivg:
sudo vgcreate epsivg /dev/sdc
# si on a plusieurs disques/partitions
# à ajouter au VG, on peut:
sudo vgcreate epsivg /dev/sdc /dev/sdd1 /dev/sde
Notre groupe de volumes est créé, on peut afficher ses informations avec la
commande vgdisplay:
sudo vgdisplay
On peut (enfin!) créer notre volume logique avec la commande lvcreate (ici,
si notre périphérique fait 1Go et notre VG ~1Go, on va créer un volume de
512Mo, et nous allons l'appeler lv1
sudo lvcreate -L 512m -n lv1 epsivg
Nous pouvons désormais le formater, puis le monter de la façon suivante:
sudo mkfs.ext4 /dev/mapper/epsivg-lv1
# on part du principe qu'on a créé le répertoire /mnt/lv1:
sudo mount /dev/mapper/epsivg-lv1 /mnt/lv1
De même, on peut le monter directement dans le fstab, comme d'hab maintenant
(faites le! )
ajouter un disque supplémentaire à une grappe LVM
Si on veut ajouter un disque supplémentaire à une grappe LVM et l'utiliser
pour étendre un volume logique LVM, tout d'abord on doit l'initialiser comme
volume physique. Ajoutons un disque à notre VM (/dev/sdd probablement), puis:
sudo pvcreate /dev/sdd
Ajoutons le ensuite à notre VG epsivg:
sudo vgextend epsivg /dev/sdd
Puis enfin utilisons lvextend pour agrandir notre volume logique lv1:
sudo lvextend -L +512m epsivg/lv1
sudo resize2fs /dev/mapper/epsivg-lv1
Et voilà - pratique, non? Imaginons le cas d'une base de données sur un
volume logique situé sur une grappe RAID-1 de 1To. On arrive à la limite de
capacité de notre volume, il suffit d'ajouter une autre grappe RAID-1 à notre
VG puis d'étendre notre volume logique contenant les données de notre base de
données, et hop, on est repartis pour quelques années
RAID logiciel sous gnu/linux
/Note: le RAID n'est pas un backup!!!/
RAID signifie /Redundant Array of Independent Disks/ - on dit aussi parfois /Redundant Array of Inexpensive Disks/ :p
RAID0 (lol)
Alors, si vous avez des données dont vous n'avez rien à faire, que vous pouvez facilement retélécharger par exemple, et que vous avez besoin de performances, RAID-0 est tout indiqué (par exemple: jeux vidéos). Mais c'est à peu près tout . RAID-0 "découpe" les données entre les disques, en lecture comme en écriture, en stripes dont la taille est prédéfinie lors de la création de l'agrégat - en général des stripes de 64Ko. Dès lors, on peut facilement écrire nos données sur 2 (ou plus) disques en même temps. idem pour la lecture. On peut considérer, grossièrement, qu'un agrégat RAID-0 de deux disques identiques permet de quasiment doubler les performances en écriture et en lecture. Remplacez les disques à plateau par des SSD et on peut obtenir des performances plus que sympathiques
Par contre, si un disque de l'agrégat rencontre un problème, tout l'agrégat est perdu, et donc les données qui se trouvaient dessus
RAID1
Ici, nos deux (ou plus) disques sont en miroir, c'est à dire que les deux (ou plus) disques contiennent exactement les mêmes données. On peut dès lors perdre tous les disques sauf un avant de perdre nos données, mais bien sûr les coûts sont plus élevés, vu qu'il faut, au minimum, doubler chaque disque pour chaque agrégat RAID-1.
RAID4 et RAID-DP
Ici, un disque (dans le cas de RAID-4) est dédié aux informations de parité. Deux disques sont réservés aux informations de parité dans le cas de RAID-DP. On rencontre souvent RAID-DP sur les baies Netapp: on a un bon ratio performance/résilience (on peut perdre deux disques par agrégat sans perdre de données dans le cas de RAID-DP, un seul dans le cas de RAID-4)
RAID5
Ici, on n'utilise pas un disque réservé pour les informations de parité, mais ces informations sont réparties sur chaque disque de l'agrégat, de manière séquentielle. Il nécessite, tout comme RAID-4, au minimum 3 disques. On obtient les meilleures performances sur un agrégat de 6/7 disques. Par exemple ici, une grappe RAID-5 sur une carte Perc H700, avec 6 disques SATA moisis:
lidstah@polaris:~$ sudo pveperf
CPU BOGOMIPS: 76612.16
REGEX/SECOND: 1511699
HD SIZE: 97.93 GB (/dev/mapper/pve-root)
BUFFERED READS: 467.61 MB/sec
AVERAGE SEEK TIME: 7.67 ms
FSYNCS/SECOND: 1697.46
DNS EXT: 32.21 ms
DNS INT: 47.76 ms
On voit qu'on obtient des performances plus que décentes niveau reads et fsync.
Par contre, on ne peut perdre qu'un seul disque.
RAID6
RAID6 est une évolution de RAID5 permettant d'utiliser /n/ informations redondantes de parité au lieu d'une seule. La grande majorité des implémentations de RAID6 se limitent à une valeur de /n = 2/ du fait de la complexité des fondements mathématiques à la base de ce système.
Ses avantages principaux sont de pouvoir résister à la perte de /n/ disques (en pratique, souvent deux disques), mais ses défauts principaux sont des temps d'écriture plus longs du fait des calculs plus complexes, et un temps de reconstruction du RAID en cas de perte de 2 disques très, très, trèèèès long
Cependant il est de plus en plus utilisé du fait de l'augmentation des performances du matériel dédié, comme des CPUs, permettant de l'implémenter de façon logicielle (ajouté au kernel Linux 2.6, donc ça remonte).
RAID-Z (ZFS)
Similaire à RAID-5, le RAID-Z, utilisé par ZFS de Sun Microsystems, utilise un système de /copy-on-write/ afin de limiter les effets de /trous d'écriture/ (baisse des performances en écriture de nombreux petits fichiers sur un RAID-5). Néanmoins il est moins performant que RAID-5, sauf si on alloue de la RAM ou des flashpools SSD pour mettre en cache les opérations de lecture/écriture (L2ARC et ZIL).
RAIDs rigolos
RAID01
RAID10
RAID05
RAID15
RAID50
RAID51
RAID Matériel et RAID Logiciel
RAID Matériel
Le RAID Matériel implique l'utilisation de cartes dédiées (en général PCIe), utilisant souvent des firmwares propriétaires. La carte RAID s'occupe de la gestion des agrégats RAID et présente au système d'exploitation un seul /block device/. L'OS ne "voit" alors qu'un seul disque par agrégat RAID, sans nécessairement connaître l'état des disques utilisés - cependant des drivers existent permettant de vérifier l'état - notamment SMART - des disques utilisés par l'agrégat au niveau du système d'exploitation.
Ces cartes RAID disposent souvent de mémoire cache, permettant d'augmenter notablement les performances. De plus, elles disposent en général d'ASICs dédiés à la gestion des différents niveau de RAID, permettant de libérer le CPU lors, par exemple, de la reconstruction d'un RAID dont un disque a été remplacé.
RAID Logiciel avec LVM (ultra simple
)
Tout d'abord, on va ajouter deux disques identiques de 2Go à notre VM. Ils vont nous servir à créer notre grappe RAID avec LVM.
Une fois ajoutés, et identifiés avec la commande lsblk, on va les déclarer comme Volumes Physiques (PV) utilisables par LVM (ici, /dev/sde et /dev/sdf):
sudo pvcreate /dev/sde /dev/sdf
On va ensuite les ajouter à un groupe de volumes logiques que nous allons nommer vraid:
sudo vgcreate vraid /dev/sde /dev/sdf
Enfin, nous allons créer un volume logique RAID-1 que nous allons appeler vol1:
sudo lvcreate --size 1536M --name vol1 --type raid1 vraid
Il ne nous reste plus qu'à le formater, le monter… et voilà… difficile de faire plus simple
RAID Logiciel avec MDADM
Ici, c'est l'OS qui gère directement les agrégats RAID, ce qui permet une meilleure souplesse d'utilisation, mais impacte - légèrement - les performances.
Sous Windows, le Gestionnaire de disques permet de facilement créer des agrégats RAID (0,1,5,6 iirc).
Sous GNU/Linux, on utilisera l'utilitaire /mdadm/. Par exemple pour créer un RAID-1 entre nos disques sdc et sdd (de taille identique):
- Tout d'abord on partitionne nos disques:
# dans les deux cas:
# type de table de partitions GPT
# taille identique de partition
# type de partition: "fd", RAID Linux Autodetect
$ sudo cfdisk /dev/sdc
$ sudo cfdisk /dev/sdd
Puis on crée notre agrégat RAID-1 avec la commande mdadm:
$ sudo mdadm --create /dev/md0 --level=1 --raid-devices=2 /dev/sdc1 /dev/sdd1
# puis on "daemonise" notre volume RAID pour qu'il soit chargé à chaque démarrage:
$ sudo mdadm --daemonise /dev/md0
# en cas de fail:
$ sudo mdadm --monitor --daemonise /dev/md0
On peut maintenant vérifier les détails de notre aggrégat RAID-1:
$ sudo fdisk -l
$ sudo mdadm --detail /dev/md0
Et enfin, le formater et le monter:
$ sudo mkfs.ext4 /dev/md0
$ sudo mount /dev/md0 /mnt
$ df -h
$ sudo umount /mnt
Pour finir, on peut le déclarer dans fstab. Admettons qu'on veuille le monter dans le répertoire raid1 du répertoire home:
$ sudo mkdir /home/raid1
$ sudo vim /etc/fstab
/dev/md0 /home/raid1 ext4 defaults 0 1
:wq
Si un des disques vient à flancher, on va d'abord le retirer de l'aggrégat avant d'ajouter un nouveau disque:
# on le marque "faulty"
$ sudo mdadm --manage /dev/md0 --set-faulty /dev/sdc1
# on le retire de la grappe
$ sudo mdadm --manage /dev/md0 --remove /dev/sdc1
# une fois le disque remplacé par un nouveau disque (partitionné, etc)
# on remet le nouveau disque en prod
# on va partir du principe que la partition est /dev/sdc1:
$ sudo mdadm --manage /dev/md0 --add /dev/sdc1
On peut aussi vouloir stopper complètement une grappe et la supprimer:
$ sudo mdadm --detail /dev/md0
$ sudo mdadm --stop /dev/md0
$ sudo mdadm --zero-superblock /dev/sdc1
$ sudo mdadm --zero-superblock /dev/sdd1
# Puis on modifie la conf' de mdadm si nécessaire
mini-TP
Créez une VM (1c, 1Go RAM), sur laquelle:
- Vous ajouterez deux disques
- Que vous configurerez en RAID-1
- Puis créez un volume logique LVM d'environ 75% (80% max) de la taille du disque, formaté en ext4
- Montez le dans /var/lib/mysql
- installez MariaDB
- surprise: créez un snapshot LVM (checkez la /manpage/ de lvcreate) de votre partition MariaDB, montez le dans /mnt, et copiez les données.
- Bravo, vous avez fait un backup de MariaDB via les snapshots