¿Cómo mover / copiar el volumen lógico (lv) a otro grupo de volúmenes (vg)?

17

Básicamente, quiero mover / copiar varios volúmenes lógicos (lv) en un nuevo grupo de volúmenes (vg). El nuevo grupo de volúmenes reside en un nuevo conjunto de volúmenes físicos. ¿Alguien sabe cómo hacerlo de manera segura sin dañar los datos dentro de esos volúmenes lógicos?

nadie
fuente
Puedes darme mas detalles ? ¿Sabes cómo hacer nuevos VG y LV? ¿Estás moviendo una partición de datos o tu partición raíz?
Panther
@ bodhi.zazen: En realidad estaba tratando de mover una especie de particiones de datos. Lo que quise decir con "tipo de" era que esos volúmenes lógicos son máquinas virtuales. (es decir, esos volúmenes lógicos aparecen en máquinas virtuales como dispositivos de bloque). De todos modos, pude manejar la situación a mi manera. Los pasos se dan en mi respuesta. Sin embargo, usted y todos ustedes pueden comentar sobre mi método. Si hay / hay una mejor manera (s) de hacer este tipo de cosas, tenga la amabilidad de compartirlo. :)
nadie
Hubiera creado primero el nuevo PV / LV, apague la VM, luego copié los datos con dd, inicie la nueva VM y confirme que funcionó.
Panther

Respuestas:

12

vgmerge te permite fusionar dos VG. También puede usar pvmove para mover datos dentro de un VG, y vgsplit si desea volver a varios VG.

Gabriel
fuente
Una nota. Para hacerlo, debe tener un dispositivo temporal utilizado para transferir LV en línea a otro VG. Por supuesto, después de la transferencia, debe actualizar / etc / fstab y otras configuraciones afectadas, y planificar un tiempo fuera de línea para reiniciar, y eventualmente realizar alguna actualización de configuración. Si realiza alguna acción con rootfs o bootfs, debería tener alguna distribución en vivo de Linux para el sistema principal de recuperación.
Znik hace
10

No hay ninguna razón para copiarlo primero en un archivo .img, solo haga el lvcreate primero, luego cópielo directamente:

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
luego
fuente
2
Esto es demasiado breve. No dice cuáles son exactamente los tamaños mencionados; por ejemplo, <el tamaño> puede ser muy pequeño, ya que es solo para las diferencias de instantáneas.
Gorn
1
@gornó un punto válido, pero estaba respondiendo a la respuesta de nadie a continuación, que era la primera en ese momento. Lea eso para un contexto adicional.
Tobias J
7

Bien, pude manejar la situación a mi manera. Aquí están los pasos que tomé:

1) Tome una instantánea del volumen lógico de orientación.

lvcreate --snapshot --name <the-name-of-the-snapshot> --size <the size> /dev/volume-group/logical-volume

Nota: El tamaño de la instantánea puede ser tan grande o tan pequeño como desee. Lo que importa es tener suficiente espacio para capturar los cambios durante el período de la instantánea.

2) Cree una copia de imagen del contenido de la instantánea utilizando dd

dd if=/dev/volume-group/snapshot-name of=/tmp/backup.img

3) Cree un nuevo volumen lógico de tamaño suficiente en el grupo de volúmenes de orientación (nuevo).

lvcreate --name <logical-volume-name> --size <size> the-new-volume-group-name

4) Escriba datos en el nuevo volumen lógico desde la copia de seguridad de la imagen utilizando dd

dd if=/tmp/backup.img of=/dev/new-volume-group/new-logical-volume

5) elimine la instantánea y la copia de seguridad de la imagen usando lvremovey rmrespectivamente.

Eso es todo amigos ... Espero que esto ayude a alguien :)

nadie
fuente
Si alguien tiene una mejor opción / método, hágamelo saber también :-)
nadie
ising backup.img para almacenar temporalmente la copia de seguridad se completa innecesariamente. puede dd directamente desde la instantánea de origen, a LV de destino con estado no montado.
Znik hace
3

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 que utiliza dispositivos de bucle y lvconvertsigue.

Resumen: creamos el grupo de volúmenes vg1 con el volumen lógico lv1 y vg2 con lv2, y hacemos una copia de lv1 en 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

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. Haga que vg1 esté inactivo.

vgchange -a n vg1

Ejecute el comando de combinación en modo de prueba. Esto fusiona lv1 en 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 ahora es lv1_copy.

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

Haga que vg2 esté inactivo.

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
1
Es simplemente inútil. Debe desmontar los sistemas de archivos, desactivar los volúmenes, etc. También puede desmontar el directorio y copiar los datos también.
user189142
primero, como dijo el usuario189142, no tiene sentido. segundo, se aplica solo en situaciones en las que podemos detener los servicios usando el volumen movido. Este es un problema con los servicios que se ejecutan 24/7, y el volumen es muy grande con datos contados con terabytes. Esta causa, este procedimiento necesita un tiempo de servicio muy largo. Esta causa, mucho más fácil, es simplemente crear un nuevo volumen, rsync en línea, y luego con rsync fuera de línea para actualizar, volver a montar y volver al sistema en línea. Por supuesto, la muy buena idea es borrar los datos innecesarios del volumen de origen. tal vez temporalmente moverlo a un lugar temporal.
Znik hace
3

Las 4 respuestas hasta ahora todas pasan por alto que a menudo no se conoce el tamaño exacto del volumen. lvdisplaysolo muestra valores redondeados a 2 decimales y man lvdisplaysolo apunta a otros comandos para las opciones disponibles. A continuación se selecciona MiB, que es lo suficientemente preciso con el tamaño de bloque LVM predeterminado de 4 MiB:

lvdisplay --units m

MiB también es la unidad predeterminada --sizede lvcreate. En caso de duda, verifique dos veces el tamaño correcto lvdisplaydespués de crear el volumen objetivo. Luego continúe como en las otras respuestas para hacer una copia. Además, recomendaría verificar la copia , por ejemplo con cmp.

Aquí se explica por qué se usa una instantánea y qué protege y qué no protege:

  • La instantánea se realiza para que todos los datos se copien tal como estaban en el momento en que se creó la instantánea. Las actividades en el volumen de origen durante el proceso de copia no se reflejarán en la copia.

  • La instantánea también protege el volumen de origen de los errores humanos en la ddlínea de comando. Si escribe accidentalmente en la instantánea, solo se dañarán los datos de la instantánea y simplemente puede eliminar la instantánea y comenzar de nuevo.

  • El volumen de destino no está protegido durante los procesos de copia. Si otro administrador (o un proceso automático como el os-prober of dracut) monta el volumen incompleto, el montaje puede arruinar las cosas. (Incluso un montaje de solo lectura aún puede escribir entradas de diario en el volumen).

Joachim Wagner
fuente
2

Ofreceré mi propio:

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 está bien, elimine la fuente

lvremove vgsource/lv0
conan
fuente
¿Qué sucede si el volumen de origen es muy grande y no se debe detener el servicio o el sistema?
Znik hace
0

Si necesita copiar un volumen lógico de VG A a otro VG B, encontré una variante interesante usando partclone. La instantánea y luego copiar con dd es un buen método, pero podría ser lento si sus sistemas de archivos no están llenos. Esta solución es muy rápida porque copia solo los bloques usados.

  1. Primero cree una instantánea de la fuente LV
lvcreate --snapshot --size 1G /dev/sourcevg/lv --name lv-backup

el --sizeaquí es cómo puede ocurrir mucho antes de escribir la instantánea será desactivada

  1. Crear el destino LV en el destino VG
lvcreate --size <new_lv_size> /dev/destvg --name newlv

new_lv_size debe ser al menos del tamaño de la fuente LV

  1. Copie el sistema de archivos de la copia de seguridad de origen lv al destino LV
partclone.<fs_type> --dev-to-dev --source /dev/sourcevg/lv-backup --output /dev/destvg/newlv

fs_typepuede ser ext4, fat32, btrfs, xfs, ... cualquier FS apoyo de partclone

  1. Eliminar la instantánea
lvremove /dev/sourcevg/lv-backup
HugoPoi
fuente