User Tools

Site Tools


doc:appunti:prog:qemu_arm

This is an old revision of the document!


Debian armel su QEMU

Debian Squeeze o Wheezy

Dal repository http://people.debian.org/~aurel32/qemu/armel/ si scaricano i file

  • vmlinuz-2.6.32-5-versatile immagine del kernel
  • initrd.img-2.6.32-5-versatile immagine della init RAM disk
  • debian_squeeze_armel_standard.qcow2 immagine del filesystem radice

Si installa il pacchetto qemu-system e quindi di può lanciare l'emulatore con:

qemu-system-arm -M versatileab -m 256 \
    -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile \
    -hda "debian_squeeze_armel_standard.qcow2" -boot order=c \
    -netdev tap,id=hostnet0,ifname=tap72,script=/home/kvm/armel/qemu-ifup \
    -device rtl8139,netdev=hostnet0,id=net0,mac=52:54:00:00:03:72 \
    -nographic -serial telnet::4000,server,nowait,nodelay \
    -append "root=/dev/sda1 console=ttyAMA0"

Il comando avvia un host con architettura versatileab, 256 Mb di RAM, un'interfaccia di rete che viene connessa al device tap72 della macchina ospite, nessuna scheda grafica, una seriale connessa ad un server telnet sulla porta 4000/TCP, la console sulla stessa porta seriale.

Lo script /home/kvm/armel/qemu-ifup contiene le seguenti istruzioni:

#!/bin/sh
/sbin/ifconfig $1 up
/sbin/brctl addif br0 $1

esse provvedono ad abilitare l'interfaccia tap72 e a collegarla al bridge br0 della macchina ospite. Il br0 è collegato anche all'eth0 fisica, in questo modo la macchina emulata è sulla stessa rete locale della macchina ospite.

L'immagine rootfs è una semplice installazione, è stato solo aggiunta una console sulla seriale mettendo in /etc/inittab:

T0:2345:respawn:/sbin/getty -L 115200 ttyAMA0 linux

e consentendo il login dalla seriale aggiungendo ttyAMA0 a /etc/securetty.

Debian Squeeze da installer

Invece di utilizzare un rootfs preconfezionato si può procedere all'installazione da zero, eseguendo l'installer Debian. Soluzione derivata da questo articolo: Debian on an emulated ARM machine.

FIXME: Attenzione! Questa procedura non funziona più perché il sistema corrente qemu-system 1.1.2 non ha un video device predefinito.

Scaricati i seguenti file:

Si tratta dell' immagine kernel e dell'immagine initrd contenuti nell'installer.

L'emulazione QEMU arm non dispone di un boot loader adeguato, l'immagine del kernel e della initrd devono essere presenti sulla macchina ospitante e passati sulla riga di comando a qemu-system-arm.

Dopo aver creato un'immagine disco da 4 Gb con qemu-img, si avvia l'installazione del sistema:

qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.gz 
    -hda hda.img -append "root=/dev/ram"

Al termine dell'installazione si copia il kernel e l'immagine initrd installati nel sistema emulato sul sistema ospite. Quindi per avviare il sistema dall'immagine dell'hard disk emulato:

qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.32-5-versatile -initrd initrd.img-2.6.32-5-versatile \
    -hda hda.img -append "root=/dev/sda1"

Con libvirt

In teoria libvirt dovrebbe supportare QEMU, in pratica la libreria non passa all'emulatore qemu-system-arm i parametri giusti per farlo avviare.

Il file di configurazione .xml che più si avvicina ad una configurazione funzionante è il seguente:

<domain type='kvm'>
  <name>armel</name>
  <uuid>bf9adc6c-f05c-2698-1cf0-278fd86dc19a</uuid>
  <memory>262144</memory>
  <currentMemory>262144</currentMemory>
  <vcpu>1</vcpu>
  <os>
    <type arch='arm' machine='versatileab'>hvm</type>
    <kernel>/home/kvm/armel/vmlinuz-2.6.32-5-versatile</kernel>
    <initrd>/home/kvm/armel/initrd.img-2.6.32-5-versatile</initrd>
    <cmdline>root=/dev/sda1</cmdline>
    <!-- 
    <initrd>/home/kvm/armel/initrd-installer.gz</initrd>
    <cmdline>root=/dev/ram</cmdline>
    -->
    <boot dev='hd'/>
  </os>
  <features>
    <acpi/>
  </features>
  <clock offset='utc'/>
  <on_poweroff>destroy</on_poweroff>
  <on_reboot>restart</on_reboot>
  <on_crash>destroy</on_crash>
  <devices>
    <!-- <emulator>/usr/bin/qemu-system-arm</emulator> -->
    <emulator>/usr/local/bin/qemu-system-arm-wrapper</emulator>
    <disk type='file' device='disk'>
      <source file='/home/kvm/armel/hda.img'/>
      <target dev='hda' bus='scsi'/>
    </disk>
    <interface type='bridge'>
      <model type='virtio'/>
      <mac address='52:54:00:00:03:72'/>
      <source bridge='br0'/>
      <target dev='tap72'/>
      <script path='no'/>
    </interface>
    <graphics type='vnc' port='-1' listen='192.168.3.1'/>
    <serial type="null">
    </serial>
  </devices>
</domain>

Alcune note:

  • Se si tenta di allocare più di 256 Mb di RAM all'emulatore, si ha un segmentation fault (pacchetto Debian quemy-system 0.12.5+dfsg-3).
  • La configurazione di cui sopra la scheda di rete viene posta in modalità bridge, quindi la macchina ospite deve avere l'opportuna scheda br0 configurata, la rete locale fornisce l'indirizzo via DHCP, ecc.

Con questa configurazione vengono passati all'emulatore alcuni parametri errati o inutili, in particolare:

  • -device virtio-net-pci,…

Per filtrare questi parametri ho scritto un piccolo wrapper, che riceve i parametri sbagliati, li corregge e quindi chiama l'emulatore in modo che funzioni. Lo potete scaricare qui: qemu-system-arm-wrapper (togliere l'estensione .txt).

doc/appunti/prog/qemu_arm.1392503484.txt.gz · Last modified: 2014/02/15 23:31 by niccolo