====== Debian armel su QEMU ====== La necessità è quella di avere un box Arm dove fare compilazione nativa di pacchetti Debian. Su alcune architetture (LaCie, QNAP, ecc.) potrebbe essere troppo pesante o impossibile effettuare la compilazione. Anche l'ipotesi di cross-compilazione è sicuramente più complessa. ===== 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 versatilepb -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::4072,server,nowait,nodelay \ -append "root=/dev/sda1 console=ttyAMA0" Il comando avvia un host con architettura versatilepb, 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 4072/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''**. QEMU può emulare l'architettura **versatileab** e **versatilepb**. La //Application Baseboard// (AB) è considerata ormai obsoleta ed è stata sostituita dalla //Platform Baseboards// (PB), vedere la presentazione dell'architettura ARM **[[http://arm.com/products/tools/development-boards/versatile/|versatile]]**. Al fine di compilare nativamente per Arm non ci sono sostanziali differenze. ===== 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: [[http://www.aurel32.net/info/debian_arm_qemu.php|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: * **[[http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-armel/current/images/versatile/netboot/initrd.gz|initrd.gz]]** * **[[http://ftp.nl.debian.org/debian/dists/squeeze/main/installer-armel/current/images/versatile/netboot/vmlinuz-2.6.32-5-versatile|vmlinuz-2.6.32-5-versatile]]** 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 di dimensioni adeguate (almeno 4 Gb) con **''qemu-img''**, si avvia l'installazione con: 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 si avvia l'emulatore con un comando come visto al paragrafo precedente. ===== Con libvirt ===== Con **[[http://libvirt.org/|libvirt]]** 0.9.12.3 fornito da Debian Wheezy non si riesce a creare un file di configurazione adeguato che avvii l'emulatore QEMU per arm come visto sopra. Si potrebbe scrivere un wrapper da eseguire in sostituzione di **''/usr/bin/qemu-system-arm''**, che modifica i parametri passati all'emulatore. Tuttavia il problema è risolvibile installando libvirt 1.2.1-1~bpo70 dai Debian backports, questa è un file di configurazione per ''/etc/libvirt/qemu/armel.xml'' che ottiene più o meno la stessa della riga di comando vista sopra: armel bf9adc6c-f05c-2698-1cf0-278fd86dc19a 262144 262144 1 hvm /home/kvm/armel/vmlinuz-2.6.32-5-versatile /home/kvm/armel/initrd.img-2.6.32-5-versatile root=/dev/sda1 console=ttyAMA0 destroy restart destroy /usr/bin/qemu-system-arm Alcune note: * Questa architettura emulata non consente più di **256 Mb di RAM**. * La configurazione di cui sopra la scheda di rete viene posta in [[..:linux:sa:virtualization#modalita_bridge|modalità bridge]], quindi la macchina ospite deve avere l'opportuna scheda **br0** configurata, la rete locale fornisce l'indirizzo via DHCP, ecc. * Si è scelta l'architettura **versatileab** perché la versatilepb viene avviata con dei parametri sbagliati e si ha un errore **No PCI buses available**.