La idea va a ser utilizar Ubuntu JeOS en el host... como ahora no tengo una máquina libre (y menos con virtualización de cpu por hardware), en principio voy a hacerlo sobre mi propio desktop a ver si se banca.
En principio me voy a guiar por las instrucciones en el wiki de ubuntu, el foro y la documentación oficial de virtualización de ubuntu
Tabla de Contenidos
Instalación de algunos paquetes
sudo apt-get install kvm libvirt-bin ubuntu-vm-builder qemu bridge-utils sudo adduser `id -un` libvirtd
Ahora hay que desloguearse y volver a loguearse (para que el usuario figure agregado al grupo libvirtd efectivamente)
Confirmo que tengo acceso... si todo está bien va a pasar esto:
$ virsh -c qemu:///system list Id Name State ---------------------------------- $
Si hay algún problema de permisos, va a pasar esto:
$ virsh -c qemu:///system list libvir: Remote error : Permission denied error: failed to connect to the hypervisor $
(¿no te dije que había que desloguearse y volver a loguearse?)
networking
Al levantar (automáticamente por la instalación) el libvirt-bin, armó automáticamente una nueva interfase de red vnet0 (la red IP creo que la eligió al voleo dentro de RFC1918... ¿o es siempre 192.168.122.0/24?... tampoco sé si la MAC address de esta interfase la inventa o qué). Lo otro que hace es levantar un dnsmasq (que se instaló como dependencia de libvirt-bin) como servidor dhcp en la red de vnet0.
Por lo que veo, esta red (la IP y el rango que brinda el dhcp) están configurados en /etc/libvirt/qemu/networks/default.xml.
El /etc/network/interfaces (antes de tocarlo) es así:
# This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). # The loopback network interface auto lo iface lo inet loopback # The primary network interface auto eth0 #iface eth0 inet dhcp
(esto es una workstation y obtiene su IP por dhcp)
Un ifconfig me muestra lo siguiente:
eth0 Link encap:Ethernet HWaddr 00:21:70:03:85:63
inet addr:192.168.31.179 Bcast:192.168.31.255 Mask:255.255.255.0
inet6 addr: fe80::221:70ff:fe03:8563/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:582796 errors:0 dropped:0 overruns:0 frame:0
TX packets:486490 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:628984075 (599.8 MB) TX bytes:197546144 (188.3 MB)
Memory:fe9e0000-fea00000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:5567 errors:0 dropped:0 overruns:0 frame:0
TX packets:5567 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:576076 (562.5 KB) TX bytes:576076 (562.5 KB)
vnet0 Link encap:Ethernet HWaddr e6:82:ac:c9:02:31
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
inet6 addr: fe80::e482:acff:fec9:231/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:89 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:12900 (12.5 KB)
Apagar dhcdbd (sólo si está)
Ahora... como es un desktop, tengo que apagar y deshabilitar el dhcdbd (en los servers en general no está):
# esto sólo es necesario si está instalado el servicio dhcdbd sudo invoke-rc.d dhcdbd stop sudo update-rc.d -f dhcdbd remove
Crear un bridge
Creamos ahora un bridge en eth0 para que las virtual machines tengan salida al exterior.
Primero, bajo la red:
sudo invoke-rc.d networking stop
Editamos /etc/network/interfaces y agregamos la nueva interface br0... seguimos usando dhcp para esa interfase, ahora queda así todo el archivo:
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
#iface eth0 inet dhcp
# Bridge to virtual machines
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_fd 9
bridge_hello 2
bridge_maxage 12
bridge_stp offLevanto nuevamente la red:
sudo invoke-rc.d networking start
Ahora ifconfig me muestra lo siguiente:
br0 Link encap:Ethernet HWaddr 00:21:70:03:85:63
inet addr:192.168.31.179 Bcast:192.168.31.255 Mask:255.255.255.0
inet6 addr: fe80::221:70ff:fe03:8563/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:114450 errors:0 dropped:0 overruns:0 frame:0
TX packets:97460 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:116706558 (111.3 MB) TX bytes:37166692 (35.4 MB)
eth0 Link encap:Ethernet HWaddr 00:21:70:03:85:63
inet6 addr: fe80::221:70ff:fe03:8563/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:593436 errors:0 dropped:0 overruns:0 frame:0
TX packets:499587 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:632672723 (603.3 MB) TX bytes:206603766 (197.0 MB)
Memory:fe9e0000-fea00000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:5642 errors:0 dropped:0 overruns:0 frame:0
TX packets:5642 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:611216 (596.8 KB) TX bytes:611216 (596.8 KB)
vnet0 Link encap:Ethernet HWaddr e6:82:ac:c9:02:31
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
inet6 addr: fe80::e482:acff:fec9:231/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:97 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 B) TX bytes:14645 (14.3 KB)Notar que la IP ahora la tiene br0 y no eth0.
configurar el template de ubuntu-vm-builder para que use el bridge por default
El template que usa ubuntu-vm-builder es /usr/share/ubuntu-vm-builder/templates/libvirt.tmpl. Tenemos que modificarlo para que use el bridge br0 por default. Abrir el archivo y cambiar:
<interface type='network'>
<mac address='%MAC%'/>
<source network='default'/>
</interface>Por:
<interface type='bridge'>
<mac address='%MAC%'/>
<source network='br0'/>
</interface>O lo podemos hacer automáticamente:
TS=`date +'%Y%m%d_%H%M%S'`
cd /usr/share/ubuntu-vm-builder/templates
sudo mv libvirt.tmpl libvirt.tmpl-BACKUP-${TS}
sed -e s"#<source network='default'/>#<source network='br0'/>#" libvirt.tmpl-BACKUP-${TS} | sudo tee libvirt.tmpl >/dev/null
# dejemos el owner y modo identicos al original
sudo chown --reference=libvirt.tmpl-BACKUP-${TS} libvirt.tmpl
sudo chmod --reference=libvirt.tmpl-BACKUP-${TS} libvirt.tmpl
Directorio para dejar las virtual machines
Como no queremos que las VMs estén en los directorios /home de los usuarios, creamos un directorio en /var y le damos permiso al grupo libvirtd para escribir en ese directorio. Como los usuarios que manejan VMs deben pertenecer a ese grupo, entonces les damos permiso para crearlas también.
De acuerdo a lo que me contestaron en el bug que habla del tema de permisos, esta es la forma razonable de hacerlo (it's not a bug, it's a feature).
# creamos un directorio para nuestras virtual machines
export VMDIR="/var/kvm"
sudo mkdir -pv ${VMDIR}
sudo chown root.libvirtd ${VMDIR}
sudo chmod 775 ${VMDIR}
Creación de una virtual machine
export VMNAME=vm_baby-01
sudo ubuntu-vm-builder kvm hardy --dest ${VMDIR}/${VMNAME} --domain ipark.tv --hostname vm01 --mem 256 --user baby --pass baby --mirror http://br.archive.ubuntu.com/ubuntu/ --components main,universe,restricted,multiverse --addpkg vim --addpkg openssh-server --libvirt qemu:///system
chgrp libvirtd ${VMDIR}/${VMNAME}