¿Hay una manera simple de mover / copiar un volumen lógico de un grupo de volúmenes a otro? (LVM2)

15

Estoy reorganizando un montón de discos en mi servidor en casa y me encuentro en la posición de querer mover un montón de volúmenes lógicos LVM a otro grupo de volúmenes. ¿Hay una manera simple de hacer esto? Vi mencionar un cplvcomando, pero parece ser viejo o no algo que alguna vez estuvo disponible para Linux.

jkp
fuente

Respuestas:

20

Si puede organizar que el volumen lógico esté en un subconjunto separado de volúmenes físicos del resto del grupo de volúmenes de origen ( lvconvert sourcevg/sourcelv /dev/pv1 ...puede ayudar), puede usar vgsplitpara dividir el lv en un nuevo vg y vgmergefusionar el nuevo vg en el objetivo vg.

Aunque LVM tiene una función de reflejo, no puede usarla (sensatamente) para hacer una copia entre grupos de volúmenes, porque ambas patas del espejo deben vivir en el mismo vg y la asociación no puede romperse .

Puede copiar un volumen LVM a otro de la misma manera que copiaría cualquier volumen a otro: cree un lv de destino del tamaño apropiado, luego copie el contenido con dd if=/dev/sourcevg/sourcelv of=/dev/targetvg/targetlv bs=4M. Si el volumen de origen está activo, puede aprovechar LVM para hacer una copia consistente: primero tome una instantánea de la fuente lv con lvcreate -s, luego copie la instantánea.

Gilles 'SO- deja de ser malvado'
fuente
1
Brilliant Gilles ... vgsplit / vgmerge probablemente estará bien: puedo usar pvmove después de eso para mover las extensiones físicas al nuevo disco y luego eliminar el volumen anterior del VG.
jkp
Es una pena, esto no funcionó para mí al final debido a los diferentes tamaños de extensión. Si eso no es un problema para ti, te sugiero que este método sea más fácil.
jkp
Después dd(si no tiene prisa por deshacerse de los volúmenes antiguos), no olvide cambiar el UUID de los nuevos sistemas de archivos: tune2fs -U random / dev / targetvg / targetlv
midenok el
2
pvmove -n lvol1 /dev/sdb1 /dev/sdc1

pvmove puede mover datos entre volúmenes físicos: Guía del administrador de LVM

Milán
fuente
10
Pero no entre grupos de volúmenes.
MattBianco
Repito: esto no funciona para dos grupos de volúmenes separados
kissgyorgy
Primero vgextendvg1 con un nuevo pv, luego pvmovetu lv al nuevo pv, vgsplitun vg temporal que tienes vgmergeen vg2. Luego pvmovenuevamente el pv original de lv a vg2, vgreducevg2 para leer el pv intermedio. O para evitar la copia intermedia, simplemente puede combinar primero vg1 en vg2, pvmovelv1 y vgsplitnuevamente vg1 de vg2. Esto debería responder a las objeciones de @ MattBianco y @kissgyorgy y es equivalente a la solución de @Gilles pero reemplazando la instantánea y el nivel bajo ddpor unpvmove
marcz
1

A partir del LVM en Debian tramo (9.0), a saber 2.02.168-2, es posible hacer una copia de un volumen lógico a través de grupos de volúmenes utilizando 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 pvmovepara mover el volumen.

Una sesión de ejemplo completa e independiente utilizando dispositivos de bucle y lvconvertsigue.

Resumen: creamos un grupo de volúmenes vg1con volumen lógico lv1, y vg2con lv2, y hacemos una copia de lv1in vg2.

Crea archivos.

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

Configurar dispositivos de bucle en los archivos.

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

Cree volúmenes físicos en dispositivos de bucle (inicialice dispositivos de bucle para que los use LVM).

pvcreate /dev/loop1 /dev/loop2

Crear grupos de volúmenes vg1y vg2en /dev/loop1y /dev/loop2 respectivamente.

vgcreate vg1 /dev/loop1
vgcreate vg2 /dev/loop2

Crear volúmenes lógicos lv1y lv2en vg1y vg2respectivamente.

lvcreate -L 10M -n lv1 vg1
lvcreate -L 10M -n lv2 vg2

Crear sistemas de archivos ext4 en lv1y lv2.

mkfs.ext4 -j /dev/vg1/lv1
mkfs.ext4 -j /dev/vg2/lv2

Opcionalmente, escriba algo lv1para que luego pueda verificar que la copia se creó correctamente. Hacer vg1inactivo

vgchange -a n vg1

Ejecute el comando de combinación en modo de prueba. Esto se funde lv1con lv2.

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 el lv1uso lvconvert. El argumento <> le dice lvconvertque haga la copia espejo lv1_copyen /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 es ahora lv1_copy.

lvconvert --splitmirrors 1 --name <<source-lv-copy>> <<source-lv>>
lvconvert --splitmirrors 1 --name lv1_copy /dev/vg2/lv1

Hacer vg2inactivo

vgchange -a n vg2

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

Resultado 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, vgmergese negará a continuar.

3) En combinación:

Logical volumes in `vg1` must be inactive

Y en split:

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