raspberry linux linux-kernel raspberry-pi raspbian qemu

linux - qemu debian raspberry pi



¿Cómo emular Raspberry Pi Raspbian con QEMU? (4)

Necesita un núcleo modificado para ejecutarse en QEMU, porque el hardware de la placa Raspberry PI no está disponible en QEMU. Es por eso que tu primer acercamiento falló.

Su segundo enfoque utiliza un kernel correctamente parcheado para ejecutarse en la placa versátil (compatible con QEMU), por lo que es bueno, pero el kernel 3.x es demasiado viejo para un Raspbian moderno. En principio, su último enfoque debería haber funcionado.

Recomiendo this guía actualizada (febrero de 2017), la probé con un kernel 4.4 y funciona de inmediato.

qemu-system-arm -kernel $KERNEL -cpu arm1176 -m 256 -M versatilepb -net nic,macaddr=$MAC -net tap -no-reboot -append "root=/dev/sda2 panic=1" -drive format=raw,file=$IMG

Tuve que usar format=raw,file=$IMG opción para evitar una advertencia QEMU.

No necesita comentar /etc/fstab , puede agregar a /etc/udev/rules.d/90-qemu.rules

KERNEL=="sda", SYMLINK+="mmcblk0" KERNEL=="sda?", SYMLINK+="mmcblk0p%n" KERNEL=="sda2", SYMLINK+="root"

Además, la cosa ld.so.preload es antigua y ya no se aplica

El script incluido en la guía mencionada hace todo esto por usted, y también proporciona acceso de red a su raspbian compartiendo su interfaz de red con raspbian.

Estoy intentando emular una Raspberry Pi con el sistema operativo Raspian usando QEMU. He intentado varios enfoques descritos en internet pero sin ningún éxito.

Me di cuenta de que necesito parchear un Kernel de Linux que se ajuste al sistema operativo deseado. En mi caso, elegí Rasbian Lite con Kernel 4.4:

wget https://downloads.raspberrypi.org/raspbian_lite/images/raspbian_lite-2016-05-31/2016-05-27-raspbian-jessie-lite.zip unzip 2016-05-27-raspbian-jessie-lite.zip rm 2016-05-27-raspbian-jessie-lite.zip

A continuación, cargo un Kernel de https://www.kernel.org/ :

wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.16.tar.gz tar -xzf linux-4.4.16.tar.gz rm linux-4.4.16.tar.gz

Ahora cruzemos compilando el Kernel:

export ARCH=arm export CROSS_COMPILE=arm-linux-gnueabi- cd linux-4.4.16 make vexpress_defconfig make all cd ..

Ahora puedo copiar la imagen de arranque, que es una imagen de kernel comprimida que se extrae automáticamente en la RAM, a mi espacio de trabajo:

cp linux-4.4.16/arch/arm/boot/zImage zImage

y ejecuta QEMU

qemu-system-arm -kernel zImage -M vexpress-a9 -m 1024 -cpu cortex-a9 -no-reboot -serial stdio -hda 016-05-27-raspbian-jessie-lite.img -append "root=/dev/sda2 rootfstype=ext4"

Pero todo lo que veo es una ventana QEMU llena de negro. :(

Creo que el problema es conseguir el Kernel correcto. Copiar algunos de los Kernels de Internet nunca llevó al éxito porque no son aptos para el sistema operativo.

¿Cómo puedo crear / parchear un Kernel que se ajuste al sistema operativo (sin descargar uno existente) y cómo ejecutar QEMU correctamente?

Gracias por adelantado
Alex

2º enfoque

kernel-qemu un kernel-qemu desde aquí https://www.dropbox.com/s/g8u93xblz1v1ly0/kernel-qemu?dl=0 y ejecuto QEMU con él:

qemu-system-arm -kernel kernel-qemu -cpu arm1176 -m 256 -M versatilepb -no-reboot -serial stdio -append "root=/dev/sda2" -hda 2016-05-27-raspbian-jessie-lite.img

Esto me trae la siguiente salida: Y tiene sentido para mí porque el Kernel es 3.10.25 y más antiguo que el Raspbian Jessie con Kernel 4.4.16.

Con el qemu-kernel de https://github.com/dhruvvyas90/qemu-rpi-kernel/blob/master/kernel-qemu-4.4.12-jessie

qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img

Obtuve este resultado similar:

Un nuevo intento con un nuevo kernel-qemu 4.4.16:

  1. Copie build-kernel-qemu desde https://github.com/dhruvvyas90/qemu-rpi-kernel/tree/master/tools y agregue la siguiente línea para verificar la versión para Kernel 4.4.16:

    git checkout b05965f284db3e086022f4e318e46cb5bffb1376

  2. Ejecute build-kernel-qemu para compilar el kernel

    sh build-kernel-qemu

  3. Ejecutar QEMU

    qemu-system-arm -kernel kernel-qemu -m 256 -M versatilepb -serial stdio -append "root=/dev/sda2 rootfstype=ext4 rw" -hda 2016-05-27-raspbian-jessie-lite.img

    El resultado:


Tuve un problema similar con una imagen personalizada de Ubuntu. También apliqué las modificaciones como se describe en la respuesta de @Michael Connors, luego veo el arranque del sistema.

Puede agregar lo siguiente en -append="" para ver qué sucede en su caso:

qemu-system-arm ... -serial stdio -append="... console=ttyAMA0,115200 loglevel=8"


Debes expandir el archivo de imagen de Raspbian antes de comenzar

Monte el archivo de imagen de Raspbian con kpartx (puede que tenga que instalar kpartx)

$ sudo kpartx -av your-image.img add map loop0p1 (252:5): 0 117187 linear /dev/loop0 1 add map loop0p2 (252:6): 0 3493888 linear /dev/loop0 118784 $ sudo mount /dev/mapper/loop0p2 /mnt/img1 $ cd /mnt/img1

Modifique el archivo / etc / fstab y comente los montajes MMCBLK

$ sudo nano etc/fstab proc /proc proc defaults 0 0 #/dev/mmcblk0p1 /boot vfat defaults 0 2 #/dev/mmcblk0p2 / ext4 defaults,noatime 0 1 # a swapfile is not a swap partition, no line here # use dphys-swapfile swap[on|off] for that

Modifique /etc/ld.so.preload y comente las líneas ...

$ sudo nano etc/ld.so.preload #/usr/lib/arm-linux-gnueabihf/libarmmem.so

Desmonta y destruye los bucles de kpartx.

$ sudo umount /mnt/img1 $ sudo kpartx -d your-image.img

Consigue el kernel de Qemu haciendo coincidir la imagen de Raspbian aquí ...

https://github.com/dhruvvyas90/qemu-rpi-kernel

Utilicé este comando para emular con éxito a Raspbian Jessie

qemu-system-arm -kernel kernel-qemu-4.4.12-jessie -cpu arm1176 -m 256 -M versatilepb / -no-reboot -serial stdio -append "root=/dev/sda2 panic=1 rootfstype=ext4 rw" / -redir tcp:5022::22 / -hda 2016-05-27-raspbian-jessie-lite.img


Ubuntu 16.04 host, QEMU 2.9.0 -M raspi2, Raspbian 2016-05-27, kernel de vainilla

Ventajas:

  • Con -M raspi2 , podemos usar el kernel de vainilla, por lo que el sistema es más representativo.

Limitaciones:

  • -M raspi2 se agregó en QEMU 2.6.0, y Ubuntu 16.04 solo tiene QEMU 2.5.0, así que tenemos que compilar QEMU desde la fuente. Pero esto no es difícil.
  • La GUI muestra pero no responde al mouse / teclado, probado tanto en SDL como en VNC. Pero CLI funciona perfectamente sin embargo. Por lo tanto, también puede usar la imagen Lite que tiene GUI por ahora.
  • sin redes

Pasos:

  1. Compilar QEMU 2.9.0 desde la fuente:

    sudo apt-get build-dep qemu-system-arm git clone --recursive git://git.qemu-project.org/qemu.git cd qemu git checkout v2.9.0 ./configure make `nproc`

  2. Descarga la imagen y extrae el kernel y dts de ella:

    1. Descarga la imagen y descomprime:

      wget http://downloads.raspberrypi.org/raspbian/images/raspbian-2016-05-31/2016-05-27-raspbian-jessie.zip unzip 2016-05-27-raspbian-jessie.zip

    2. Monte la segunda imagen de la partición. La forma más fácil es:

      sudo losetup -f --show -P 2016-05-27-raspbian-jessie.img

      Esto solo funciona con la última losetup de losetup en Ubuntu 16.04, otros métodos en: https://askubuntu.com/questions/69363/mount-single-partition-from-image-of-entire-disk-device/496576#496576

      Esto imprime un dispositivo de bucle, por ejemplo:

      /dev/loop0

      así lo hacemos

      sudo mkdir /mnt/rpi sudo mount /dev/loop0p1 /mnt/rpi cp /mnt/rpi/kernel7.img bcm2709-rpi-2-b.dtb . sudo umount /mnt/rpi sudo losetup -d /dev/loop0

  3. Correr:

    ./arm-softmmu/qemu-system-arm / -M raspi2 / -append "rw earlyprintk loglevel=8 console=ttyAMA0,115200 dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2" / -cpu arm1176 / -dtb bcm2709-rpi-2-b.dtb / -sd 2016-05-27-raspbian-jessie.img / -kernel kernel7.img / -m 1G / -smp 4 / -serial stdio / ;

Luego puede iniciar sesión en el terminal que se muestra en su terminal host.

[fallado] Ubuntu 17.04, QEMU 2.8.0 -M raspi2, Raspbian 2016-05-27, kernel de vainilla

En este nuevo Ubuntu, QEMU 2.8.0 es el valor predeterminado, por lo que no necesitamos compilar QEMU desde la fuente para -M raspi2 . Sin embargo, 2.8.0 se bloquea en el arranque después del mensaje:

Console: switching to colour frame buffer device 100x30

Esto -M raspi2 para mostrar cuán inestable es -M raspi2 todavía.

[fallado] Ubuntu 16.04, QEMU 2.9.0 -M raspi2, Raspbian 2017-08-16, núcleo de vainilla

En esta imagen más reciente, utilizando el mismo método para 2016-05-27, el kernel entra en pánico al inicio con:

Please append a correct "root=" boot option; here are the available partitions: ... [ 4.138114] ---[ end Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

bztsrc/raspi3-tutorial RPI3 bare metal en QEMU

https://github.com/bztsrc/raspi3-tutorial es un buen conjunto de ejemplos que solo funcionan en QEMU, iniciando ultraquick en: https://raspberrypi.stackexchange.com/questions/34733/how-to-do-qemu-emulation-for-bare-metal-raspberry-pi-images/85135#85135