XMLTagsEditHistoryDiscussion

Also in English.

Resumen:

En este documento buscamos explicar la forma de correr QEMU como un usuario normal (no como root). Este documento puede ser útil para otras distribuciones de GNU/Linux.

  1. Instalación de los programas que necesitamos
  2. Creación de la partición
  3. Ejecución de qemu
  4. Ejecutar qemu y ponerlo en la red
    1. tun/tap
      1. Uso de un bridge
  5. Problemas
    1. Sin memoria
  6. Enlaces

Instalación de los programas que necesitamos

QEMU
 apt-get install qemu
tunctl
 apt-get install uml-utilities
bridge-utils
 apt-get install bridge-utils

Se recomienda instalar kqemu, un módulo libre (GPL) para acelerar QEMU. Para instalarlo, se necesitan las cabeceras del kernel.

linux-kernel-headers
 apt-get install linux-kernel-headers
kqemu
 apt-get install kqemu-source
 cd /usr/src
 m-a prepare
 m-a a-i kqemu

Note que es posible que la versión de Debian que tiene instalada traiga módulos precompilados. Busque paquetes con la cadena "kqemu-modules".

Creación de la partición

Este comando creará un archivo disperso que qemu usará.

 qemu-img create image.img 4300M

El tamaño del sistema de ficheros depende de lo que usted prefiera. Nos gustó la idea de poder hacer backups en DVD.

Note que si desea hacer backups de la imagen recién creada (digamos, justo después de que ha instalado el SO), puede aprovechar que el sistema de ficheros está en un archivo disperso, y usar la opción {-S} del programa tar, que permite hacer archivos más pequeños de esta forma.

tar cjSf backup-image.tar.bz2 image.img

Por ejemplo, el backup de un sistema de ficheros de 4.4G ocupaba sólo 679M. El backup se hizo después de instalar Win2k SP4 y los últimos parches.

Ejecución de qemu

Antes de correr qemu, es probable que usted necesite ejecutar los siguientes comandos con privilegios de root:

 modprobe tun # Para poner qemu en red
 chmod 666 /dev/net/tun # Darle acceso a todos los usuarios
   
 modprobe kqemu # Se debería usar el módulo de aceleración
 mknod /dev/kqemu c 250 0
 /bin/chmod 666 /dev/kqemu  # Darle acceso a todos los usuarios

Es bueno saber que también puede usar sudo para correr modprobe. No nos gusta esa forma. Si va a correr qemu con frecuencia, es mejor adicionar las líneas que están arriba a los scripts de inicio.

Necesitaremos que el usuario joe ejecute ifconfig (no hablemos de seguridad ahora), así que editamos {/etc/sudoers} para que contenga las siguientes líneas:

root    ALL=(ALL) ALL
Cmnd_Alias      QEMU=/sbin/ifconfig
# Especificación de los permisos del usuario
root    ALL=(ALL) ALL
joe     ALL=NOPASSWD: QEMU

Ejecutar qemu y ponerlo en la red

tun/tap

Necesita que el usuario joe use tap0. Es probable que necesite adicionar las siguientes líneas a los scrips de arranque.

# tunctl -d tap0
 Set 'tap0' nonpersistent
# tunctl -u joe -t tap0
 Set 'tap0' persistent and owned by uid 1000

Hacer un archivo scripts/up.sh, con el siguiente contenido:

 #!/bin/sh
 sudo /sbin/ifconfig $1 192.168.2.1

Y ahora podemos ejecutar qemu:

 qemu -m 350 -net nic -net nic,vlan=0 \
                      -net tap,vlan=0,ifname=tap0,script=scripts/up.sh \
                      -hda image.img -localtime -cdrom /dev/cdrom

Usamos -cdrom /dev/cdrom para poder instalar un sistema operativo desde CD/DVD.

Para tener acceso a la red local o a Internet:

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.0.0.2  # Use su IP externa acá
echo "1" > /proc/sys/net/ipv4/ip_forward

Uso de un bridge

En la página debian-bridge-es explicamos cómo se puede hacer un bridge en GNU/Linux.

Nos gustó el método descrito en esta página para pegar a qemu a un bridge. De esta forma, la máquina virtual podrá ser accedida directamente desde la red local por otros computadores.

En el archivo /etc/network/interfaces no usamos eth0 como interfaz externa. En su lugar, usamos un bridge.

 auto br0
 iface br0 inet static
 address 192.168.1.10
 network 192.168.1.0
 netmask 255.255.255.0
 broadcast 192.168.1.255
 gateway 192.168.1.1
 bridge_ports eth0
 bridge_fd 9
 bridge_hello 2
 bridge_maxage 12
 bridge_stp off

En el archivo /etc/sudoers tenemos las siguientes líneas (No hablemos de seguridad ahora):

Cmnd_Alias  QEMU=/sbin/ifconfig,/usr/sbin/brctl
  
# Especificación de los privilegios del usuario
root    ALL=(ALL) ALL
joe     ALL=NOPASSWD: QEMU

Corremos qemu con este script:

 #!/bin/sh

 # Necesitará la opción -win2k-hack si tiene que instalar Win2k.
 # Después de la instalación, debería removerla.

 # Note que estamos usando 900MB de RAM para la máquina virtual.
 # Debe modificar esto de acuerdo a sus necesidades.
 ARGS="-hda image.img -boot c -cdrom /dev/cdrom  -net nic,vlan=0 -net tap,vlan=0,ifname=tap0,script=./qemu-ifup -m 900 -localtime"

 echo "Iniciando QEMU con..."
 echo $ARGS
 echo "...."
 exec qemu $ARGS

El script qemu-ifup que usamos:

#!/bin/sh

echo "Ejecutando qemu-ifup"
echo "Subiendo $1 en modo bridge..."
sudo /sbin/ifconfig $1 0.0.0.0 promisc up
echo "adicionando $1 to br0..."
sudo /usr/sbin/brctl addif br0 $1
sleep 2

Tal vez quiera adicionar las siguientes líneas a sus scripts de inicio.

 echo "Cargando el módulo kqemu ..."
 modprobe kqemu

 sudo mknod /dev/kqemu c 250 0
 sudo chmod 766 /dev/kqemu
 /usr/sbin/tunctl -u joe

Problemas

Sin memoria

Todavía no sabemos si es necesario incrementar el valor de max_map_count. Eso se necesita en User Mode Linux para que un proceso dentro de la máquina virtual pueda apartar más de 256MB de memoria RAM.

echo 262144 > /proc/sys/vm/max_map_count

TODO: ¿Es esto cierto también para qemu?

Enlaces

Last update: 2007-09-10 (Rev 12932)

svnwiki $Rev: 12966 $