- En este artículo veremos: Virtualización en GNU/Linux, Componentes de un entorno virtualizado, Verificar requisitos de hardware e instalar paquetes, Virtualización de aplicaciones, LXD, Docker vs. LXC, Instalación de Docker y ejemplos, Cloud-init, D-Bus machine-id, Acceso seguro usando OpenSSH…
Máquinas virtuales
-
La virtualización es una tecnología que nos posibilita crear innumerables máquinas virtuales (no físicas) en un único hardware, sea éste un PC o un servidor; o en un servicio de cloud computing.
-
Una máquina virtual es una representación lógica de un PC que compartirá los recursos del mismo.
-
The advantage of using this technology is based on the fact that it allows us to optimise hardware resources by consolidating servers and applications, with the consequent saving of money and time in their management.
-
Si bien aquí se habla de virtualización de sistemas operativos y aplicaciones, también podemos virtualizar sistemas de archivos (GSF, HDFS, DSF), almacenamiento (discos duros), bancos de datos, redes definidas por software (SDN) o funciones de red (NFV).
-
En líneas generales existen tres tipos de virtualización:
-
Total (simulación casi total del hardware en la máquina virtual),
-
Parcial (el software a veces se tiene que adaptar),
-
Paravirtualización (el hardware no es simulado).
-
Las tres técnicas difieren en la complejidad de la implementación, el alcance del soporte al sistema operativo y el nivel de acceso a los recursos comunes.
-
De ellas, la virtualización total ofrece el mejor desempeño y escalabilidad comparada con las otras opciones.
Components of a virtualised environment
-
Los componentes de un entorno de virtualización son el hypervisor (virtual machine monitor ó VMM) y la maquina virtual (virtual machine ó VM de sus siglas en inglés).
-
El hypervisor es una capa de hardware, firmware o software que funciona como anfitrión (host), creando y hospedando las máquinas virtuales clientes (guests).
-
El hypervisor puede ser:
- Nativo o de tipo 1 (bare metal) funcionando entre la capa de hardware y la del sistema operativo.
- De tipo 2 (hosted), alojado dentro del sistema operativo de ese PC (VirtualBox, VMWare).
-
Nativos de tipo 1:
- Red Hat Openshift https://www.redhat.com/en/technologies/cloud-computing/openshift,
- Oracle VM Server for x86 https://docs.oracle.com/en/virtualization/oracle-vm/index.html,
- Citrix XenServer http://xenserver.org/,
- VMware ESX/ESXi https://www.vmware.com/ar/products/esxi-and-esx.html,
- Microsoft Hyper-V https://docs.microsoft.com/es-es/virtualization/hyper-v-on-windows/reference/hyper-v-architecture).
- Proxmox Virtual Environment (VE) https://www.proxmox.com/en/.
-
En GNU/Linux se pueden utilizar:
- KMV https://www.linux-kvm.org/page/Main_Page (si nuestro procesador soporta virtualización).
- QEMU https://www.qemu.org/.

-
Por otro lado Openstack https://www.openstack.org/, que forma parte de la OpenInfra Foundation https://openinfra.dev/, es el sofware open source más desplegado en ambientes cloud del mundo.
-
Es una infraestructura cloud para máquinas virtuales, Bare Metal, y contenedores que gestiona, mediante APIs o un panel web, grandes grupos de recursos informáticos, de almacenamiento y de red.
-
Como hypervisor de tipo 2 (hosted) se puede utilizar la versión open source de VirtualBox.
-
Para la gestión de las plataformas virtualizadas se utiliza generalmente la API libvirt https://libvirt.org/.
-
Open source virtualization tools planet: https://planet.virt-tools.org/.
-
Para crear máquinas virtuales en Ubuntu, Canonical recomienda Multipass https://multipass.run/.
-
Permite ejecutar instancias de Ubuntu utilizando los metadatos de cloud-init de la misma manera que se hace en AWS, Azure, Google, IBM y Oracle.
-
Multipass se puede instalar en Linux, Windows y macOS; y con un simple comando permite crear ambientes virtuales.
-
Utiliza Hyper-V en Windows, QEMU e HyperKit en macOS y LXD en Linux.
-
Documentación: https://ubuntu.com/server/docs/virtualization-multipass.
sudo snap install multipass # instalar en Ubuntu
multipass launch 22.04 # crear una VM con Ubuntu 22.04
Verificar requisitos de hardware e instalar paquetes
- Para poder configurar la virtualización en un ordenador se necesita una CPU que la soporte.
- En las distribuciones GNU/Linux se puede verificar con el siguiente comando:
grep -E 'svm|vmx' /proc/cpuinfo
Virtualización de aplicaciones con contenedores
-
Últimamente han nacido plataformas para la distribución de aplicaciones aisladas del sistema operativo que permiten a éstas ser ejecutadas dentro de un contenedor (container); entre ellas Docker, Podman https://podman.io/, LXC/LXD, systemd-nspawn, y Kata Containers https://katacontainers.io/.
-
Los contenedores utilizan el mecanismo control groups (cgroups) dentro del kernel de Linux para gestionar los recursos de la aplicación.
-
Docker https://www.docker.com/ es una de ellas y lo que hace es crear un contenedor con las bibliotecas y códigos de la aplicación para que ésta pueda ser ejecutada en una máquina virtual o en la nube usando el servicio cloud Docker Hub https://hub.docker.com/.
-
En nuestro PC podemos instalar LXC (ver tutorial https://fortinux.com/en/tutoriales/tutorial-instalar-lxc-en-gnulinux/), Docker o Vagrant https://www.vagrantup.com/ para ejecutar sistemas operativos o aplicaciones virtuales.

-
Por otro lado, para automatizar la implementación, el escalado y la administración de aplicaciones en contenedores se utiliza la plataforma desarrollada por Google de código abierto Kubernetes (K8s).
-
Kubernetes es un sofware de orquestación el cual agrupa los contenedores que conforman una aplicación en unidades lógicas para una fácil administración y descubrimiento.
-
Fuente: https://kubernetes.io/es/.
LXD
- LXD https://canonical.com/lxd es un hypervisor liviano de contenedores y máquinas virtuales.
- LXC https://linuxcontainers.org/ es el programa que crea y administra contenedores en un sistema local proporcionando una API para permitir que los administradores de nivel superior, como LXD, administren contenedores y máquinas virtuales.
- En cierto sentido, se podría comparar LXC con QEMU y a LXD con libvirt.
Docker vs LXC
-
En la actualidad hay dos tecnologías populares utilizadas para crear containers: Docker y LXC.
-
En líneas generales LXC ha hecho foco en las operaciones de IT y Docker en el desarrollo y test de las aplicaciones.
-
Docker provee:
- Una manera simple de empaquetar y entregar aplicaciones junto con sus dependencias,
- Relativa facilidad de uso y bajos requisitos de administración,
- Un amplio conjunto de herramientas y utilidades.
-
LXC, siendo una tecnología más antigua de containers, permite:
- Una VM ligera con su propio hostname, dirección IP, sistema de ficheros, y el init.d completo del SO,
- Provee acceso SSH directo,
- Se desempeña casi igual que bare metal,
- Puede ejecutar eficientemente una o más aplicaciones con múltiples procesos.
- Es nativa de Linux, muy estable, confiable, eficiente y soportada por el SO mismo.
-
Un contenedor basado en LXC puede ejecutar casi cualquier aplicación basada en Linux sin sacrificar el rendimiento o la facilidad operativa de uso.
-
Esto convierte a LXC en una plataforma ideal para contener aplicaciones empresariales de uso intensivo de datos y sensibles al rendimiento.
-
Fuente: http://lpicentral.blogspot.com/2019/06/linux-containers-comparison-lxc-docker.html.
-
Recursos: https://ubuntu.com/blog/lxd-vs-docker.
Instalación de Docker y ejemplos
- Para instalar Docker en Rocky Linux:
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf update
sudo dnf install docker-ce docker-ce-cli containerd.io
- Para configurarlo:
sudo systemctl enable docker
sudo systemctl start docker
systemctl status docker
sudo usermod -aG docker $USER # agregar usuario al grupo docker
newgrp docker # recargar sesión
- Verificar si se puede acceder y descargar imágenes del Docker Hub:
docker run hello-world
- Para buscar la imagen de CentOS escribir:
docker search centos
- Para descargar la última versión se usa el comando pull:
docker pull centos
- Para ejecutarla y acceder a la shell:
docker run -it centos
ls -la
exit
- Para verificar las imágenes que han sido descargadas:
docker images
- Para verificar los containers activos e inactivos:
docker ps -a
- Para iniciar/parar un container activo:
docker start/stop container-id
Instalación de Docker en CentOS
-
En CentOS primero se debe eliminar podman https://podman.io/ y la herramienta buildah, que cumplen en líneas generales las mismas funciones que Docker.
-
En caso de querer utilizar podman para gestionar containers usando los comandos de Docker simplemente se crea un alias: alias docker=podman.
-
Pasos para instalar y usar Docker:
-
Actualizar la base de datos de paquetes:
sudo yum erase podman buildah
sudo yum check-update
sudo yum -y update
- Agregar el repositorio oficial de Docker, descargar la última versión, e instalarla:
curl -fsSL https://get.docker.com/ | sh
- Iniciar el demonio Docker:
sudo systemctl start docker
- Verificar que se está ejecutando:
sudo systemctl status docker
- Configurar Docker para iniciar en cada reinicio del SO:
sudo systemctl enable docker
- Agregar el usuario al grupo de Docker:
sudo usermod -aG docker $(whoami)
docker
docker info
Cloud-init
-
Las imágenes en la nube son plantillas de sistemas operativos y cada instancia comienza como un clon idéntico de todas las demás instancias.
-
Son los datos del usuario los que le dan a cada instancia en la nube su personalidad y cloud-init es la herramienta que aplica los datos del usuario a sus instancias automáticamente.
-
Para ello se utilizan ficheros de texto plano YAML (YAML Ain’t Markup Language) con una sintaxis llamada cloud-config.
-
Se usa cloud-init para configurar:
- Default locale,
- Hostname,
- Generar y configurar las llaves SSH privadas,
- Definir puntos de montajes temporales,
- etc.
-
Documentación oficial: https://cloud-init.io/.
D-Bus machine-id
- El fichero /etc/machine-id contiene el ID de máquina única del sistema local que se establece durante la instalación.
- Este parámetro debe ser único, pero cuando el usuario clona la máquina virtual, el “ID de máquina” de la máquina virtual clonada no cambia.
cat /etc/machine-id
-
Para cambiarlo, primero se elimina el machine-id original:
-
Crear el nuevo valor de machine-id:
sudo systemd-machine-id-setup
- Verificar el nuevo machine-id:
cat /etc/machine-id
Acceso seguro usando OpenSSH
-
Para acceder a una máquina virtual remota se usa OpenSSH: se instala el servidor en remoto y en local el cliente compartiendo las claves.
-
Para crear el par de claves SSH públicas y privadas, primero se crean las llaves en nuestro ordenador:
ssh-keygen -t dsa -C "email@ejemplo.com"
- Pulsamos la tecla INTRO cuando pregunta en que fichero salvar la llave, escribimos una clave y ya se tiene el par de llaves creado.
- Luego establecemos una conexión con el otro ordenador, servidor o VM para copiar la llave:
cat ~/.ssh/id_dsa.pub | ssh usuario@ip_servidor 'cat >> .ssh/authorized_keys'
-
Donde “usuario” es nuestro nombre de usuario (o root también) e “ip_servidor” es la IP del servidor, por ejemplo 10.0.0.2.
-
Mayor información la podéis encontrar en:
-
https://help.github.com/articles/generating-an-ssh-key/ (idioma inglés).
Imagen de portada: Foto de Pixabay por foudefoot60 from Pixabay
If you are looking for a trainer to run this course or another training activity (webinar, workshops, bootcamps, etc.) in your organisation, you can find me through the contact page. Thank you very much.
If you liked the article you can help me by donating with cryptocurrencies. Thank you!!!


