Est-il possible de déplacer un volume logique d'un groupe de volumes à un autre dans son intégralité ?
Il est possible de créer un lv correspondant (plus ou moins) et de copier les données, mais existe-t-il un moyen de le faire uniquement avec les outils LVM ?
Si non, y a-t-il une raison théorique ou une limitation technique (taille des extensions) ?
Réponse acceptée :
À partir de LVM dans Debian Stretch (9.0), à savoir 2.02.168-2, il est
possible de faire une copie d'un volume logique à travers des groupes de volumes en utilisant une
combinaison de vgmerge
, lvconvert
, et vgsplit
. Puisqu'un déplacement est
une combinaison d'une copie et d'une suppression, cela fonctionnera également pour un déplacement.
Alternativement, vous pouvez utiliser pvmove
pour simplement déplacer le volume.
Une session d'exemple autonome complète utilisant des périphériques de boucle et lvconvert
suit.
Résumé :nous créons le groupe de volumes vg1
avec volume logique lv1
, et vg2
avec lv2
, et faire une copie de lv1
en vg2
.
Créez des fichiers.
truncate pv1 --size 100MB
truncate pv2 --size 100MB
Configurez des périphériques de boucle sur les fichiers.
losetup /dev/loop1 pv1
losetup /dev/loop2 pv2
Créez des volumes physiques sur les périphériques en boucle (initialisez les périphériques en boucle pour
une utilisation par LVM).
pvcreate /dev/loop1 /dev/loop2
Créez des groupes de volumes vg1 et vg2 sur /dev/loop1 et /dev/loop2
respectivement.
vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2
Créez les volumes logiques lv1 et lv2 sur vg1 et vg2 respectivement.
lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2
Créez des systèmes de fichiers ext4 sur lv1 et lv2.
mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2
Éventuellement, écrivez quelque chose sur lv1 afin de pouvoir vérifier ultérieurement que la copie a été
correctement créée. Rendre vg1 inactif.
vgchange -a n vg1
Exécutez la commande de fusion en mode test. Cela fusionne vg1 en vg2.
vgmerge -A y -l -t -v <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1
Et puis pour de vrai.
vgmerge -A y -l -v vg2 vg1
Créez ensuite une paire de miroirs RAID 1 à partir de lv1
en utilisant lvconvert
. Le dest-pv
l'argument indique lvconvert
pour faire la copie miroir
sur /dev/loop2
.
lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2
Divisez ensuite le miroir. Le nouveau LV est maintenant lv1_copy
.
lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1
Faire vg2/lv1
inactif.
lvchange -a n /dev/vg2/lv1
Puis (mode test)
vgsplit -t -v <<source-vg>> <<destination-vg>> <<moved-to-pv>>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1
Pour de vrai
vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1
Sortie résultante :
lvs
[...]
lv1 vg1 -wi-a----- 12.00m
lv1_copy vg2 -wi-a----- 12.00m
lv2 vg2 -wi-a----- 12.00m
REMARQUES :
1) La plupart de ces commandes devront être exécutées en tant que root.
2) S'il y a une duplication des noms des volumes logiques dans
les deux groupes de volumes, vgmerge
refusera de continuer.
3) Lors de la fusion, volumes logiques dans vg1
doit être inactif. Et sur les volumes logiques fractionnés dans vg2
appartenant à vg1
doit être inactif. Dans notre cas, il s'agit de lv1
.