martes, 22 de mayo de 2012

Qemu y Raspberry Pi

Instalando la maquina virtual y emulando el Raspberry Pi (en Qemu)

primeros pasos

Ha llegado la hora de ponernos manos al tema. Como aún le falta un poco de camino a mi Raspberrypi, voy a usar una maquina virtual en Qemu, para ir probando programillas, configuraciones y esas cosas. Al lio

Como soy un poco vago, he seguido las instrucciones de este blog. He cambiado algunas cosas que os pongo a continuación.
En mi caso voy a arrancar Qemu en un equipo con Ubuntu, estos son los pasos que he seguido:

mkdir -p /usr/src/qemu
cd /usr/src/qemu

Y ahora bajamos la versión más estable de Qemu y compilamos:

wget http://wiki.qemu.org/download/qemu-1.0.tar.gz
tar xzvf qemu-1.0.tar.gz
cd qemu-1.0
./configure --target-list=arm-softmmu,arm-linux-user
make
sudo make install

A mi no me molestaron las dependencias, supongo que tengo el 99% de los paquetes disponibles instalados :) Si te da algún problema, no dudes en consultarme.
Lo siguiente es descargar el kernel que vamos a usar para arrancar la imagen del RaspberryPi:

mkdir ~/rpi
cd ~/rpi
wget http://unicorn.drogon.net/rpi/zImage

y ahora bajamos desde este enlace, la imagen de Debian que tan amablemente nos han preparado los chicos del RaspberryPi. Os recomiendo el .torrent, baja en 2 minutos. Descomprimimos:
unzip Debian-descargado.zip
Arrancamos a continuación Qemu y le indicamos los parámetros necesarios:
qemu-system-arm -M versatilepb -cpu arm1176 -m 192 -hda debian6-19-04-2012.img -kernel zImage -append "root=/dev/sda2" -serial stdio -redir tcp:2222::22

Esto nos abre una ventanita nueva, donde veremos como va arrancando nuestro sistema Debian:
Cuando te aburras de esperar (como me pasó a mi), te darás cuenta que en la ventana del Qemu sale un mensaje que pone algo como "siéntete libre de cerrar esta sesión". Solo pasa la primera vez, supongo que despliega el árbol de directorio y hace las primeras configuraciones, cierralo. Ahora si, volvemos a arrancar la máquina virtual, ahora con un par de parámetros extra:
qemu-system-arm -M versatilepb -cpu arm1176 -m 192 -hda debian6-19-04-2012.img -kernel zImage -append "root=/dev/sda2" -serial stdio -redir tcp:2222::22 -nographic -curses
Esperamos unos segundos y ¡¡LISTO!! ya tenemos nuestro sistema Debian tuneado para el RaspberryPi:
Debian GNU/Linux 6.0 raspberrypi ttyAMA0
raspberrypi login: 
El usuario es "pi" y la clave es "raspberry" POR FAVOR cámbiala:
pi@raspberrypi:~$sudo su
root@raspberrypi:/home/pi# passwd pi
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
root@raspberrypi:/home/pi# passwd
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully

Claves cambiadas, ahora vamos a cambiarle el nombre a la maquina:
root@raspberrypi:/home/pi# vim /etc/hostname
bash: vim: command not found
Vaya tela ... instalamos el vim entonces:
root@raspberrypi:/home/pi# apt-get install vim
Y ahora editamos los siguientes archivos, cambiando el nombre al que más nos guste, en mi caso rsspi:
root@raspberrypi:/home/pi# vim /etc/hostname
root@raspberrypi:/home/pi# vim /etc/hosts
Para probar lo que llevamos, reiniciamos:
root@raspberrypi:/home/pi# reboot

Debian GNU/Linux 6.0 rsppi ttyAMA0

rsppi login: 
¡¡Perfecto!!. Para hacer las primeras configuraciones, me gusta llevar controlados (más o menos) los paquetes que tiene instalado, para ver los paquetes instalados en una distribución basada en Debian:
dpkg -l
Y pufffff, queda un poco ridículo tener una pantalla tan grande y que se vea todo en un cachito ¿verdad?, ajustamos:
export COLUMNS=157
export LINES=57
export ROWS=157
reset && clear
Veamos ahora la lista de paquetes instalados:
dpkg -l | grep ^ii
Muchos, demasiados, voy a empezar borrando todos los referentes al servidor x (entorno gráfico), mi RaspberryPi será 100% por consola (aunque seguro que vuelvo a reinstalar la mitad de los paquetes). Para ser veloz como un juanker de las pelis, usaré un poco de magia:
aptitude remove $(echo $(dpkg -l | grep ^ii | grep -e x11 -e xserver | awk '{ print $2 }'))
Seguro que aquí mi amigo Javi lo haría más eficiente, pero ¡oye! es una sola línea.
Bueno pues ya tenemos nuestra imagen limpia, tuneada y lista para hacer las primeras instalaciones. La idea es tener el archivo .img listo para volcar a una tarjeta SD cuando me llegue el Raspberry, a ver si me ahorro un poco de tiempo.
Hasta el siguiente post!.

19 comentarios:

  1. Hola, estoy en la parte del configure, pero me da el siguiente error. ¿Que pasa?

    root@usuario-1011PX:/usr/src/qemu/qemu-1.0# ./configure .target-list=arm-softmmu,arm-linux-user
    ERROR: unknown option .target-list=arm-softmmu,arm-linux-user

    ResponderEliminar
    Respuestas
    1. Hola, gracias por la observación, era un fallo, ya lo he corregido, la línea queda así:
      ./configure -target-list=arm-softmmu,arm-linux-user

      Eliminar
  2. Acabo de probar de nuevo, pero me da de nuevo error. A lo mejor es por mi ordenador si en en el tuyo funxiona.

    root@usuario-1011PX:/usr/src/qemu/qemu-1.0# ./configure -target-list=arm-softmmu,arm-linux-user
    ERROR: unknown option -target-list=arm-softmmu,arm-linux-user

    Gracias de todos modos.

    ResponderEliminar
    Respuestas
    1. jeje, perdona, la linea es:
      ./configure --target-list=arm-softmmu,arm-linux-user

      Eliminar
    2. Gracias por la correccion, ahora por lo menos el comando esta bien, pero me da otro error con zib.

      root@usuario-1011PX:/usr/src/qemu/qemu-1.0# ./configure --target-list=arm-softmmu,arm-linux-user

      Error: zlib check failed
      Make sure to have the zlib libs and headers installed.

      He mirado con aptitude search zlib que me salia, pero me salen un monton, ¿Cual debo instalar?
      Gracias por tu atencion

      Eliminar
    3. necesitamos la libreria de desarrollo (development), buscamos con:
      apt-cache search zlib | grep dev
      y mirando un poco los resultados, la que necesitamos es:
      zlib1g-dev

      Eliminar
    4. Gracias de nuevo. Ahora me dice que compile algo, pero qemu no puede ser porque esto lo ago precisamente para compilarlo.

      root@usuario-1011PX:/usr/src/qemu/qemu-1.0# ./configure --target-list=arm-softmmu,arm-linux-user
      glib-2.0 required to compile QEMU

      Eliminar
    5. bienvenido al apasionante mundo de las compilaciones ;) ahora te esta pidiendo las librerias (lib) de desarrollo (development) de glib-2.0 Las buscamos con:
      apt-cache search glib | grep dev
      y de entre el listado la que queremos es:
      libglib2.0-dev
      Puedes acelerar un poco el tema de las dependencias, si antes de compilar ejecutas:
      apt-get build-dep qemu
      pero es como hacer un poco de "trampas"

      Eliminar
    6. Muchas gracias, ya me funciona.
      Siento haberte hecho perder el tiempo pero es la primera vez que compilo.

      Eliminar
    7. nada hombre, esperemos que no sea la última vez que compilas ;)

      Eliminar
    8. Siento molestarte de nuevo, pero al intentar arrancar qemu me da el siguiente error. Solo he cambiado debian por la imagen que me he descargado de raspbian.

      usuario@usuario-1011PX:~/.rpi$ qemu-system-arm -M versatilepb -cpu arm1176 -m 192 -hda 2012-07-15-wheezy-raspbian.img -kernel zImage -append "root=/dev/sda2" -serial stdio -redir tcp:2222::22
      oss: Could not initialize DAC
      oss: Failed to open `/dev/dsp'
      oss: Reason: No such file or directory
      oss: Could not initialize DAC
      oss: Failed to open `/dev/dsp'
      oss: Reason: No such file or directory
      audio: Failed to create voice `lm4549.out'
      zImage: No such file or directory
      qemu: could not load kernel 'zImage'

      Eliminar
    9. parece que lo que te falla es la localización de los archivos ¿no? zImage es un archivo, tienes que descargarlo según las instrucciones que he puesto en el post. Mira a ver si lo as descargado en otro directorio o algo por el estilo.

      Eliminar
  3. Buenas tardes,

    He seguido tus pasos, solo que la versión de qemu que he instalado es la 1.2.1, no sé si he hecho mal...

    El caso es que, después de instalar todas las dependencias que me ha ido pidiendo, he conseguido compilar qemu.

    El problema lo tengo a la hora de arrancarlo:

    ------------------------------------------------------------------
    # qemu-system-arm -M versatilepb -cpu arm1176 -m 192 -hda 2012-10-28-wheezy-raspbian.img -kernel zImage -append "root=/dev/sda2" -serial stdio -redir tcp:2222::22 -nographic -curses
    Curses support is disabled
    ------------------------------------------------------------------

    Le quito la opción "-curses" y:

    ------------------------------------------------------------------
    # qemu-system-arm -M versatilepb -cpu arm1176 -m 192 -hda 2012-10-28-wheezy-raspbian.img -kernel zImage -append "root=/dev/sda2" -serial stdio -redir tcp:2222::22 -nographic
    chardev: opening backend "stdio" failed
    qemu: could not connect serial device to character backend 'stdio'
    ------------------------------------------------------------------

    Le quito también la opción "-serial stdio" y:

    ------------------------------------------------------------------
    # qemu-system-arm -M versatilepb -cpu arm1176 -m 192 -hda 2012-10-28-wheezy-raspbian.img -kernel zImage -append "root=/dev/sda2" -redir tcp:2222::22 -nographic
    QEMU 1.2.1 monitor - type 'help' for more information
    (qemu) QEMU 1.2.1 monitor - type 'help' for more information
    (qemu)
    oss: Could not initialize DAC
    oss: Failed to open `/dev/dsp'
    oss: Reason: No such file or directory
    oss: Could not initialize DAC
    oss: Failed to open `/dev/dsp'
    oss: Reason: No such file or directory
    audio: Failed to create voice `lm4549.out'
    Uncompressing Linux... done, booting the kernel.
    pflash_write: Unimplemented flash cmd sequence (offset 0000000000000000, wcycle 0x0 cmd 0x0 value 0xf000f0)
    pflash_write: Unimplemented flash cmd sequence (offset 0000000000000000, wcycle 0x0 cmd 0x0 value 0xf0)

    Debian GNU/Linux wheezy/sid rpi ttyAMA0

    rpi login:
    ------------------------------------------------------------------

    Parece que arranca, solo que al ponerle el usuario "pi" y password "raspberry", me ignora y me lo vuelve a pedir.

    El usuario y la password son correctos, ya que esa imagen arrancada desde una Raspberry PI, funciona...

    ¿Me podrías echar una mano con esto?


    Saludos y gracias,

    Ramses

    ResponderEliminar
  4. Un comentario a lo anterior, lo estoy montando sobre un VM OpenVZ con Debian 7.0.1:

    # cat /etc/issue
    Debian GNU/Linux wheezy/sid \n \l


    Saludos,

    Ramses

    ResponderEliminar
  5. Hola, me ha salido todo casi a la primera (he tenido que cambiar el nombre del archivo debian6-19-04-2012.img, porque en la web han colgado una mas actual de nombre "2012-12-16-wheezy-raspbian.zip" y las correspondi4ntes lineas del comando qemu-system-arm), pero me surge el siguiente problema:
    Pero cuando estoy en el paso "Esperamos unos segundos y ¡¡LISTO!! ya tenemos nuestro sistema Debian tuneado para el RaspberryPi:", no me deja entrar con el usuario "pi" y su clave "raspberry", no me deja entrar, he probado tambien con el usuario "root" y clave "root", y tampoco. ¿sabes cual puede ser el problema?

    ResponderEliminar
    Respuestas
    1. hola, tiene que ser usuario pi y clave raspberry. Si no es esa, tiene que venir en alguna documentación adjunta. Si es raspbian, tiene que ser esa, seguro.

      Eliminar
  6. Hola jsbsan,

    Eso es lo mismo que me pasa a mi, y que he comentado más arriba, que no me acepta el usuario y password de acceso, me pide continuamente la password de nuevo.

    No he encontrado solución, por favor, si la encuentras, o alguien tiene alguna idea, que lo postee por aquí...


    Saludos y gracias,

    Ramses

    ResponderEliminar
  7. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  8. Llego tarde pero...

    Bajando la imagen del kernel de zImage del artículo, se me reproducía el error, no me logueaba.

    $ qemu-system-arm -k es -M versatilepb -cpu arm1176 -m 192 -hda 2013-09-25-wheezy-raspbian.img -kernel zImage -append "root=/dev/sda2" -serial stdio -redir tcp:2222::22
    Uncompressing Linux... done, booting the kernel.

    Raspbian GNU/Linux 7 rpi ttyAMA0

    rpi login: pi
    Password:

    Raspbian GNU/Linux 7 rpi ttyAMA0

    rpi login: pi
    Password:

    Raspbian GNU/Linux 7 rpi ttyAMA0

    rpi login:




    Bajando una imagen de kernel de este site: http://xecdesign.com/qemu-emulating-raspberry-pi-the-easy-way/
    me ha funcionado a la primera.

    El link a la imagen del kernel: http://xecdesign.com/downloads/linux-qemu/kernel-qemu

    Lógicamente hay que cambiar el nombre del kernel al pasarlo como parámetro, o se renombra a zImage o se cambia el valor de '-kernel':

    $ qemu-system-arm -k es -M versatilepb -cpu arm1176 -m 192 -hda 2013-09-25-wheezy-raspbian.img -kernel kernel-qemu -append "root=/dev/sda2" -serial stdio -redir tcp:2222::22
    Uncompressing Linux... done, booting the kernel.

    Raspbian GNU/Linux 7 (none) ttyAMA0

    (none) login: pi
    Password:
    Linux (none) 3.2.0 #1 Sun Jan 29 03:14:15 CST 2012 armv6l

    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

    ResponderEliminar