LVM, c'est le bien. Chaque fois que tu utilises LVM, tu sauves un pays de la famine, ton pénis grandit et tu reconquiers l'être aimé.

Aujourd'hui, je vais te montrer comment on peut faire du RAID, via les volumes miroirs et LVM. Et là, normalement, ta première réaction, c'est de saigner du nez : mais pourquoi faire du RAID avec un machin qu'est pas conçu pour faire du RAID alors qu'on a un truc pour faire du RAID, mdadm en l'occurence ? D'abord, parce qu'on peut (si, si, c'est une bonne raison) et ensuite parce que c'est bien gentil les outils standards de Linux pour faire du RAID mais c'est pas souple pour deux ronds : impossible d'agrandir un disque à chaud (à moins de faire des partoches dans tous les sens, c'est pas super élégant) et le changement de disque est une vraie plaie.

Alors oui, les petits singes un peu malins qui vont me dire qu'on pourrait très bien monter un RAID dans un LVM… Oui mais voilà, c'est super crade, on rajoute une couche pour pas grand chose, c'est toujours pas très souple et, si on voulait aller jusqu'au bout de la logique, il faudrait monter un LVM sur le RAID sur le LVM. Autant, je conçois que la partouze peut être une activité enrichissante, autant je trouve que là, c'est un peu beaucoup de participants les uns sur les autres.

Miroir, mon beau miroir, dis-moi qui est le plus geek

J'ai un disque SATA /dev/sda et un disque /dev/sdb de 20Gio chacun, que l'on a transformé en volume physique, et qui sont dans le même groupe de volumes marmouset_sucks. Pour créer directement un volume miroir, on peut simplement utiliser une commande du type :

# lvcreate --name levrette --size 5G --mirrors 1 --mirrorlog core marmouset_sucks
  Logical volume "levrette" created
# lvs -a -o +devices
  LV                  VG              Attr   LSize   
  levrette            marmouset_sucks mwi-a-   5,00g  
  [levrette_mimage_0] marmouset_sucks Iwi-ao   5,00g   
  [levrette_mimage_1] marmouset_sucks Iwi-ao   5,00g   

Les options --mirrors et --mirrorlog servent respectivement à indiquer le nombre de copie du volume d'origine que l'on souhaite (en l'occurence 1, tu auras donc les données 2 endroits différents) et à préciser la méthode de conservation des données (ce que l'on verra en détails après). La dernière commande te permet de constater que ton volume est bien répliqué sur deux Physical Volumes distincts. Peut-on faire la même chose avec un volume existant ? Ben tiens ! On va s'gêner :

# lvcreate --name missionnaire --size 2G marmouset_sucks
  Logical volume "missionnaire" created
# lvconvert --mirrors 1 --mirrorlog core /dev/marmouset_sucks/missionnaire 
  marmouset_sucks/missionnaire: Converted: 0,4%
  […]
  marmouset_sucks/missionnaire: Converted: 100%

Contrairement à un RAID classique, qu'on peut difficilement créer après-coup, là tu fais à peu près ce que tu peux tant que tu as 2 PVs dans ton VG (non, c'est pas un acronyme pour vagin cochon !).

Et donc c'est quoi le mirrorlog ?

Ahem, ahem… C'est un peu là qu'on commence à voir les limites du truc (et qu'on commence au passage à se rendre compte que c'est pas vraiment fait pour ^^). Si tu changes le statut de tes volumes (activation/désactivation), tu vas constater que les volumes se reconstruisent après (!) :

# vgchange -an marmouset_sucks
  0 logical volume(s) in volume group "marmouset_sucks" now active
# vgchange -ay marmouset_sucks
  2 logical volume(s) in volume group "marmouset_sucks" now active
# lvs
# lvs | grep marmou
  levrette     marmouset_sucks mwi-a-   5,00g      57,34        
  missionnaire marmouset_sucks mwi-a-   2,00g     100,00        

#fail comme disent les jeunes. Alors est-on condamné à tout reconstruire à chaque démarrage de la machine ? Tu te doutes bien que non.

Par défaut, LVM crée un journal des volumes miroirs sur un troisième volume physique. Ce dernier ne prend pas grand chose (1 extent par volume répliqué) et on peut donc très bien le placer sur une toute petite partition sur le disque système ou même dans un volume logique sur un autre volume group ! Donc, en ajoutant un /dev/sdc (qui pourrait donc être à peu près n'importe quoi si tu as tout bien suivi) :

# pvcreate /dev/sdc
  Physical volume "/dev/sdc" successfully created
# lvcreate --size 200M --name helicoptere_thailandais --mirrors 1 marmouset_sucks
  Logical volume "helicoptere_thailandais" created
# lvs -a -o +devices | grep heli
# lvs -a -o +devices | grep heli
  helicoptere_thailandais            marmouset_sucks mwi-a- 200,00m
  [helicoptere_thailandais_mimage_0] marmouset_sucks iwi-ao 200,00m
  [helicoptere_thailandais_mimage_1] marmouset_sucks iwi-ao 200,00m
  [helicoptere_thailandais_mlog]     marmouset_sucks lwi-ao   4,00m

Et le tour est joué \o/