+++

title = "Mes deux centimes : changer de disque dur avec pvmove"
date = 2010-03-03
aliases = [ "post/2010/02/22/Mes-deux-centimes-:-changer-de-disque-dur-avec-pvmove"]
[taxonomies]
tags = [ "système", "linux", "lvm" ]
+++

« C'est la grande foire des disques durs sur le stand boucherie ! »

<!-- more -->

En tant que petit macaque bien averti, tu as installé ta nouvelle babasse avec deux disques drus (un pour les données et un pour le système) et tu as mis un magnifique système LVM pour gérer le tout parce que tu es un singe du bien et que tu sais que LVM, c'est la méga-classe internationale, que ça fait grandir ton pénis et que ça sauve les bébés phoques.

Seulement voilà, tout ne va pas si bien que ça au pays des Bisounours et tu as déjà rempli de pr0n ton volume logique de données, tu ne peux plus stocker les photos de tes beuveries entre potes, et ça c'est moyennement lol. Tu as donc décidé de « enlarge you disk » en le remplaçant par un plus gros. Seulement voilà : la copie disque à disque des données par le système va prendre beaucoup de temps et empêcher l'accès aux données ; comment faire quelque chose de plus intelligent sans te priver de l'utilisation de ta babasse pendant des heures ?

# pvmove ou comment tout bouger sans rien toucher…

Et bien on va tout simplement utiliser une des nombreuses fonctionnalités qui chient la classe dans LVM : la migration de volume logique d'un volume physique à un autre via la commande `pvmove`.

Bon évidemment, je te conseille de t'entraîner sur des partitions pas importantes (les données de ta mère, l'ordinateur de ta petite sœur, etc…) avant d'attaquer le vrai transfert. Et fais aussi une petit sauvegarde on ne sait jamais (perdre l'intégrale de Marc Dorcel, ça me ferait mal…). J'ai donc un disque dur de 2Gio (c'était brocante dans ma cage ce week-end…), plein, dans un Volume Group `vgdata` avec un seul volume logique `home` dedans : 
```
# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdb1  vgdata lvm2 a-   2.00G    0
# vgs
  VG     #PV #LV #SN Attr   VSize VFree
  vgdata   1   1   0 wz--n- 2.00G    0
# lvs
  LV   VG     Attr   LSize Origin Snap%  Move Log Copy%  Convert
  home vgdata -wi-ao 2.00G
# df -h | grep home
/dev/mapper/vgdata-home
                      2.0G  1.9G   34M  99% /home
```

Je m'arrange donc pour brancher mon deuxième disque de 4Gio (on trouve des trésors dans ces brocantes, c'est pas croyable !) `/dev/sdc1` et créer un nouveau volume physique dessus. N'oublie pas de demander de l'aide à tes parents avant d'éventrer ton PC :
```
# pvcreate /dev/sdc1
  Physical volume "/dev/sdc1" successfully created
# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdb1  vgdata lvm2 a-   2.00G    0
  /dev/sdc1         lvm2 --   4.00G 4.00G

```

J'ai maintenant un nouveau volume physique qui n'appartient à aucun groupe de volume. Je vais donc tranquillement l'ajouter dans le volume group existant :
```
# vgextend vgdata /dev/sdc1
  Volume group "vgdata" successfully extended
# vgs
  VG     #PV #LV #SN Attr   VSize VFree
  vgdata   2   1   0 wz--n- 5.99G 4.00
```

Tes yeux de lynx auront remarqué que mon volume group fait maintenant une taille totale de 4+2Gio donc 4Gio libre (sans volume logique). Maintenant, on va transférer les données à proprement parler en indiquant que l'on souhaite que le volume logique `home` soit maintenant géré sur le volume physique `/dev/sdc1` (ce qui est possible parce que les volumes physiques sont dans le même groupe de volumes) :
```
# pvmove --name home /dev/sdb1 /dev/sdc1
  /dev/sdb1: Moved: 14.3%
  /dev/sdb1: Moved: 29.2%
  /dev/sdb1: Moved: 40.9%
  /dev/sdb1: Moved: 58.1%
  /dev/sdb1: Moved: 75.9%
  /dev/sdb1: Moved: 92.6%
  /dev/sdb1: Moved: 100.0%
# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdb1  vgdata lvm2 a-   2.00G 2.00G
  /dev/sdc1  vgdata lvm2 a-   4.00G 2.00G
```

on volume physique d'origine ne contient plus de données (100% de l'espace est dispo) et mon nouveau volume physique est rempli à moitié. Les données ont donc bien été transférées et ma machine est restée utilisable pendant toute la durée du transfert \o/. Je peux maintenant virer le deuxième disque du volume group :
```
# vgreduce vgdata /dev/sdb1
  Removed "/dev/sdb1" from volume group "vgdata"
# pvremove /dev/sdb1
  Labels on physical volume "/dev/sdb1" successfully wiped
# pvs
  PV         VG     Fmt  Attr PSize PFree
  /dev/sdc1  vgdata lvm2 a-   4.00G 2.00G
```

Il ne reste plus qu'à retirer le disque de la bécane.

Bon évidemment toute cette opération présupposait que tes disques durs étaient manipulables à chaud (USB, SATA, SCSI, SAS) ou que tu redémarres à chaque ajout/retrait (ce que personnellement je recommanderais). On l'a fait sur des données, on peut également le faire sur des partitions systèmes à une petite exception près : `/boot` ne peut pas être sur une partition LVM pour le moment, il faudra donc prendre des précautions particulières pour cette partoche.

Ouf ! Maintenant que j'ai sauvé la planète, je vais pouvoir prendre des vacances bien méritées…
