Création d’un volume de stockage avec RAID et LUKS 

Page mise à jour le 30 avril 2024

Mise à jour : 19 décembre 2017

Cet article fait partie d’une série d’article sur l’installation d’un serveur Linux sous Debian

La majorité de ces commandes sont a exécuter avec les droits root.

Objectifs

Exemple de création d’un volume de stockage (non utilisé pour l’OS) en utilisant 4 disques durs de 2 TB en RAID, chiffré avec LUKS :

  • RAID5 : création d’une grappe RAID5 avec 4 disques de 2 TB, soit (4-1) x 2 = 6 TB utilisables, et supportant la défaillance matérielle d’un (unique) disque dur ;
  • LUKS : chiffrement du volume pour la sécurité.

Création de la grappe RAID5

  Partitionnement des disques durs

Chacun des disques formant la grappe RAID doit être partitionné avec le type fd Linux raid auto.

    Repérer les disques durs : /dev/sd?

$ fdisk -l

Par exemple, sur mon système :

Disk /dev/sda
[utilisé pour l'OS]

Disk /dev/sdb
[utilisé pour l'OS]

Disk /dev/sdc: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xafb48d01

Disk /dev/sdd: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x01754646

Disk /dev/sde: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xe3b9dc2c

Disk /dev/sdf: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0x3b197bca

Disk /dev/md0
[utilisé pour l'OS : /boot]

Disk /dev/md1
[utilisé pour l'OS : LUKS pour la swap]

Disk /dev/md2
[utilisé pour l'OS : LUKS pour le VG des LV (/, /var, ...)]

Disk /dev/mapper/md1_crypt
[LUKS déchiffré pour la swap]

Disk /dev/mapper/md2_crypt
[LUKS déchiffré pour le VG "VGonCRYPTonMD2" des LV (/, /var, ...)]

Disk /dev/mapper/VGonCRYPTonMD2-LVslash: 31.7 GiB
Disk /dev/mapper/VGonCRYPTonMD2-LVtmp: 28 GiB
Disk /dev/mapper/VGonCRYPTonMD2-LVvar: 14 GiB
Disk /dev/mapper/VGonCRYPTonMD2-LVvarlog: 14 GiB
Disk /dev/mapper/VGonCRYPTonMD2-LVhome: 363 GiB

Je souhaite donc utiliser /dev/sd[c-d-e-f] pour ma grappe RAID.

    Création de la partition RAID sur chacun des disques

A répéter pour /dev/sd[d-e-f]

$ fdisk /dev/sdc
Welcome to fdisk [...]


Command (m for help): n
Partition type
 p primary (0 primary, 0 extended, 4 free)
 e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-3907029167, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-3907029167, default 3907029167):

Created a new partition 1 of type 'Linux' and of size 1.8 TiB.

Command (m for help): t
Selected partition 1
Partition type (type L to list all types): fd
Changed type of partition 'Linux' to 'Linux raid autodetect'.

Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

On obtient alors, avec disk -l :

Disk /dev/sdc: 1.8 TiB, 2000398934016 bytes, 3907029168 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disklabel type: dos
Disk identifier: 0xafb48d01

Device Boot Start End Sectors Size Id Type
/dev/sdc1 2048 3907029167 3907027120 1.8T fd Linux raid autodetect


Idem avec /dev/sd[d-e-f]

  Création de la grappe avec mdadm

$ mdadm --create /dev/md3 --level=5 --assume-clean --raid-devices=4 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md3 started.
  • mdadm : l’utilitaire d’administration du RAID logiciel de Linux
  • — create : on créée une nouvelle grappe
    • /dev/md3 : nom de ma grappe (car md0, 1 et 2 existent déjà)
  • –level=5 : RAID 5
  • –asume-clean : les disques sont « vides » : pas besoin de re-synchroniser les disques d’une ancienne grappe
  • –raid-devices=4 : 4 disques durs utilisés
    • /dev/sdc1, … : partitions à utiliser (celles que l’on vient de créer)

  Vérification avec mdstat et mdadm

$ cat /proc/mdstat
Personalities : [raid1] [linear] [multipath] [raid0] [raid6] [raid5] [raid4] [raid10]

md3 : active raid5 sdf1[3] sde1[2] sdd1[1] sdc1[0]
 5860147200 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]
 bitmap: 0/15 pages [0KB], 65536KB chunk

md2 : active raid1 sdb3[1] sda3[0]
 472433664 blocks super 1.2 [2/2] [UU]
 bitmap: 1/4 pages [4KB], 65536KB chunk

md0 : active raid1 sdb1[1] sda1[0]
 194368 blocks super 1.2 [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
 15617024 blocks super 1.2 [2/2] [UU]

unused devices: <none>
$ mdadm --detail /dev/md3
/dev/md3:
 Version : 1.2
 Creation Time : Mon Dec 18 23:48:56 2017
 Raid Level : raid5
 Array Size : 5860147200 (5588.67 GiB 6000.79 GB)
 Used Dev Size : 1953382400 (1862.89 GiB 2000.26 GB)
 Raid Devices : 4
 Total Devices : 4
 Persistence : Superblock is persistent

Intent Bitmap : Internal

Update Time : Mon Dec 18 23:48:56 2017
 State : clean
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
 Spare Devices : 0

Layout : left-symmetric
 Chunk Size : 512K

Name : hercule.val-r.fr:3 (local to host hercule.val-r.fr)
 UUID : 5dd4e1b1:81b3ba01:2bc69363:659f59ba
 Events : 1

Number Major Minor RaidDevice State
 0 8 33 0 active sync /dev/sdc1
 1 8 49 1 active sync /dev/sdd1
 2 8 65 2 active sync /dev/sde1
 3 8 81 3 active sync /dev/sdf1

Tout semble OK 😉

   Ajout de cette grappe à /etc/mdadm/mdadm.conf

$ cat /etc/mdadm/mdadm.conf
# by default (built-in), scan all partitions (/proc/partitions) and all
# containers for MD superblocks. alternatively, specify devices to scan, using
# wildcards if desired.
#DEVICE partitions containers

# automatically tag new arrays as belonging to the local system
HOMEHOST <system>

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays
ARRAY /dev/md/0 metadata=1.2 UUID=9031e9bf:00dd190c:029b5a03:0001e2d5 name=hercule:0
ARRAY /dev/md/1 metadata=1.2 UUID=e6a16006:c4224d67:ff7707fe:01596a9f name=hercule:1
ARRAY /dev/md/2 metadata=1.2 UUID=81fa68f5:78b0f5ce:dc695408:700aba2d name=hercule:2

On ajoute donc une ligne pour le md que l’on vient de créer :

  • ARRAY /dev/md/3
    (car il s’agit de /dev/md3)
  • metadata=1.2
    (Obtenu avec $ mdadm –detail /dev/md3 | grep Version)
  • UUID=5dd4e1b1:81b3ba01:2bc69363:659f59ba
    (Obtenu avec $ mdadm –detail /dev/md3 | grep UUID)
  • Ne pas spécifier de nom
$ echo &quot;ARRAY /dev/md/3 metadata=1.2 UUID=5dd4e1b1:81b3ba01:2bc69363:659f59ba&quot; &gt;&gt; /etc/mdadm/mdadm.conf

   Mise à jour d’initrd

Pour que la modification de /etc/mdadm/mdadm.conf soit prise en compte à chaque démarrage du système, il faut mettre à jour l’initrd :

$ update-initramfs -tu

   Tests

Redémarrer le système, et vérifier que /dev/mdX existe bien.
De même, vérifier avec les commandes ci-dessous que tout est OK :

$ cat /proc/mdstat
$ mdadm --detail /dev/md3

Création du volume chiffré avec LUKS

Un article détaillé sur mon site : créer et utiliser une partition chiffrée avec luks sous linux

  Création du volume chiffré

 
$ cryptsetup --verbose luksFormat --verify-passphrase --align-payload=3072 /dev/md3
WARNING!
========
This will overwrite data on /dev/md3 irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase:
Verify passphrase:
Command successful.

  Monter manuellement le volume chiffré

 $ cryptsetup luksOpen /dev/md3 md3_crypt
Enter passphrase for /dev/md3:
No key available with this passphrase.
Enter passphrase for /dev/md3:

Vérifier que le mapper /dev/mapper/md3_crypt existe bien

 $ ls /dev/mapper/md3_crypt

  Formater le volume chiffré

 $ mke2fs -t ext4 -L data6TB /dev/mapper/md3_crypt
# mke2fs -t ext4 -L data6TB /dev/mapper/md3_crypt
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 1465036416 4k blocks and 183132160 inodes
Filesystem UUID: a5055af2-6640-403c-b56f-e02e138903a3
Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,4096000, 7962624, 11239424, 20480000, 23887872, 71663616, 78675968,
102400000, 214990848, 512000000, 550731776, 44972544

Allocating group tables: done
Writing inode tables: done
Creating journal (262144 blocks): done
Writing superblocks and filesystem accounting information: done

  Monter le volume chiffré

 
$ mkdir /mnt/int_RAID_LUKS_6TB
$ mount /dev/mapper/md3_crypt /mnt/int_RAID_LUKS_6TB/