Poder migrar una máquina fÃsica a contenedor es muy útil sobretodo cuando hay que actualizar el SO o las librerÃas de este modo podremos hacer un snapshot antes de tocar el sistema, si algo sale mal tan solo habrá que revertir al snapshot.
En LXD3.X se incorporó la utilidad lxd-p2c para poder migrar una máquina existente a contenedor de forma rápida y sencilla.
En este artÃculo explicaremos como llevar a cabo una migración de una Gentoo fÃsica a LXD.
Instalamos todo lo necesario para compilar:
Nos bajamos el código fuente de la herramienta en nuestro equipo y la compilamos:
export GOPATH=$(go env GOPATH)
export GOPATH=/root/go
export GOPATH=$(go env GOPATH)
cd /root/go/src/github.com/lxc/lxd/
make lxd-p2c
La copiamos al servidor que vamos a convertir a LXD:
En el servidor iniciamos el proceso de dumpeo indicando cada una de las particiones que tenga el servidor fÃsico con la excepción de /boot ya que no será necesario por tratarse de un CT:
S.ficheros Tamaño Usados Disp Uso% Montado en
df -h
S.ficheros Tamaño Usados Disp Uso% Montado en
/dev/sda4 39G 13G 24G 35% /
/dev/sda2 97M 22M 71M 24% /boot
/dev/mapper/volgroup_01-volumen_01 183G 117G 56G 68% /var
Generating a temporary client certificate. This may take a minute...
Admin password for https://LXDSERVER:8443:
Transferring container: CTNAME: 686.81MB (9.50MB/s)
Podemos ver el CT en el servidor LXD:
| CTNAME | STOPPED | | | PERSISTENT | 0 |
Arrancamos el CT:
Remapping container filesystem
Comprobamos que está arrancado:
| CTNAME | RUNNING | | | PERSISTENT | 0 |
Entramos dentro del CT:
Editamos la configuración de red ya que el nombre de las interfaces seguramente haya cambiado:
Quitamos del boot la interfaz de red antigua y metemos la nueva:
rm net.enp6s0f1
rc-update del net.enp6s0f1 default
ln -s net.lo net.eth0
rc-update add net.eth0 default
Para que Gentoo funcione dentro de LXD correctamente debemos modificar un script de devfs, a priori no parece necesario pero en posteriores actualizaciones del SO dará problemas si no lo hacemos, eliminamos el ‘-’ de lxc:
keyword -docker lxc -prefix -systemd-nspawn -vserver
Además comentamos el arranque de las terminales ya que no tienen sentido en un CT:
# TERMINALS
#x1:12345:respawn:/sbin/agetty 38400 console linux
#c1:12345:respawn:/sbin/agetty 38400 tty1 linux
#c2:2345:respawn:/sbin/agetty 38400 tty2 linux
#c3:2345:respawn:/sbin/agetty 38400 tty3 linux
#c4:2345:respawn:/sbin/agetty 38400 tty4 linux
#c5:2345:respawn:/sbin/agetty 38400 tty5 linux
#c6:2345:respawn:/sbin/agetty 38400 tty6 linux