Nuestros mejores programadores han agotado sus provisiones de café, buscando noche y día por la resolución, hasta que Alexandría halló el hallazgo en Beanstalk así que ahora la comparte contigo.
Solución:
Un grupo de volúmenes consta de volúmenes físicos completos. Un volumen físico consta de muchas extensiones (una extensión suele tener 4 MB); cada extensión puede pertenecer a un volumen lógico diferente. Para transferir un volumen lógico a un grupo diferente, no puede simplemente transferir extensiones, ya que eso podría dividir el volumen físico entre el VG de origen y el VG de destino.
Lo que puede hacer es transferir uno o más PV desde el VG de origen al VG de destino, con el vgsplit
dominio. Puede especificar qué PV desea transferir o qué LV (pero solo uno a la vez). Si especifica un LV, este y los otros LV en el VG de origen deben estar en PV separados. El VG de destino se creará si no existe ningún VG con el nombre especificado.
vgsplit -n source_group/volume_to_copy source_group target_group
vgsplit source_group target_group /dev/sdy99 /dev/sdz99
Es posible que necesite usar pvmove
primero para organizar los volúmenes lógicos que desea mover para que estén en PV separados.
Si tenía la intención de conservar los límites físicos del VG y mover los datos, no hay una herramienta integrada, pero podría hacer un espejo y luego eliminar el original.
A partir de LVM en Debian stretch (9.0), a saber, 2.02.168-2, es posible hacer una copia de un volumen lógico en grupos de volúmenes usando una combinación de vgmerge
, lvconvert
y vgsplit
. Dado que un movimiento es una combinación de una copia y una eliminación, esto también funcionará para un movimiento.
Como alternativa, puede utilizar pvmove
para simplemente mover el volumen.
Una sesión de ejemplo completa e independiente que utiliza dispositivos de bucle y
lvconvert
sigue.
Resumen: creamos grupo de volumen vg1
con volumen lógico lv1
y vg2
con lv2
y hacer una copia de lv1
en vg2
.
Crear archivos.
truncate pv1 --size 100MB
truncate pv2 --size 100MB
Configurar dispositivos de bucle en archivos.
losetup /dev/loop1 pv1
losetup /dev/loop2 pv2
Crear volúmenes físicos en dispositivos de bucle (inicializar dispositivos de bucle para que los use LVM).
pvcreate /dev/loop1 /dev/loop2
Cree grupos de volúmenes vg1 y vg2 en /dev/loop1 y /dev/loop2 respectivamente.
vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2
Cree volúmenes lógicos lv1 y lv2 en vg1 y vg2 respectivamente.
lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2
Cree sistemas de archivos ext4 en lv1 y lv2.
mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2
Opcionalmente, escriba algo en lv1 para que luego pueda verificar que la copia se creó correctamente. Hacer vg1 inactivo.
vgchange -a n vg1
Ejecute el comando de combinación en modo de prueba. Esto fusiona vg1 en vg2.
vgmerge -A y -l -t -v <> <>
vgmerge -A y -l -t -v vg2 vg1
Y luego de verdad.
vgmerge -A y -l -v vg2 vg1
A continuación, cree un par de espejos RAID 1 a partir de lv1
usando lvconvert
. los
dest-pv
el argumento dice lvconvert
para hacer la copia espejo en /dev/loop2
.
lvconvert --type raid1 --mirrors 1 <> <>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2
Luego divide el espejo. El nuevo LV es ahora lv1_copy
.
lvconvert --splitmirrors 1 --name <> <>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1
Hacer vg2/lv1
inactivo.
lvchange -a n /dev/vg2/lv1
Entonces (modo de prueba)
vgsplit -t -v <> <> <>
vgsplit -t -v /dev/vg2 /dev/vg1 /dev/loop1
De verdad
vgsplit -v /dev/vg2 /dev/vg1 /dev/loop1
Salida resultante:
lvs
[...]
lv1 vg1 -wi-a----- 12.00m
lv1_copy vg2 -wi-a----- 12.00m
lv2 vg2 -wi-a----- 12.00m
NOTAS:
1) La mayoría de estos comandos deberán ejecutarse como root.
2) Si hay alguna duplicación de los nombres de los volúmenes lógicos en los dos grupos de volúmenes, vgmerge
se negará a proceder.
3) Al fusionarse, los volúmenes lógicos en vg1
debe estar inactivo. Y en volúmenes divididos, lógicos en vg2
perteneciendo a vg1
debe estar inactivo. En nuestro caso, esto es lv1
.
Ofreceré el mío:
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 todo esta bien quita la fuente
lvremove vgsource/lv0