Déplacer un volume logique d'un groupe de volumes vers un autre

18

Est-il possible de déplacer un volume logique d'un groupe de volumes à un autre dans son ensemble?

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 avec les outils LVM seuls?

Sinon, existe-t-il une raison théorique ou une limitation technique (taille des extensions)?

XTL
la source

Réponses:

13

Un groupe de volumes se compose de volumes physiques entiers. Un volume physique se compose de plusieurs extensions (une extension est généralement de 4 Mo); chaque étendue peut appartenir à un volume logique différent. Pour transférer un volume logique vers un autre groupe, vous ne pouvez pas simplement transférer des extensions, car cela pourrait diviser le volume physique entre le VG source et le VG cible.

Ce que vous pouvez faire est de transférer un ou plusieurs PV du VG source vers le VG cible, avec la vgsplitcommande. Vous pouvez spécifier les PV que vous souhaitez transférer ou quel LV (mais un seul à la fois). Si vous spécifiez un LV, celui-ci et les autres LV du VG source doivent se trouver sur des PV distincts. Le VG de destination sera créé s'il n'existe aucun VG portant le nom spécifié.

vgsplit -n source_group/volume_to_copy source_group target_group
vgsplit source_group target_group /dev/sdy99 /dev/sdz99

Vous devrez peut-être utiliser d' pvmoveabord pour organiser les volumes logiques que vous souhaitez déplacer pour être sur des PV séparés.

Si vous vouliez conserver les limites physiques du VG et déplacer les données, il n'y a pas d'outil intégré, mais vous pouvez créer un miroir puis retirer l'original .

Gilles 'SO- arrête d'être méchant'
la source
On dirait que le groupe_cible peut être préexistant?
XTL
8

À 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 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 à utiliser par LVM).

pvcreate /dev/loop1 /dev/loop2

Créez les groupes de volumes vg1 et vg2 sur / dev / loop1 et / dev / loop2 respectivement.

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

Créez des 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

Vous pouvez éventuellement écrire quelque chose sur lv1 afin de pouvoir vérifier ultérieurement que la copie a été correctement créée. Rendez 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 à l' lv1aide de lvconvert. L' dest-pvargument indique lvconvertd'activer la copie miroir /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 vg2/lv1inactif.

lvchange -a n /dev/vg2/lv1

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, les volumes logiques dans vg1doivent être inactifs. Et en cas de division, les volumes logiques vg2appartenant à vg1doivent être inactifs. Dans notre cas, c'est le cas lv1.

Faheem Mitha
la source
2

J'offrirai le mien:

umount /somedir/

lvdisplay /dev/vgsource/lv0 --units b

lvcreate -L 12345b -n lv0 vgtarget

dd if=/dev/vgsource/lv0 of=/dev/vgtarget/lv0 bs=1024K conv=noerror,sync status=progress

mount /dev/vgtarget/lv0 /somedir/

si tout va bien, supprimez la source

lvremove vgsource/lv0
conan
la source
C'est à peu près le contraire de la question. Le point est de déplacer le volume au lieu de copier les données vers un nouveau.
XTL