Este artículo explica cómo crear una máquina virtual en un host CentOS 6 totalmente desde línea de comandos (y de manera simple y fácil) utilizando la herramienta de línea de comandos virsh
, parte de la API de virtualización libvirt.
Este tutorial se divide en 3 pasos:
- Crear un disco para la nueva máquina.
- Crear la máquina virtual.
- Conectarse a la máquina virtual mediante VNC, a través de un túnel SSH.
Crear un disco para la máquina virtual
Anteriormente expliqué cómo crear un volumen dentro de un pool libvirt. Sin embargo, muchas veces se recurre a un volumen LVM, por todas las ventajas que esta tecnología introduce.
Este ejemplo se basa en LVM, por ende el primer paso consiste en crear un nuevo volumen lógico. Se dispone de un grupo "vm_group" con los siguientes volúmenes:
[root@centos6 ~]# lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert data vm_group -wi-ao---- 100.00g lvns1 vm_group -wi-ao---- 2.00g lvns2 vm_group -wi-ao---- 2.00g lvserver01 vm_group -wi-ao---- 20.00g lvserver02 vm_group -wi-a----- 2.00g
Para crear un nuevo volumen, se especifica el tamaño (10 GB), nombre ("lvserver03") y grupo destino ("vm_group"):
[root@centos6 ~]# lvcreate -L 10G -n lvserver03 vm_group Logical volume "lvserver03" created
Es posible verificar listando nuevamente los volúmenes disponibles:
[root@centos6 ~]# lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert data vm_group -wi-ao---- 100.00g lvns1 vm_group -wi-ao---- 2.00g lvns2 vm_group -wi-ao---- 2.00g lvserver01 vm_group -wi-ao---- 20.00g lvserver02 vm_group -wi-a----- 2.00g lvserver03 vm_group -wi-a----- 10.00g
Crear la máquina virtual
Contando con un disco, sólo resta determinar la ubicación del disco de instalación y las redes disponibles para conectar la máquina.
En el directorio /data/ISO/
se encuentra una imagen de instalación de Debian 7 (debian-7.7.0-amd64-netinst.iso
):
[root@centos6 ~]# ll /data/ISO/ total 8.9G -rw------- 1 root root 8.0G Jan 8 10:21 template-debian7.raw -rw-r--r-- 1 root root 222M Oct 18 10:06 debian-7.7.0-amd64-netinst.iso -rwxr-xr-x 1 qemu qemu 611M Nov 4 2013 wxp.iso -rwxr-xr-x 1 root root 38 Nov 4 2013 wxp.txt
Utilizando virsh
es posible listar las redes disponibles en el host:
[root@centos6 ~]# virsh net-list Name State Autostart Persistent -------------------------------------------------- default active yes yes
La forma más práctica y rápida consiste en crear una máquina virtual a partir de una definición en un archivo XML. Más fáccil aún es tomar una definición de una máquina virtual previa, y hacer las modificaciones necesarias.
En el directorio /etc/libvirt/qemu/
se encuentran las definiciones de máquinas virtuales existentes. Por ejemplo, tomo la definición de la máquina "server03" (el nombre de archivo coincide con el nombre del dominio/máquina):
[root@centos6 ~]# cp /etc/libvirt/qemu/server02.xml server03.xml
Editar la copia con cualquier editor de línea de comandos:
[root@centos6 ~]# nano server03.xml
Modificar el nombre, borrar el uuid, cambiar la ruta a la imagen de disco, "insertar" la imagen ISO del CD de instalación y borrar la MAC de todas las placas de red presentes. A su vez, eliminar cualquier dispositivo que no sea necesario.
[root@centos6 ~]# cat server03.xml <domain type='kvm'> <name>server03</name> <memory unit='KiB'>524288</memory> <currentMemory unit='KiB'>524288</currentMemory> <vcpu placement='static'>1</vcpu> <os> <type arch='x86_64' machine='debian'>hvm</type> <boot dev='hd'/> </os> <features> <acpi/> <apic/> <pae/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <devices> <emulator>/usr/libexec/qemu-kvm</emulator> <disk type='block' device='disk'> <driver name='qemu' type='raw' cache='none'/> <source dev='/dev/vm_group/lvserver03'/> <target dev='hda' bus='ide'/> <address type='drive' controller='0' bus='0' target='0' unit='0'/> </disk> <disk type='file' device='cdrom'> <driver name='qemu' type='raw'/> <target dev='hdc' bus='ide'/> <readonly/> <address type='drive' controller='0' bus='1' target='0' unit='0'/> <source file='/data/ISO/debian-7.7.0-amd64-netinst.iso'/> </disk> <controller type='usb' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x2'/> </controller> <controller type='ide' index='0'> <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x1'/> </controller> <interface type='bridge'> <source bridge='br0'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface> <serial type='pty'> <target port='0'/> </serial> <console type='pty'> <target type='serial' port='0'/> </console> <input type='mouse' bus='ps2'/> <graphics type='vnc' port='6600' autoport='yes' listen='127.0.0.1'> <listen type='address' address='127.0.0.1'/> </graphics> <video> <model type='cirrus' vram='9216' heads='1'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x02' function='0x0'/> </video> <memballoon model='virtio'> <address type='pci' domain='0x0000' bus='0x00' slot='0x04' function='0x0'/> </memballoon> </devices> </domain>
Luego se define (crea) la máquina virtual a partir de este archivo mediante el subcomando define
:
[root@centos6 ~]# virsh define server03.xml Domain server03 defined from server03.xml
De esta forma se evita lidiar con parámetros de línea de comandos, ya que la sintaxis XML es mucho más descriptiva e intuitiva.
A continuación, listar las máquinas virtuales presentes en el host:
[root@centos6 ~]# virsh list --all Id Name State ---------------------------------------------------- 1 ns2 running 2 server01 running 3 ns1 running - server02 shut off - server03 shut off - wxp shut off
Iniciar la nueva máquina virtual:
[root@centos6 ~]# virsh start server03 Domain server03 started
Conectarse a la máquina virtual
El último paso consiste en conectarse a la máquina virtual, desde una estación de trabajo con escritorio, a fin de comenzar la instalación del sistema operativo en el guest. Desde un host GNU/Linux o FreeBSD, crear un túnel SSH para acceder al puerto VNC:
emi@hal9000:~ % ssh -L 6600:127.0.0.1:6600 -p 2222 root@host36.linuxito.com
Utilizar un túnel SSH (en lugar de conectarse directamente al puerto VNC correspondiente al display de la máquina virtual destino) permite mejorar la seguridad y evitar la necesidad de abrir puertos adicionales en el firewall del host (sólo basta con que el puerto correspondiente al servidor SSH del host esté abierto). Así, todo el tráfico relacionado a la gestión de todas las máquinas virtuales pasa a través de un único puerto.
Luego, con un cliente VNC (por ejemplo krdc
), conectarse a localhost:6600
y proceder con la instalación.
Para obtener ayuda con virsh, ejecutar:
virsh help virsh help vol-info virsh help vol-create-as
Referencias
- Red Hat Enterprise Linux - Virtualization Guide - Chapter 20. Managing guests with virsh
- Virsh Command Reference