En esta entrada trataremos la instalación de LXC en Debian Jessie, junto con; comandos básicos y creación de contenedores. Esta instalación se realizara en un sistema auxiliar en un volumen lógico, dado que en el ordenador donde lo montare sera en mi ordenador personal.
Información general de LXC
LXC (Linux Containers) es un entorno de virtualización a nivel de sistema operativo para la ejecución de múltiples sistemas Linux aislados en contenedores en un único host anfitrión con kernel Linux.
- Virtualización a nivel de sistema operativo.
- Licencia: GNU-GPL v2.
- Escrito en: C, python3, shell, lua.
- Desarrollo activo.
- Sistemas soportados: sistemas con nucleo Linux.
- Arquitecturas: x86, x86-64, IA-64, PowerPC, SPARC, Itanium, ARM.
- Versión estable desde el 12/05/2013
- Web: linuxcontainers.org
Presentación de LXC: (http://tedezed.github.io/Presentation/lxc/)
Instalación y configuración de LXC
Instalación de paquetes: apt-get install lxc bridge-utils libvirt-bin debootstrap
Debemos comprobar la configuración del núcleo, vemos si todas las características están activas.
Creamos un nuevo contenedor con: lxc-create -n contenedor1 -t debian
Una vez creada la máquina, nos dirá que la contraseña de root es ‘root’ y nos aconseja que la cambiemos.
Root password is 'J90Fki5w', please change !
También podemos crear un contenedor con un volumen para copia de seguridad:
Si ejecutamos directamente el comando para crear el contenedor: lxc-create -t debian -n contenedor_lv -B lvm --vgname lxc --lvname lv_debian --fssize 1G --fstype xfs
Nos devolverá el siguiente error:
File descriptor 3 (/var/lib/lxc/contenedor_lv/partial) leaked on lvcreate invocation. Parent PID 4696: lxc-create
<strong>Volume group "lxc" not found</strong>
lxc_container: Error creating new lvm blockdev /dev/lxc/lv_debian size 1073741824 bytes
lxc_container: Failed to create backing store type lvm
lxc_container: Error creating backing store type lvm for contenedor_lv
lxc_container: Error creating container contenedor_lv
Para resolver este error creamos un dispositivo de imagen donde crearemos un volumen utilizable desde lxc.
truncate -s 5G lvm.img
losetup -f --show lvm.img
Anotamos la respuesta del comando, en mi caso /dev/loop0 Con esto ultimo resuelto, creamos el grupo de volúmenes por defecto de lxc:
Elegimos el volumen anterior con:
pvcreate /dev/loop0
Damos como nombre lxc: vgcreate lxc /dev/loop0
Creamos un volumen lógico y dejamos espacio para los metadatos: lvcreate -l 95%FREE --type thin-pool --thinpool lxc lxc
Ahora si ejecutamos el comando para crear el contenedor con volumen lógico.
lxc-create -t debian -n contenedor_lv -B lvm --vgname lxc --lvname lv_debian --fssize 1G --fstype xfs
-B -Tipo de volumen para copia de seguridad: 'dir', 'lvm', 'loop', 'btrfs', 'zfs' o 'best'.
--vgname -Nombre del grupo de volúmenes.
--lvname -Nombre del volumen lógico.
--fssize -Capacidad del volumen lógico.
--fstype -Formato del volumen.
También nos retornara la contraseña de root:
Root password is '9aQC1I1L', please change !
Configurar bridge en un contenedor: (https://wiki.debian.org/LXC/SimpleBridge)
Editamos el fichero de red de la máquina anfitriona.
nano /etc/network/interfaces
Ponemos las siguientes ordenes suponiendo que nuestra tarjeta de red es la eth0:
[enlighter lang="python"]auto eth0
iface eth0 inet dhcp
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_fd 0
bridge_maxwait 0
Desactivamos Network Manager, este puede que nos de problemas a la hora de utilizar esta configuración:
/etc/init.d/network-manager stop
Reiniciamos la red:
/etc/init.d/networking restart
Podemos configurar la red de dos formas:
- Configurando el contenedor nano /var/lib/lxc/contenedor1/config
- Configurando la configuración general nano /etc/lxc/default.conf
En ambos casos tendremos que añadir:
# Network
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
Iniciamos el contenedor para testear la red: lxc-start -n contenedor1 -d
Entramos como root: lxc-console -n contenedor1
Miramos la ip de la maquina:
root@contenedor1:~# ip addr | grep eth0
4: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
inet 192.168.0.6/24 brd 192.168.0.255 scope global eth0
Podemos comprobar la conexión con ping, en mi caso no viene instalado en la maquina así que instalamos el paquete:
apt-get update
apt-get upgrade
apt-get install iputils-ping
Hacemos ping:
root@contenedor1:~# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=51 time=47.5 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=51 time=56.4 ms
^C
--- 8.8.8.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 47.514/51.967/56.421/4.459 ms
Para iniciar el contenedor: lxc-start -n contenedor1 -d
Conectar al contenedor anteriormente iniciado: lxc-console -n contenedor1
Para salir pulsamos CTRL+a y al soltar q.
Para ver los contenedores creados: lxc-list
Parar contenedor: lxc-stop -n contenedor1
Apagar el contenedor: lxc-halt -n contenedor1
Borrar contenedor: lxc-destroy -n contenedor1
Si queremos saber más información sobre un contenedor como el pid: lxc-info -n contenedor1
Clonar contenedor: lxc-clone -o contenedor1 -n contenedor2
Auto inicio de contenedores al arrancar el anfitrión:
Editamos con nano /var/lib/lxc/contenedor1/config
y añadimos: lxc.start.auto = 1
Ejecutar comandos en un contenedor: lxc-attach -n contenedor1 -- ip addr