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

17

Fondamentalement, je souhaite 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. Quelqu'un sait-il comment le faire en toute sécurité sans endommager les données à l'intérieur de ces volumes logiques ??

personne
la source
Pouvez-vous fournir plus de détails? Savez-vous comment faire de nouveaux VG et LV? Déplacez-vous une partition de données ou votre partition racine?
Panther
@ bodhi.zazen: En fait, j'essayais de déplacer une sorte de partitions de données. Ce que je voulais dire par «sorte de», c'était que ces volumes logiques sont des machines virtuelles. (c'est-à-dire que ces volumes logiques sont apparus aux machines virtuelles comme des périphériques blocs). Quoi qu'il en soit, j'ai pu gérer la situation à ma façon. Les étapes sont données dans ma réponse. Cependant, vous et vous tous êtes invités à commenter ma méthode. S'il existe une / des meilleure (s) façon (s) de faire ce genre de chose, merci de bien vouloir le partager. :)
personne
J'aurais d'abord créé le nouveau PV / LV, arrêté la VM, puis copié les données avec dd, démarré la nouvelle VM et confirmé que cela fonctionnait.
Panther

Réponses:

12

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

Gabriel
la source
Une note. Pour ce faire, vous devez avoir un appareil temporaire utilisé pour transférer le LV en ligne vers un autre VG. Bien sûr, après le transfert, vous devez mettre à jour / etc / fstab et toute autre configuration affectée, planifier un certain temps hors ligne pour le redémarrage et éventuellement effectuer une mise à jour de la configuration. Si vous effectuez une action avec rootfs ou bootfs, vous devriez avoir une distribution Linux en direct pour le système principal de récupération.
Znik Il y a
10

Il n'y a aucune raison de le copier d'abord dans un fichier .img, faites d'abord le lvcreate, puis copiez-le 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
anon
la source
2
C'est un peu trop bref. Il ne dit pas quelles sont exactement les tailles mentionnées - par exemple, <la taille> peut être très petite, car ce n'est que pour les différences d'instantanés.
gorn
1
@gorn un point valable, mais il ne répondait à la réponse de personne ci-dessous, qui était la première à l'époque. Lisez cela pour plus de contexte.
Tobias J
7

D'accord, j'ai pu gérer la situation à ma façon. Voici les étapes que j'ai suivies:

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 d'avoir suffisamment d'espace pour capturer les changements pendant la période des instantanés.

2) Créez une copie d'image du contenu de l'instantané à l'aide 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 des 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 l'instantané et la sauvegarde d'image à l'aide de lvremoveet rmrespectivement.

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

personne
la source
Si quelqu'un a une meilleure option / méthode, faites-le moi savoir également :-)
personne
ising backup.img pour la sauvegarde temporaire du magasin est complète et inutile. vous pouvez directement dd à partir de l'instantané source, vers le LV de destination avec un état non monté.
Znik Il y a
3

À 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 le groupe de volumes vg1 avec le volume logique lv1 et vg2 avec lv2, et faisons une copie de lv1 dans 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 lv1 en 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

Rendre vg2 inactif.

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
1
c'est tout simplement inutile. Vous devez démonter les systèmes de fichiers, désactiver les volumes, etc. Vous pouvez simplement démonter dir et copier les données également.
user189142
tout d'abord, comme l'a dit user189142, c'est inutile. deuxièmement, il n'est appliqué qu'avec la situation où nous pouvons arrêter les services en utilisant le volume déplacé. c'est un problème avec les services fonctionnant 24h / 24 et 7j / 7, et le volume est très important avec des données comptées en téraoctets. Cette cause, cette procédure nécessite un temps de service très long. Cette cause, beaucoup plus facile, consiste simplement à créer un nouveau volume, rsync en ligne, puis avec un temps court rsync hors ligne pour la mise à jour, le remontage et le retour du système à l'état en ligne. Bien sûr, la très bonne idée est de supprimer les données inutiles du volume source. peut-être le déplacer temporairement dans un endroit temporaire.
Znik Il y a
3

Jusqu'à présent, les 4 réponses manquent toutes que la taille exacte du volume n'est souvent pas connue. lvdisplayaffiche uniquement les valeurs arrondies à 2 décimales et man lvdisplaypointe uniquement 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 --sizeof lvcreate. En cas de doute, revérifiez la taille correcte avec lvdisplayaprès avoir créé le volume cible. Continuez ensuite comme dans les autres réponses pour faire une copie. De plus, je recommande 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:

  • L'instantané est créé de manière à ce que toutes les données soient copiées telles qu'elles étaient au moment de la création de l'instantané. 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 des erreurs humaines dans la ddligne de commande. Si vous écrivez accidentellement sur l'instantané, seules les données de l'instantané seront endommagées et 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 l'os-prober de dracut) monte le volume incomplet, le montage peut bousiller les choses. (Même un montage en lecture seule peut toujours écrire des entrées de journal sur le volume.)

Joachim Wagner
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
que faire si le volume source est très important et que le service ou le système ne doit pas être arrêté?
Znik Il y a
0

Si vous avez besoin de copier un volume logique de VG A vers un autre VG B, j'ai trouvé une variante intéressante en utilisant partclone. L'instantané puis la copie avec dd est une bonne méthode mais peut être lent si vos systèmes de fichiers ne sont pas pleins. Cette solution est très rapide car elle copie uniquement les blocs utilisés.

  1. Créez d'abord un instantané du LV source
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

le --sizevoici à quel point écrire peut se produire avant que l'instantané est désactivé

  1. Créer la destination LV dans la destination VG
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size doit être au moins de la taille de la source LV

  1. Copiez le système de fichiers de la sauvegarde LV source vers le LV destination
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typepeut être ext4, fat32, btrfs, xfs, ... tout FS soutenu par partclone

  1. Supprimer l'instantané
lvremove /dev/sourcevg/lv-backup
HugoPoi
la source