web-dev-qa-db-fra.com

Comment déplacer / copier un volume logique (LV) vers un autre groupe de volumes (VG)?

En gros, je veux déplacer/copier plusieurs volumes logiques (lv) dans un nouveau groupe de volumes (vg). Le nouveau groupe de volumes réside sur un nouvel ensemble de volumes physiques. Est-ce que quelqu'un sait comment le faire en toute sécurité sans endommager les données à l'intérieur de ces volumes logiques?

17
nobody

vgmerge vous permet de fusionner deux VG. Vous pouvez également utiliser pvmove pour déplacer des données à l'intérieur d'un VG et vgsplit si vous souhaitez revenir à plusieurs VG.

11
Gabriel

Il n'y a aucune raison de le copier d'abord dans un fichier .img, il suffit de faire le lvcreate d'abord, puis de le copier directement:

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume
lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name
dd if=/dev/volume-group/snapshot-name of=/dev/new-volume-group/new-logical-volume
9
anon

D'accord, j'ai pu gérer la situation à ma manière. Voici les étapes que j'ai prises:

1) Prenez un instantané du volume logique de ciblage.

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume

Remarque: la taille de l'instantané peut être aussi grande ou aussi petite que vous le souhaitez. Ce qui compte, c’est de disposer de suffisamment d’espace pour enregistrer les modifications en cours d’instantané.

2) Créez une copie image du contenu de l'instantané en utilisant dd

dd if=/dev/volume-group/snapshot-name of=/tmp/backup.img

3) Créez un nouveau volume logique de taille suffisante dans le groupe de volumes de ciblage (nouveau).

lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name

4) Écrivez les données sur le nouveau volume logique à partir de la sauvegarde d'image en utilisant dd

dd if=/tmp/backup.img of=/dev/new-volume-group/new-logical-volume

5) supprimez la sauvegarde d'image instantanée et d'image en utilisant lvremove et rm respectivement.

C'est tout le monde ... J'espère que ça aide quelqu'un :)

7
nobody

À partir de la version LVM dans Debian (9.0), à savoir 2.02.168-2, il est possible de copier un volume logique sur plusieurs groupes de volumes en utilisant une combinaison de vgmergename__, lvconvertet de vgsplitname__. Comme un déplacement est une combinaison d'une copie et d'une suppression, cela fonctionnera également pour un déplacement.

Vous pouvez également utiliser pvmovepour déplacer simplement le volume.

Un exemple complet de session autonome utilisant des unités de boucle et lvconvertsuit.

Résumé: nous créons le groupe de volumes vg1 avec le volume logique lv1 et vg2 avec lv2 et faisons une copie de lv1 dans vg2.

Créer des fichiers.

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

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

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

Créez des volumes physiques sur des périphériques en boucle (initialisez des 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é créée correctement. Rendre vg1 inactif.

vgchange -a n vg1

Exécutez la commande de fusion en mode test. Cela fusionne lv1 dans 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 à partir de lv1 en utilisant lvconvertname__. L'argument <> indique à lvconvertde créer la copie miroir lv1_copy sur /dev/loop2.

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

Puis 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

Rendre vg2 inactif.

vgchange -a n vg2

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

Résultat obtenu:

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) en fusion:

Logical volumes in `vg1` must be inactive

Et en split:

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

Je vais offrir 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
2
conan

Les 4 réponses jusqu'à présent manquent toutes que la taille exacte du volume n'est souvent pas connue. lvdisplay n'affiche que les valeurs arrondies à 2 décimales et man lvdisplay ne pointe que vers d'autres commandes pour les options disponibles. Ce qui suit sélectionne MiB, qui est suffisamment précis avec la taille de bloc LVM par défaut de 4 MiB:

lvdisplay --units m

MiB est également l’unité par défaut pour --size of lvcreate. En cas de doute, vérifiez une nouvelle fois la taille correcte avec lvdisplay après avoir créé le volume cible. Ensuite, continuez comme dans les autres réponses pour en faire une copie. De plus, je recommanderais de vérifier la copie, par exemple avec cmp.

Voici pourquoi un instantané est utilisé et ce qu’il protège et ne protège pas:

  • Le cliché est créé de sorte que toutes les données soient copiées telles quelles au moment de la création du cliché. Les activités sur le volume source pendant le processus de copie ne seront pas reflétées dans la copie.

  • L'instantané protège également le volume source contre les erreurs humaines dans la ligne de commande dd. Si vous écrivez accidentellement sur l'instantané, seules les données de l'instantané seront endommagées. Vous pouvez simplement supprimer l'instantané et recommencer.

  • Le volume cible n'est pas protégé pendant les processus de copie. Si un autre administrateur (ou un processus automatique tel que le système os-prober de dracut) monte le volume incomplet, le montage peut tout gâcher. (Même un montage en lecture seule peut toujours écrire des entrées de journal sur le volume.)

2
Joachim Wagner