OpenVZ y los Linux Containers

Ya comenté en un artículo anterior que quería volver a la filosofía de la web de ofrecer contenidos originales que ayuden a la comunidad GNU Linux y Open Source. En el artículo de hoy hablo de OpenVZ y los Linux Container, explico en que consisten y como funcionan.

openvz-logo-300

¿Que son los Linux Containers y cómo funcionan?

Actualmente con las tecnologías de computación en la nube y virtualización se ha revolucionado el mundo de los llamados ecosistemas de servidores. Ya que hemos pasado de tener nuestros servidores en “hierro” en grandes CPD con cañones de aire frío funcionando 24 horas al día 365 días al año, a poder virtualizarlos, en pocos servidores físicos, utilizando tecnologías privativas como VMWARE o HIPER-V, o libres como QEMU/KVM o PROXMOX. Y en los últimos años en la nube o más bien, utilizando las granjas de terceros, que viene a ser los mismo, utilizando servidores físicos o VPS.

Dentro de toda esta revolución se encuentran los Linux Containers o LXC, una tecnología de virtualización a nivel de sistema operativo en entornos GNU Linux. Resumiendo, LXC permite múltiples instancias de sistemas operativos aislados, conocidos como VPS (Virtual Private Server) o EV (Entornos Virtuales) No lo debemos de confundir con una máquina virtual al uso, ya que LXC sólo provee de un entorno virtual con su propio espacio de procesos y redes. Es similar, y es casi primo hermano de sistemas como OpenVZ y Linux-Vserver.

Para funcionar utiliza la funcionalidad cgroups del núcleo Linux, disponible desde la versión 2.6.29

¿Qué es OpenVZ y cómo funciona?

OpenVZ es una tecnología de virtualización a nivel de sistema operativo. Permite múltiples instancias de sistemas operativos aislados, conocidos como VPS (Virtual Private Server) o EV (Entornos Virtuales) A diferencia de otros sistemas de virtualización como VMWARE, XEN, PROXMOX o HIPER-V , OpenVZ es restrictivo a la de la elección de sistema operativo, ya que sólo admite GNU Linux. A pesar de eso OpenVZ ofrece mayor rendimiento, escalabilidad, densidad, administración de recursos dinámicos y facilidad de manejo.

OpenVZ está basado en el software privativo Virtuozzo. OpenVZ en cambio es software libre y utiliza la licencia GNU GPL 2

OpenVZ-GNU-Linux

Estructura de OpenVZ

Su núcleo es un Linux modificado, y agrega una noción de Entorno Virtual. Dicho núcleo proporciona la virtualización, aislamiento, administración de recursos y punto de comprobación.

Cada EV es una entidad separada. Para el usuario se muestra como un servidor individual.

Por lo tanto tiene su propio sistema de ficheros:

  • Biblioteca de sistemas, aplicación, /proc y /sys virtualizado
  • Tiene sus propios usuarios y grupo, incluyendo root
  • Su propio árbol de procesos.
  • A nivel de Red tiene su propia red virtual. Esto le permite tener su propias direcciones IP y sus propias reglas (iptables)
  • Se le puede llegar a dar acceso a dispositivos reales como puertos red, seriales, de disco, etcétera.
  • Podemos gestionar los límites de memoria y las cuotas de CPU

Para utilizar OpenVZ se recomienda la siguiente configuración:

A nivel de hardware:

  • Sistema compatible IBM PC
  • Intel Core I7, XEON E7 o AMD Opteron
  • 2 GB de memoria RAM como mínimo
  • Un disco duro de al menos 80 GB
  • Una tarjeta de red de 10 / 100 / 1000

A nivel de especificaciones de red:

  • Una área local para el servidor
  • Una conexión a Internet
  • Una IP válida para el servidor
  • Una IP válida para cada container

Preparando la instalación de OpenVZ en CentOs 6.6

Yo he utilizado CentOS 6.6 en su versión mínima o Core. La versión 7 no es recomendable, ya que a fecha de la creación de éste tutorial no es compatible con OpenVZ.

Una vez instalada debemos de activar la red, modificando el fichero /etc/sysconfig/network-scripts/ifcfg-eth0, utilizando el editor vi.

Modificamos la línea:

1
ONBOOT=no

Por:

1
ONBOOT=yes

Y configuramos la red para que se active de forma automática.

Una vez hecho esto  y después de reiniciar, ya podemos actualizar la distribución con:

1
yum update

Para no tener que trastear directamente en el teclado del servidor, que lo tengo en otra habitación, accederé a él vía ssh.

Antes tenemos que ver que IP tiene asignado el servidor que le llamado ‘OpenVZCentOS’, usaremos el comando:

1
ip a

Comprobamos también que el servicio sshd esté encendido

1
service sshd status

Y desde mi laptop ya puedo acceder:

1
ssh root@IP-DEL-SERVIDOR

Ya podemos preparar el terreno para OpenVZ. Primero de todo añadiremos los repositorios al sistema. Para poder descargar el repositorio intalaremos el programa wget

1
yum install wget
1
wget -P /etc/yum.repos.d/ http://ftp.openvz.org/openvz.repo

Para usar el repositorio debemos importar su GPG KEY

1
rpm --import http://ftp.openvz.org/RPM-GPG-Key-OpenVZ

Instalamos VZKernel y sus herramientas

VZKernel es el núcleo de OpenVZ. Se trata de un kernel de Linux modificado, para que puedan funcionar los contenedores.

Lo instalaremos con el comando:

1
yum install vzkernel

Si todo ha ido bien al arrancar veremos la siguiente imagen del menú GRUB

OpenVZ-Centos6-6-001

Instalamos sus herramientas:

1
yum install vzctl vzquota ploop

No las explico ya que las iremos utilizando durante el artículo y veremos para que sirven.

Modificamos el fichero /etc/sysctl.conf o mejor, guardamos el original y creamos uno nuevo:

1
mv /etc/sysctl.conf /etc/sysctl.conf.original
1
vi /etc/sysctl.conf

Para editar el fichero podemos utilizar cualquier editor, por defecto el core de Centos 6.6 viene con vi, podemos instalar otros como vim o nano.

Editamos el fichero con la siguiente configuración:

1
2
3
4
5
6
7
8
net.ipv4.ip_forward = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.conf.default.forwarding=1

Ahora configuraremos la red para que funcionen los contenedores. Existen dos tipos de configuraciones para los OpenVZ, llamadas venet (Virtual NETwork) y veth (Virtual ETHernet), en el siguiente enlace podéis ver sus diferencias: “Diferencias entre venet y veth

Yo he utilizado la segunda, es decir, veth, que añade a la red del contenedor una dirección MAC, admite broadcast entre otras características.

Para que funcione añadiremos una conexión bridge, llamada, vmbr0.

Editamos los ficheros:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# vi /etc/sysconfig/network-scripts/ifcfg-vmbr0 
DEVICE="vmbr0"
BOOTPROTO="static"
IPV6INIT="no"
ONBOOT="yes"
TYPE="Bridge"
DELAY=0
IPADDR=192.168.1.99
NETMASK=255.255.255.0
GATEWAY=192.168.1.1
 
# vi /etc/sysconfig/network-scripts/ifcfg-eth0 
DEVICE="eth0"
ONBOOT="yes"
IPV6INIT="no"
TYPE="Ethernet"
BRIDGE="vmbr0"

La configuración de la red la adaptaremos a nuestras necesidades.

Creamos el fichero /etc/vz/vznet.conf con el siguiente contenido:

1
2
#!/bin/bash
EXTERNAL_SCRIPT="/usr/sbin/vznetaddbr"

Este script añadirá o eliminará la interfaz de red de los container cuando los paremos o encendamos.

Ahora reiniciamos el servidor para que cargue la nueva configuración.

Crear un container tipo veth

Para crear nuestro primer container utilizaremos las plantillas disponibles en la red, no me gusta utilizar la palabra nube.

Podemos utilizar la herramienta vztmpl-dl, que nos permitirá descargar plantillas de sistemas operativos.

Veamos como funciona, si queremos ver todas las plantillas disponibles, tecleamos:

1
vztmpl-dl --list-remote

Veremos que la lista es bastante extensa, y nos permite disfrutar de plantillas Debian, Ubuntu, Fedora y otras.

Si queremos descargar una, lo haríamos así:

1
vztmpl-dl fedora-20-x86

Para nuestro caso he utilizado una plantilla del sistema operativo Debian:

1
vztmpl-dl debian-8.0-x86_64-minimal

Aquí vemos la descarga:

OpenVZ-Centos6-6-002

A continuación utilizaremos la plantilla, al crear y configurar el contenedor utilizando la herramienta vzctl

De la siguiente manera:

1
vzctl create 101 --ostemplate debian-8.0-x86_64-minimal --config basic

Una vez creada podemos verla en la lista de contenedores, utilizando el comando vzlist -a:

OpenVZ-Centos6-6-003

Ya hemos creado el contenedor, pero ahora nos falta configurarlo.

Configurando nuestro primer Linux Container

Primero de todo indicaremos que queremos que se encienda al iniciar nuestro server OpenVZ

1
vzctl set 101 --onboot yes --save

Toda la configuracón que vayamos realizando se va guardando el fichero /etc/vz/conf/101.conf

Ahora le asignaremos un nombre de host, que será Debian8

1
vzctl set 101 --hostname Debian8.localdomain.com --save

Le asignaremos también una IP estática:

1
vzctl set 101 --ipadd 192.168.1.181 --save

La asignamos un servidor de nombres (DNS) :

1
vzctl set 101 --nameserver 8.8.8.8 --nameserver 8.8.4.4 --save

Le he asginado los de Google, aquí cada cual según su proveedor favorito.

Asignamos una contraseña de root para el contenedor:

1
vzctl set 101 --userpasswd root:la-contraseña

Así ya tenemos el usuario root con nueva contraseña.

Administrar los contenedores

Tal y como hemos visto antes con el comando ‘vzlist’, podemos ver la lista de contenedores y su estado, con nuestra nueva configuración veremos:

OpenVZ-Centos6-6-004

Para apagar y encender los contenedores utilizaremos los comandos:

  • vzctl start 101
  • vzctl stop 101

Aquí se puede ver su uso:

OpenVZ-Centos6-6-005

Para acceder al contenedor utilizamos: vzctl enter 101

Creo que por hoy lo dejamos aquí, todavía me he dejado muchas cosas en el tintero, como dimensionar los discos, realizar copias de seguridad y mucho más, estad atentos : )

Siguiente capítulo: Administrar contenedores OpenVZ

See you soon!!

You may also like...

11 Responses

  1. victorhck dice:

    Hola!
    Todo esto de la computación en la nube, contenedores, etc me viene muy grande.
    Pero ha sido muy instructiva la primera parte, e interesante el desarrollo posterior.
    Saludos!

    PS: ¿Qué tal un artículo tipo: Dockers para dummies? jejeje 😉

    • davidochobits dice:

      Hola! Pues sí, la verdad es que puede llegar a ser algo lioso, añadido que evoluciona muy rápido y es difícil seguirle la pista. Tomo nota de la idea de “Docker for dummies” : )
      ¡Gracias por pasarte!

  2. ToniV dice:

    Muy buen artículo y muy completo. Yo he trabajado con la misma combinación que tú muestras, CentOS 6 + OpenVZ. He estado buscando durante mucho tiempo lo del tema de las interfaces, en este caso veth, que es el más complicado de configurar ya que tienes que montar un puente y demás… Pero me lo has dejado muy claro y sencillo de entender y configurar, ¡gracias! Quería hacerte una preguntilla, al utilizar una interfaz veth podríamos hacer que emitiera por broadcast a otros equipos que no estuvieran dentro del entorno del contenedor, es decir, que no fueran contenedores… Por ejemplo, si yo quisiera montar un servidor DLNA, podría usando este interfaz?, porque con la venet no me permite hacer broadcast y siempre me he quedado con la duda… En fin.

    También te quería hacer algunas correcciones! (si no es molestia) 🙂

    – Has puesto, para arrancar al inicio del sistema el interfaz eth0, “ON BOOT” y debería ser junto “ONBOOT”
    – Has puesto yup update, es un error del teclado pero para los que menos conocimientos tienen… Es “yum update”
    – Al crear el contenedor 101 te falta el parámetro –ostemplate delante del template debian-8…

    Muy buen post y me alegro de que hayas elegido este tema en concreto del que hay poca información en español y más aún cuando es en temas más específicos como por ejemplo los parámetros de configuración de un contenedor (con el comando vzubc ves el estado actual y si sobrepasan o dan errores).

    Un saludo! 😉

    • davidochobits dice:

      Hola Toni,
      Me alegro que el post te haya sido útil. Ya he realizado las tres correcciones que apuntabas, gracias!
      Respecto el tema del “broadcast” se revisas el enlace sobre las interfaces veth y venet podrás ver que una de las diferencias es precisamente esa, venet no permite “broadcast” y veth sí.
      Saludos y gracias por tu super comentario! 🙂

  3. Emiliano dice:

    Estimado,
    Desde ya muchas gracias por la informacion y por como está presentada.
    He encontrado un error que particularme me causo confusion. Venet es Virtual Network y Veth es Virtual Ethernet.
    Saludos.

  1. 9 julio, 2015

    […] Si queréis consultar el artículo anteriores lo podéis hacer desde aquí. […]

  2. 2 septiembre, 2015

    […] permitirá tener ambas cosas, es decir, poder operar con virtualización KVM y contenedores tipo OpenVZ, en un mismo […]

  3. 17 septiembre, 2015

    […] Linux. El tema de los contenedores lo hemos tratado ampliamente en la web, tanto Docker como OpenVZ. Con estos últimos son con los que […]

  4. 15 octubre, 2015

    […] un cambio radical respecto a su última versión, ya que ha dejado de trabajar con los contenedores OpenVZ y ahora usará los Linux Containers (LXC). Por lo que si queremos migrar a la nueva versión debemos […]

  5. 8 septiembre, 2016

    […] hemos hablado en la web de los contenedores Linux, ya sabéis OpenVZ, LXC y Docker.  La coincidencia con las jaulas chroot es que estas comparten el mismo kernel que […]

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR