¿Es posible mover un volumen lógico de un grupo de volúmenes a otro en su totalidad?
Es posible crear un lv (más o menos) coincidente y copiar los datos, pero ¿hay alguna forma de hacerlo solo con las herramientas LVM?
Si no, ¿hay una razón teórica o una limitación técnica (tamaños de extensión)?
Respuesta aceptada:
A partir de LVM en Debian stretch (9.0), concretamente 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.
Alternativamente, puede usar pvmove
para simplemente mover el volumen.
Una sesión de ejemplo completa e independiente que utiliza dispositivos de bucle y lvconvert
sigue.
Resumen:creamos el grupo de volúmenes vg1
con volumen lógico lv1
y vg2
con lv2
y haz una copia de lv1
en vg2
.
Crear archivos.
truncate pv1 --size 100MB
truncate pv2 --size 100MB
Configure 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
utilizarlos con LVM).
pvcreate /dev/loop1 /dev/loop2
Cree grupos de volumen 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 <<destination-vg>> <<source-vg>>
vgmerge -A y -l -t -v vg2 vg1
Y luego de verdad.
vgmerge -A y -l -v vg2 vg1
Luego cree un par de espejos RAID 1 desde lv1
usando lvconvert
. El dest-pv
el argumento le dice a lvconvert
para hacer la copia espejo
en /dev/loop2
.
lvconvert --type raid1 --mirrors 1 <<source-lv>> <<dest-pv>>
lvconvert --type raid1 --mirrors 1 /dev/vg2/lv1 /dev/loop2
Luego divide el espejo. El nuevo LV ahora es lv1_copy
.
lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
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 <<source-vg>> <<destination-vg>> <<moved-to-pv>>
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 continuar.
3) Al fusionar, volúmenes lógicos en vg1
debe estar inactivo. Y en volúmenes lógicos divididos en vg2
perteneciente a vg1
debe estar inactivo. En nuestro caso, este es lv1
.