Linux com a sistema virtualitzat

Linux és molt versatil, i una de les seves qualitats més importants és allotjar altres sistemes o aplicacions en entorns dins seu, de manera aïllada i segura. Això és en el que ens centrarem avui.

La virtualització és una tecnologia en la que, mitjançant un software (hipervisor), s’emula un sistema informàtic. L’hipervisor és el responsable d’administrar els recursos del hardware que poden ser utilitzats per les màquines virtuals.

Les màquines virtuals emulen aspectes d’un ordinador físic en software, com el BIOS o els drivers. Normalment utilitzen com a disc arxius individuals, i tenen accès a CPU i memòria a través de l’hipervisor.

Els hipervisors mé comuns a Linux són:

  • Tipus 1 (no necessita un sistema operatiu)
  • Codi obert
  • Tipus 1 i 2 Necessita Linux per funcionar però pot integrar-se amb un Linux en execució
  • Utilitza el dimoni libvirt
  • Tipus 2
  • Compatible amb Mac, Windows i Linux

Hi ha tres tipus de màquines virtuals:

  • Totalment virtualitzades (fully virtualized)

    En aquest tipus, totes les instruccions que ha d’executar un sistema operatiu les ha de poder executar la màquina. Una màquina virtual totalment virtualitzada no sap que és una màquina virtual. Requereix activar extensions de CPU (en Intel, Intel VT-x i en AMD, AMD-V).

  • Paravirtualitzat (paravirtualized)

    Un guest paravirtualitzat (PVM) és on la màquina sap que és una instància de màquina virtual. Aquest tipus de màquina utilitza un kernel modificat i drivers especials que ajudaran al guest a utilitzar els recursos de software i hardware del sistema. Sol tenir millor rendiment que les màquines totalment virtualitzades, degut als controladors de software.

  • Híbrid (Hybrid)

    Aquest és una combinació dels tipus mencionats: no es modifica el sistema operatiu guest però rep un rendiment E/S pràcticament nadiu, gràcies als drivers paravirtualitzats en sistema.

Les plataformes de virtualització solen oferir controladors guest empaquetats per sistemes virtualitzats. Per exemple, KVM utilitza controladors de Virtio i VirtualBox, Guest Additions.

Una màquina virtual sol consistir d’un grup d’arxius, amb un arxiu XML que defineix la màquina (hardware, connectivitat de xarxa,…) i un arxiu d’imatge de disc dur amb la instal·lació del sistema i el seu software.

Un arxiu d’una màquina virtual en xml seria el següent:

bash

ls /etc/libvirt/qemu
total 24
drwxr-xr-x 3 root root 4096 Oct 29 17:48 networks
-rw------- 1 root root 5667 Jun 29 17:17 rhel8.0.xml

En aquesta ruta, qemu fa referència al software que proporciona el projecte QEMU eprquè l’hipervisor emuli hardware (dispositius de xarxa, accès a la CPU i més).

També hi ha un directori networks que conté arxius XML per definir les xarxes. En aquest directori hi ha les xarxes que tenim creades. Un exemple és la xarxa que crea per defecte, anomenada default:

xml

<network>
<name>default</name>
<uuid>55ab064f-62f8-49d3-8d25-8ef36a524344</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:b8:e0:15'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>

(Exemple extret dels apunts d’LPIC.)

Podem veure que conté la informació bàsica (el nom, un identificador únic, mode NAT, bridge d’interfícies al que pertany, rang DHCP,…).

Un exemple d’xml de màquina virtual (que no afegirè perquè és molt llarg) té una sintaxi xml com les xarxes, i conté dades bàsiques com el sistema operatiu, quantitat de memòria RAM, configuracions de CPU, disc, tipus de controladors, interfícies de xarxa,…

Les imatges del disc dur per defectes van a /var/lib/libvirt/images. Principalment hi ha dos tipus d’imatges:

  • COW (Copy-on-write)

    És un mètode pel que la imatge de disc es crea amb un límit de mida predefinit. La mida de la imatge del disc és dinàmica, pel que es va engrandint segons la mida que ocupa la màquina. El format de disc és qcow2 (QEMU COW).

  • RAW

    Un tipus de disc raw té tot l’espai preassignat, pel que dóna més rendiment (però ocupa molt més també).

Hi ha altres plataformes de virtualització que permeten utilitzar discos físics, xarxa d’emmagatzematge (SAN) o dispositius connectats en xarxa (NAS) per escriure les seves dades, i l’hipervisor s’encarrega de realitzar el seguiment de les ubicacions d’emmagatzematge.

Com que les màquines virtuals són arxius que s’executen en un hipervisor, és fàcil crear plantilles per certs casos d’implementació específics. Sovint una màquina virtual tindrà una instal·lació bàsica del sistema i alguns ajustos preconfigurats.

Aquesta plantilla podria copiar-se a un guest, canviant el nom i amb una nova MAC, i es podrien realitzar modificacions segons l’ús.

Moltes instal·lacions Linux utilitzen un número d’identificació de màquina general al moment de la instal·lació (D-Bus machine ID). Si una màquina virtual es clona per ser utilitzada com a plantilla, s’ha de crear un nou D-Bus machine ID perquè els recursos del sistema de l’hipervisor es dirigeixin a la màquina correctament.

Per validar un D-Bus machine ID per la màquina en execució:

bash

$ dbus--uuidgen --ensure

Si no retorna res és que hi ha una ID. Per veure-la:

bash

$ dbus-uuidgen --get

I ens retornarà la ID de la màquina.

No hi ha dos sistemes Linux executats pel mateix hipervisro que tinguin la mateixa D-Bus machine ID.

Aquestes ID es troben a /var/lib/dbus/machine-id, linkades simbòlicament a /etc/machine-id. Si dues màquines tenen el mateix, es recomana fer:

bash

$ sudo rm -f /etc/machine-id
$ sudo dbus-uuidgen --ensure=/etc/machine-id

Hi ha molts proveïdors d’IaaS (Infrastructure as a service) disponibles que permeten implementar màquines virtuals basades en Linux. Alguns dels elements claus a tenir en compte són:

  • Instàncies de computació

    Sovint cobraran taxes d’ús basades en “instàncies de computació” i temps de CPU utilitzat per la infraestructura.

  • Bloc d’emmagatzematge

    Els proveïdors tenen diversos nivells d’emmagatzematge en bloc disponibles per utilitzar. Algunes opcions són emmagatzematge de xarxa basat en web, mentre que altres es relacionen amb l’emmagatzematge extern per una màquina virtual aprovisionada al núvol.

  • Xarxes

    Molts proveïdors solen donar opcions per implementar i configurar xarxes, subxarxes, configuracions de firewall i, inclús, DNS.

Se sol accedir per SSH, pel que s’haurien de compartir les claus per accés remot. Per fer això, el client (usuari) faria:

bash

$ ssh-keygen

I seguir les passes. Així creariem un parell de claus SSH (pública i privada). La privada la deixariem al sistema local (~/.ssh) i la pública al remot:

bash

$ shh-copy-id <public_key> user@cloud-server

Aquesta comanda copiarà la clau pública a ~/.ssh/authorized_keys del sistema remot i donarà els permisos adequats a l’arxiu.

Els permisos per claus SSH han de ser 0600 per claus privades i 0644 per públiques.

Una eina útil per simplificar desplegaments al núvol és cloud-init que, amb els arxius de configuració associats i la imatge de la màquina virtual predefinida, permet implementar un sistema Linux en una gran quantitat de proveïdors IaaS. Amb arxius YAML es pot preconfigurar configuracions de xarxa, seleccions de paquets, configuracions de claus SSH,…

Els contenidors són semblants a les màquines virtuals: proporcionen un entorn aïllat per implementar una aplicació. La diferència principal és que, mentre en una màquina virtual s’emula un sistema sencer, en un contenidor només s’emula el software necessari per executar una aplicació.

Els contenidors donen més flexibilitat que una màquina virtual i poden migrar d’un hipervisor a un altre sense apagar-se. També possibiliten implementar noves versions d’una aplicació amb una versió existent, i a mesura que els usuaris tanquin la seva sessió, el software orquestrador de contenidors eliminarà la versió vella perquè tothom utilitzi la nova, reduint temps d’inactivitat.

Els contenidors utilitzen control groups (cgroups) dins el kernel de Linux. El cgroup és una manera de particionar el temps del processador i l’ample de banda de disc i xarxa per una aplicació individual. Amb això, un administrador pot establir límits de recursos del sistema en un conjunt d’aplicacions dins un mateix cgroup.

I fins aquí el post d’avui. Si t’ha semblat útil pots deixar un comentari i compartir-lo. Ens veiem al següent!