En esta entrada podremos ver la migración de una maquina en kvm (VM-1) con dos volúmenes, a otra maquina (VM-2) redimensionando de camino sus volúmenes lógicos y aumentando su capacidad en vivo.

La maquina VM-1 contara de dos volúmenes; el raíz donde se encuentra la instalación de Debian y otro con Postgres. A continuación expongo el orden de la migración:

Orden de migración:

  • Snapshot de de disco raíz VM-1.
  • Nuevo volumen de 2GB.
  • Con dd pasamos el snapshot de raiz de VM-1 al volumen de 2GB (VM-2-raiz).
  • Creamos nueva maquina con VM-2-raiz.
  • Paramos Postgres.
  • Desmontamos volumen Postgres.
  • Redimensionamos volumen Postgres.
  • Montamos en VM-2 el volumen de Postgres.
  • Arrancamos Postgres en VM-2.
  • Cambio de regla DNAT.

Instalación y configuración de VM-1

En primer lugar explicare la instalación de la maquina VM-1.

En anfitrión:

Creamos dos volúmenes lógicos: lvcreate -n VM-1-raiz -L 1G LVD-Debian lvcreate -n postgres-lvm -L 1G GLVM

Copiamos configuración previa: cp /etc/libvirt/qemu/Debian-Test.xml /etc/libvirt/qemu/VM-1.xml

Buscar y remplazar (Cambio de nombre, eliminar uuid y mac): sed -i 's/Debian-Test/VM-1/' /etc/libvirt/qemu/VM-1.xml; sed -i /uuid/d /etc/libvirt/qemu/VM-1.xml; sed -i '/mac address/d' /etc/libvirt/qemu/VM-1.xml

Añadimos los volúmenes: nano /etc/libvirt/qemu/VM-1.xml

Arrancamos la red: virsh net-start default

Definir VM-1: virsh define /etc/libvirt/qemu/VM-1.xml

Arrancar VM-1: virsh start VM-1

En VM-1:

Instalamos Debian, en el volumen raíz.

Damos formato xfs al volumen: mkfs.xfs /dev/vdb

Añadimos el volumen a /etc/fstab /dev/vdb /var/lib/postgresql xfs defaults 0 1

Reiniciamos la maquina:


Instalamos Postgres:
```apt-get install postgresql-9.4```
Configuración de Postgres:

Entramos en el directorio main de Postgres 9.4:
```nano /etc/postgresql/9.4/main/postgresql.conf```

Editamos el archivo de configuración postgresql.conf:
Buscamos la siguiente linea:
```#listen_addresses = 'localhost'```

Ponemos especificar la IP remota:
```listen_addresses = '172.22.7.88'```

También la podemos cambiar por '\*' para que se puedan conectar todas las IP:
```listen_addresses = '*'```

Buscamos al siguiente linea:
```#password_encryption = on```

Habilitamos el cifrado de la contraseña:
```password_encryption = on```

Editamos el siguiente archivo:

```nano /etc/postgresql/9.4/main/pg_hba.conf```

Con este archivo podemos configurar las relaciones de confianzas de host y redes.
```host all all 127.0.01/32 md5```

También podemos dar acceso a todas las redes con:
```host all all 0.0.0.0 0.0.0.0 md5```

Reiniciamos el servicio con:
```service postgresql restart```

Creamos usuario morrigan para realizar una prueba:

CREATE USER morrigan PASSWORD ‘morrigan’; ALTER ROLE morrigan CREATEDB; \q psql -h localhost -d postgres -U morrigan CREATE DATABASE programas; \q


**En anfitrión:**

Modificamos iptables:
Limpiamos FORDWARD:
```iptables -F FORWARD```

**DNAT:**
```iptables -t nat -A PREROUTING -p tcp --dport 5432 -i wlan0 -j DNAT --to 192.168.122.232```

Desde otro equipo probamos la configuración anterior:
```psql -h IP-anfitrion -U morrigan```

### Migración de VM-1 a VM-2

**En el anfitrión:**

Creamos un snapshot a un volumen logico:
```lvcreate --snapshot -L1G -n VM-1-raiz-snapshot LVD-Debian/VM-1-raiz```

Creamos un volumen final para VM-2 con 2GB:
```lvcreate -n VM-2-raiz -L 2G LVD-Debian```

Volcamos de VM-1-raiz-snapshot a VM-2-raiz
```dd if=/dev/LVD-Debian/VM-1-raiz-snapshot of=/dev/LVD-Debian/VM-2-raiz```
Creamos una nueva maquina VM-2:
Copiamos configuración previa:
```cp /etc/libvirt/qemu/VM-1.xml /etc/libvirt/qemu/VM-2.xml```

Buscar y remplazar:
```sed -i 's/VM-1/VM-2/' /etc/libvirt/qemu/VM-2.xml; sed -i /uuid/d /etc/libvirt/qemu/VM-2.xml; sed -i '/mac address/d' /etc/libvirt/qemu/VM-2.xml; sed -i 's/524288/1048576/' /etc/libvirt/qemu/VM-2.xml```

Añadimos el volumen anterior:
```nano /etc/libvirt/qemu/VM-2.xml```

Definimos el nuevo server VM-2:
```virsh define /etc/libvirt/qemu/VM-2.xml```

Arrancamos el nuevo server VM-2:
```virsh start VM-2```

**En VM-2:**

Modificamos la tabla de particiones:
```fdisk /dev/vda```

Eliminamos la partición con: d
Creamos una nueva con: n
Abarcamos el disco entero.
Finalmente escribimos los cambios: w

Extendemos con xfs_growfs la partición xfs:
```xfs_growfs -d /dev/vda1```

Comprobamos el resultado con:

root@debian:/home/debian# df -h S.ficheros Tamaño Usados Disp Uso% Montado en /dev/vda1 2,0G 821M 1,2G 41% / ```

Con esto, ya tendríamos montado el disco raíz de la maquina en producción VM-1 en VM-2, mientras VM-1 sigue prestando servicio.

En VM-1:

Paramos postgres: service postgresql stop

Desmontamos el directorio: umount /var/lib/postgresql

En anfitrión:

Desacoplamos el disco vdb de VM-1: virsh detach-disk VM-1 vdb

Redimensionamos el volumen: lvresize -L +1GB /dev/LVD-Debian/postgres-lvm

Acoplamos el volumen de VM-1 en VM-2: virsh attach-disk VM-2 /dev/LVD-Debian/postgres-lvm sdb

En VM-2:

Cambiamos vdb por sda nano /etc/fstab /dev/sda /var/lib/postgresql xfs defaults 0 1

Montamos con: mount -a

Redimensionamos xfs: xfs_growfs -d /dev/sda

Iniciamos Postgresql: /etc/init.d/postgresql start

Por ultimo modificamos iptables para cambiar el trafico del puerto 5432: Eliminamos la regla anterior: iptables -t nat -D PREROUTING -p tcp --dport 5432 -i wlan0 -j DNAT --to 192.168.122.232

Añadimos la regla nueva: iptables -t nat -A PREROUTING -p tcp --dport 5432 -i wlan0 -j DNAT --to 192.168.122.73

Con esto terminamos las migración.