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 extension peut appartenir à un volume logique différent. Pour transférer un volume logique vers un groupe différent, vous ne pouvez pas simplement transférer des étendues, 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 le vgsplit
commande. Vous pouvez spécifier les PV que vous souhaitez transférer ou les 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éé si aucun VG n'existe avec 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 pvmove
d'abord pour faire en sorte que les volumes logiques que vous souhaitez déplacer soient sur des PV distincts.
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 supprimer l'original.
À partir de LVM dans Debian Stretch (9.0), à savoir 2.02.168-2, il est possible de faire une copie d'un volume logique sur 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 qu'ils soient utilisés 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
Facultativement, é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
. Ledest-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 en vg1
doit être inactif. Et sur les volumes logiques divisés en vg2
appartenant à vg1
doit être inactif. Dans notre cas, il s'agit de lv1
.
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