Existe-t-il un moyen simple de déplacer / copier un volume logique d'un groupe de volumes vers un autre? (LVM2)

15

Je réorganise un tas de disques sur mon serveur à la maison et je me retrouve dans la position de vouloir déplacer un tas de volumes logiques LVM vers un autre groupe de volumes. Existe-t-il un moyen simple de procéder? J'ai vu la mention d'une cplvcommande, mais cela semble être ancien ou pas quelque chose qui ait jamais été disponible pour Linux.

jkp
la source

Réponses:

20

Si vous pouvez arranger le volume logique sur un sous-ensemble distinct de volumes physiques du reste du groupe de volumes source ( lvconvert sourcevg/sourcelv /dev/pv1 ...peut aider), vous pouvez utiliser vgsplitpour diviser le lv en un nouveau vg et vgmergepour fusionner le nouveau vg dans le cible vg.

Bien que LVM ait une fonction de mise en miroir, vous ne pouvez pas (sainement) l'utiliser pour faire une copie entre les groupes de volumes, car les deux jambes du miroir doivent vivre sur le même vg et l'association ne peut pas être rompue .

Vous pouvez copier un volume LVM sur un autre comme vous le feriez pour n'importe quel volume sur un autre: créez un lv cible de la taille appropriée, puis copiez le contenu avec dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M. Si le volume source est actif, vous pouvez utiliser LVM pour effectuer une copie cohérente: prenez d'abord un instantané du lv source avec lvcreate -s, puis copiez l'instantané.

Gilles 'SO- arrête d'être méchant'
la source
1
Brilliant Gilles .... vgsplit / vgmerge sera probablement très bien: je peux utiliser pvmove après cela pour déplacer les extensions physiques vers le nouveau disque, puis supprimer l'ancien volume du VG.
jkp
Dommage, cela n'a pas fonctionné pour moi à la fin en raison des tailles d'étendue différentes. Si ce n'est pas un problème pour vous, je suggère que cette méthode soit plus simple.
jkp
Après dd(si vous n'êtes pas pressé de supprimer les anciens volumes), n'oubliez pas de changer l'UUID des nouveaux systèmes de fichiers: tune2fs -U random / dev / targetvg / targetlv
midenok
2
pvmove -n lvol1 /dev/sdb1 /dev/sdc1

pvmove peut déplacer des données entre des volumes physiques: Guide de l'administrateur LVM

Milan
la source
10
Mais pas entre les groupes de volumes.
MattBianco
Je répète: cela ne fonctionne pas pour deux groupes de volumes séparés
kissgyorgy
D'abord vgextendvg1 avec un nouveau pv, puis pvmovevotre lv vers le nouveau pv, vgsplitun vg temporaire que vous vgmergedans vg2. Puis à pvmovenouveau le lv à vg2 pv d'origine, vgreducevg2 pour obtenir la lecture du pv intermédiaire. Ou pour éviter la copie intermédiaire, vous pouvez tout d'abord fusionner vg1 en vg2, pvmovelv1 et à vgsplitnouveau vg1 de vg2. Cela devrait répondre aux objections de @ MattBianco et @kissgyorgy et équivaut à la solution de @Gilles mais en remplaçant l'instantané et le bas niveau ddpar unpvmove
marcz
1

À la LVM dans Debian tronçon (9.0), à savoir 2.02.168-2, il est possible de faire une copie d'un volume logique pour les groupes de volumes 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 pvmovepour simplement déplacer le volume.

Un exemple de session complète et autonome utilisant des périphériques en boucle et lvconvertsuit.

Résumé: nous créons un groupe de volumes vg1avec un volume logique lv1, et vg2avec lv2, et faisons une copie de lv1in vg2.

Créez des fichiers.

truncate pv1 --size 100MB
truncate pv2 --size 100MB

Configurez des périphériques de boucle sur des fichiers.

losetup /dev/loop1 pv1
losetup /dev/loop2 pv2

Créez des volumes physiques sur les périphériques de boucle (initialisez les périphériques de boucle pour une utilisation par LVM).

pvcreate /dev/loop1 /dev/loop2

Créez des groupes de volumes vg1et vg2sur /dev/loop1et /dev/loop2 respectivement.

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

Créez des volumes logiques lv1et lv2sur vg1et vg2respectivement.

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

Créez des systèmes de fichiers ext4 sur lv1et lv2.

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

Vous pouvez éventuellement écrire quelque chose lv1pour pouvoir vérifier ultérieurement que la copie a été correctement créée. Rendez vg1inactif.

vgchange -a n vg1

Exécutez la commande de fusion en mode test. Fusionne lv1dans lv2.

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 à l' lv1aide de lvconvert. L'argument <> dit lvconvertde faire la copie miroir lv1_copysur /dev/loop2.

lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2

Ensuite, divisez 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

Rendez vg2inactif.

vgchange -a n vg2

Ensuite (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) En cas de duplication des noms des volumes logiques dans les deux groupes de volumes, vgmergerefusera de continuer.

3) Lors de la fusion:

Logical volumes in `vg1` must be inactive

Et sur split:

Logical volume `vg2/lv1` must be inactive.
Faheem Mitha
la source