xen-create-image
, que automatiza en gran parte esta tarea. El único parámetro obligatorio es --hostname
, que le da un nombre al domU; otras opciones son importantes, pero puede guardarlas en el archivo de configuración /etc/xen-tools/xen-tools.conf
y si no las especifica no generará ningún error. Por lo tanto es importante revisar el contenido de este archivo antes de crear imágenes o utilizar los parámetros adicionales en la invocación de xen-create-image
. Los parámetros importantes a saber incluyen los siguientes:
--memory
para especificar la cantidad de RAM dedicada a este nuevo sistema creado;
--size
y --swap
para definir el tamaño de los «discos virtuales» disponibles al domU;
--debootstrap-cmd
para especificar que orden de debootstrap utilizar. La predeterminada es debootstrap
si debootstrap y cdebootstrap están instalados. En tal caso, generalmente también utilizará la opción --dist
(con el nombre de una distribución como bullseye).
--dhcp
indica que el domU debe obtener su configuración de red a través de DHCP, mientras que --ip
permite definir una dirección IP estática.
--dir
, es crear un archivo en el dom0 para cada dispositivo que se le provee al domU. La alternativa en sistemas que utilizan LVM es la opción --lvm
seguida del nombre de un grupo de volúmenes; xen-create-image
luego creará un nuevo volumen lógico dentro de dicho grupo y éste estará disponible en el domU como un disco duro.
#
xen-create-image --hostname testxen --dhcp --dir /srv/testxen --size=2G --dist=bullseye --role=udev
General Information -------------------- Hostname : testxen Distribution : bullseye Mirror : http://deb.debian.org/debian Partitions : swap 512M (swap) / 2G (ext4) Image type : sparse Memory size : 256M Bootloader : pygrub [...] Logfile produced at: /var/log/xen-tools/testxen.log Installation Summary --------------------- Hostname : testxen Distribution : bullseye MAC Address : 00:16:3E:C2:07:EE IP Address(es) : dynamic SSH Fingerprint : SHA256:K+0QjpGzZOacLZ3jX4gBwp0mCESt5ceN5HCJZSKWS1A (DSA) SSH Fingerprint : SHA256:9PnovvGRuTw6dUcEVzzPKTITO0+3Ki1Gs7wu4ke+4co (ECDSA) SSH Fingerprint : SHA256:X5z84raKBajUkWBQA6MVuanV1OcV2YIeD0NoCLLo90k (ED25519) SSH Fingerprint : SHA256:VXu6l4tsrCoRsXOqAwvgt57sMRj2qArEbOzHeydvV34 (RSA) Root Password : FS7CUxsY3xkusv7EkbT9yae
vif*
, veth*
, peth*
y xenbr0
. El hypervisor Xen los acomoda en la distribución definida bajo el control de las herramientas en espacio de usuario. Debido a que los modelos NAT y de enrutamiento sólo se adaptan a casos particulares sólo discutiremos el modelo de puente.
xend
para integrar las interfaces de red virtuales en un puente de red preexistente (xenbr0
tiene precedencia si existen varios de ellos). Por lo tanto, debemos configurar un puente en /etc/network/interfaces
(lo que requiere que instalemos el paquete bridge-utils, razón por la que lo recomienda el paquete xen-utils) para reemplazar la entrada existente eth0, (hay que tener cuidado y utilizar el nombre correcto del dispositivo de red):
auto xenbr0 iface xenbr0 inet dhcp bridge_ports eth0 bridge_maxwait 0
xl
. Este programa permite varias manipulaciones de los dominios, entre ellas: enumerarlos, iniciarlos y detenerlos. Puede que tenga que aumentar la memoria predeterminada editando la variable memory en el archivo de configuración (en este caso, /etc/xen/testxen.cfg
). Aquí le hemos asignado 1024 (megabytes).
#
xl list
Name ID Mem VCPUs State Time(s) Domain-0 0 3918 2 r----- 35.1 #
xl create /etc/xen/testxen.cfg
Parsing config from /etc/xen/testxen.cfg #
xl list
Name ID Mem VCPUs State Time(s) Domain-0 0 2757 2 r----- 45.2 testxen 3 1024 1 r----- 1.3
testxen
utiliza memoria real - no simulada - de la RAM que, de lo contrario, estaría disponible en el dom0. Debe tener cuidado al construir un servidor para instancias Xen, asegurándose de incluir suficente RAM física.
hvc0
ejecutando xl console
:
#
xl console testxen
[...] Debian GNU/Linux 11 testxen hvc0 testxen login:
xl pause
y xl unpause
. Sepa que aunque un domU pausado no utiliza el procesador, la memoria reservada a él sigue en uso. Puede ser interesante considerar las órdenes xl save
y xl restore
: guardar un domU libera los recursos utilizados por este domU, incluyendo la RAM. Cuando restaure (o resuma) un domU, éste no notará nada a excepción del paso del tiempo. Si un domU está ejecutando cuando se apague el dom0, los scripts empaquetados automáticamente guardarán el domU y lo restaurarán cuando vuelva a iniciar. Esto, por supuesto, tiene los mismos inconvenientes estándar que cuando hiberna un equipo portátil, por ejemplo; en particular, si se suspende por demasiado tiempo al domU, pueden expirar las conexiones de red. Sepa también que, hasta el momento, Xen es incompatible con gran parte de la gestión de energía ACPI, lo que evita que pueda suspender el sistema anfitrión (dom0).
shutdown
) como también desde el dom0, ejecutando xm shutdown
o xl reboot
.
xl
esperan uno o más parámetros, generalmente el nombre de un domU. Se describen en detalle estos parámetros en la página de manual xl(1).
init
, y el conjunto resultante es muy similar a una máquina virtual. El nombre oficial de esta configuración es «contenedor» (de allí LXC: contenedores Linux, «LinuX Containers»), pero una diferencia importante con máquinas virtuales «reales» como aquellas provistas por Xen o KVM es que no hay un segundo núcleo; el contenedor utiliza el mismo núcleo que el sistema anfitrión. Esto tiene tanto ventajas como desventajas: las ventajas incluyen un rendimiento excelente debido a una falta completa de sobrecarga y el hecho de que el núcleo tiene una visión global de todos los procesos que ejecutan en el sistema por lo que la gestión de procesos puede ser más eficiente que si existieran dos núcleos independientes administrando conjuntos de tareas. La mayor de las desventajas es la imposibilidad de ejecutar un núcleo diferente en un contenedor (sea una versión diferente de Linux o directamente un sistema operativo distinto).
/sys/fs/cgroup
. Desde que Debian 8 se ha cambiado a systemd, el cual confía tambien en los grupos de control, eso ya se ha hecho automáticamente en el momento de arranque sin necesidad de configuraciones adicionales.
/etc/network/interfaces
, moviendo la configuración de la interfaz física (por ejemplo, eth0
o enp1s0
) a una interfaz de puente (generalmente br0
) y configurar un enlace entre ellos. Por ejemplo, si el archivo de configuración de la interfaz de red inicialmente contiene elementos como los siguientes:
auto eth0 iface eth0 inet dhcp
auto br0 iface br0 inet dhcp bridge-ports eth0
eth0
así como también las interfaces definidas para los contenedores.
/etc/network/interfaces
se convierte entonces en:
# Interface eth0 is unchanged auto eth0 iface eth0 inet dhcp # Virtual interface auto tap0 iface tap0 inet manual vde2-switch -t tap0 # Bridge for containers auto br0 iface br0 inet static bridge-ports tap0 address 10.0.0.1 netmask 255.255.255.0
br0
.
#
lxc-create -n testlxc -t debian
debootstrap is /usr/sbin/debootstrap Checking cache download in /var/cache/lxc/debian/rootfs-stable-amd64 ... Downloading debian minimal ... I: Retrieving Release I: Retrieving Release.gpg [...] Download complete. Copying rootfs to /var/lib/lxc/testlxc/rootfs... [...] #
/var/cache/lxc
y luego es mudado a su directorio de destino. Esto permite crear contenedores idénticos mucho más rápido ya que luego sólo necesita copiarlo.
--arch
para especificar la arquitectura del sistema a instalar y la opción --release
si desea instalar algo diferente a la versión estable actual de Debian. También puede definir la variable de entorno MIRROR
apuntando a una réplica Debian local.
lxcbr0
, que es utilizado por defecto por todos los contenedores recién creados a través de /etc/lxc/default.conf
y el servicio lxc-net
:
lxc.net.0.type = veth lxc.net.0.link = lxcbr0 lxc.net.0.flags = up
lxcbr0
en el anfitrión. En caso que esta última línea no exista o esté desactivada, se generará una dirección MAC aleatoria. Encontrarás estos ajustes en la configuración del contenedor creado (/var/lib/lxc/testlxc/config
), donde también se especifica la dirección MAC del dispositivo en lxc.net.0.hwaddr
. Si no se encuentra esta última entrada o está desactivada, se generará una dirección MAC aleatoria.
lxc.uts.name = testlxc
lxc-start --daemon --name=testlxc
.
lxc-attach -n testlxc contraseña.
. Ahora podemos acceder con:
#
lxc-console -n testlxc
Connected to tty 1 Type <Ctrl+a q> to exit the console, <Ctrl+a Ctrl+a> to enter Ctrl+a itself Debian GNU/Linux 11 testlxc tty1 testlxc login:
root
Password: Linux testlxc 5.10.0-11-amd64 #1 SMP Debian 5.10.92-1 (2022-01-18) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Wed Mar 9 01:45:21 UTC 2022 on console root@testlxc:~#
ps auxwf
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.2 18964 11464 ? Ss 01:36 0:00 /sbin/init root 45 0.0 0.2 31940 10396 ? Ss 01:37 0:00 /lib/systemd/systemd-journald root 71 0.0 0.1 99800 5724 ? Ssl 01:37 0:00 /sbin/dhclient -4 -v -i -pf /run/dhclient.eth0.pid [..] root 97 0.0 0.1 13276 6980 ? Ss 01:37 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups root 160 0.0 0.0 6276 3928 pts/0 Ss 01:46 0:00 /bin/login -p -- root 169 0.0 0.0 7100 3824 pts/0 S 01:51 0:00 \_ -bash root 172 0.0 0.0 9672 3348 pts/0 R+ 01:51 0:00 \_ ps auxwf root 164 0.0 0.0 5416 2128 pts/1 Ss+ 01:49 0:00 /sbin/agetty -o -p -- \u --noclear [...] root@testlxc:~#
/var/lib/lxc/testlxc/rootfs
). Podemos salir a la consola con Control+a q.
lxc-start
que usa la opción --daemon
por defecto. Podemos interrumpir el contenedor ejecutando lxc-stop --name=testlxc
.
lxc-autostart
el cual inicia los contenedores que tienen la opción lxc.start.auto
configurada a 1). Se puede obtener un control más detallado del orden de inicio con lxc.start.order
y lxc.group
: por defecto, el script de inicialización inicia los contenedores que son parte del grupo onboot
y luego los contenedores que no forman parte de este grupo. En ambos casos el orden dentro de un grupo es definido por la opción lxc.start.order
.
qemu-*
, continúa hablando sobre KVM.
/proc/cpuinfo
.
virtual-manager
es una interfaz gráfica que utiliza libvirt para crear y administrar máquinas virtuales.
apt-get install libvirt-clients libvirt-daemon-system qemu-kvm virtinst virt-manager virt-viewer
. libvirt-daemon-system provee el demonio libvirtd
, que permite la gestión (posiblemente remota) de máquinas virtuales ejecutando en el equipo e inicia las VMs necesarias cuando éste inicia. libvirt-clients provee la herramienta de consola virsh
que permite controlar los equipos administrados con libvirtd
.
virt-install
, que permite crear máquinas virtuales desde una consola. Finalmente, virt-viewer permite acceder a la consola gráfica de una VM.
eth0
y un puente br0
que está conectado a la primera interfaz.
libvirtd
dónde almacenar las imágenes de disco, a menos que la ubicación predeterminada (/var/lib/libvirt/images
) sea adecuada.
#
mkdir /srv/kvm
#
virsh pool-create-as srv-kvm dir --target /srv/kvm
Pool srv-kvm created #
virt-install
. Este programa registra en libvirtd la máquina virtual y sus parámetros y luego la inicia para continuar el proceso de instalación.
#
virt-install --connect qemu:///system --virt-type kvm --name testkvm --memory 2048 --disk /srv/kvm/testkvm.qcow,format=qcow2,size=10 --cdrom /srv/isos/debian-11.2.0-amd64-netinst.iso --network bridge=virbr0 --graphics vnc --os-type linux --os-variant debiantesting
Starting install... Allocating 'testkvm.qcow'
La opción --connect especifica el «hypervisor» a utilizar. En forma de una URL que contiene un sistema de virtualización (xen:// , qemu:// , lxc:// , openvz:// , vbox:// , etc.) y el equipo que alojará la VM (puede dejarlo vacío si es el equipo local). Además, y en el caso de QEMU/KVM, cada usuario puede administrar máquinas virtuales con permisos restringidos, y la ruta de la URL permite diferenciar equipos de «sistema» (/system ) de los demás (/session ).
| |
Debido a que se administra KVM de la misma forma que QEMU, la opción --virt-type kvm permite especificar que se utilice KVM aunque la URL parezca una de QEMU.
| |
La opción --name define un nombre (único) para la máquina virtual.
| |
La opción --memory permite especificar la cantidad de RAM (en MB) que reservar para la máquina virtual.
| |
La opción --disk especifica la ubicación del archivo de imagen que representará el disco duro de nuestra máquina virtual; se creará este archivo, a menos que ya exista, de un tamaño (en GB) especificado por el parámetro size . El parámetro format permite elegir entre las diferentes formas de almacenar el archivo de imagen. El formato predeterminado (cow2 ) permite iniciar con un archivo pequeño que sólo crece cuando la máquina virtual realmente utiliza el espacio.
| |
Utilizamos la opción --cdrom para indicar dónde encontrar el disco óptico a utilizar para la instalación. La ruta puede ser una ruta local para un archivo ISO, una URL donde se puede obtener el archivo o el archivo de dispositivo de un CD-ROM físico (es decir: /dev/cdrom ).
| |
La opción --network especifica cómo se integra la tarjeta de red virtual a la configuración de red del anfitrión. El comportamiento predeterminado (que forzamos explícitamente en nuestro ejemplo) es integrarla en un puente de red preexistente. Si no existe dicho puente, la máquina virtual sólo llegará a la red física mediante NAT, por lo que se asignará una dirección en el rango de subredes privadas (192.168.122.0/24).
La configuración de red por defecto, que contiene la definición de una interfaz puente virbr0 , se puede editar usando virsh net-edit default e iniciarse mediante virsh net-start default si no se ha hecho ya automáticamente durante el arranque del sistema.
| |
--graphics vnc indica que debe estar disponible la consola gráfica a través de VNC. El comportamiento predeterminado para el servidor VNC es sólo escuchar en la interfaz local; si debe ejecutar el cliente VNC en otro equipo, necesitará establecer un túnel SSH (revise la Sección 9.2.1.4, “Creación de túneles cifrados con redirección de puertos”) para poder establecer una conexión. Alternativamente, puede utilizar --graphics vnc,listen=0.0.0.0 para poder acceder al servidor VNC desde todas las interfaces; sepa que si hace esto, realmente debe diseñar su firewall de forma acorde.
| |
Las opciones --os-type y --os-variant permiten optimizar unos pocos parámetros de la máquina virtual basado en características conocidas del sistema operativo mencionado en ellas.
Se puede mostrar la lista completa de tipos de SO con el comando osinfo-query os del paquete libosinfo-bin.
|
virt-viewer
desde cualquier entorno gráfico para abrir la consola gráfica (sepa que le pedirá la contraseña de root del equipo remoto dos veces ya que esta operación necesita dos conexiones SSH):
$
virt-viewer --connect qemu+ssh://root@servidor/system testkvm
root@servidor password: root@servidor's password:
libvirtd
la lista de máquinas virtuales que administra:
#
virsh -c qemu:///system list --all Id Name State ---------------------------------- 8 testkvm shut off
#
virsh -c qemu:///system start testkvm
Domain testkvm started
vncviewer
la pantalla VNC devuelta):
#
virsh -c qemu:///system vncdisplay testkvm
127.0.0.1:0
virsh
encontraremos:
reboot
para reiniciar una máquina virtual;
shutdown
para apagarla de forma segura;
destroy
, para detenerla brutalmente;
suspend
para pausarla;
resume
para continuar su ejecución;
autostart
para activar (o desactivar con la opción --disable
) que se inicie la máquina virtual automáticamente cuando inicia el anfitrión;
undefine
para eliminar todo rastro de la máquina virtual en libvirtd
.