QEMU

De ClissXXI.

aptitude install qemu
cat <<EOF >> /etc/sysctl.conf
# http://kidsquid.com/cgi-bin/moin.cgi/QemuOnLinux
# Ensure host has 1024 Hz timer
dev.rtc.max-user-freq=1024
EOF
sysctl -p

Sommaire

Compiler et tester un exécutable de test

Pour obtenir powerpc-linux-gcc: Compilation croisée

$ cat <<EOF > hello.c
#include <stdio.h>

int main(void) {
  return ! printf("Hello world!\n");
}
EOF
$ powerpc-linux-gcc hello.c -Wall -ansi -pedantic -static
$ qemu-ppc a.out
Hello world!

Mais:

$ powerpc-linux-gcc hello.c -Wall -ansi -pedantic
$ qemu-ppc ./a.out
/lib/ld.so.1: No such file or directory
Erreur de segmentation

ToDo: trouver une façon de travailler pour gérer les dépendances (chroot recompilé)? Piste: l'archive gnemul avec quelques bib systèmes.

Des images de systèmes à télécharger

Sur http://free.oszoo.org/download.html

Essayer notamment:

btdownloadcurses http://free.oszoo.org/ftp/images/linux-ppc-20040716.tar.bz2.torrent #20M
btdownloadcurses http://free.oszoo.org/ftp/images/debian_sarge_ppc.tar.torrent #1Go!

Avec l'image de base, en tant que root pour avoir le réseau via /dev/net/tun:

qemu-system-ppc -prep -localtime -kernel zImage.prep linux-ppc.img

À l'intérieur, vous pouvez [1]:

ifconfig eth0 172.20.0.2 # qemu
scp me@172.20.0.1:fichier # système hôte

L'image de 1Go est un système Debian sarge PPC pré-installé complet:

qemu-system-ppc -prep -kernel vmlinuz-2.4.27.001 -hda debian_sarge_ppc.img -user-net

Dans celle-ci le réseau à l'air différent:

  • 10.0.2.2: hôte et... serveur DHCP!
  • 10.0.2.15: qemu

Tester une installation

wget http://cdimage.debian.org/debian-cd/3.1_r2/powerpc/iso-cd/debian-31r2-powerpc-netinst.iso
qemu-img create debian_sarge_ppc.img 500M
qemu-system-ppc -hda debian_sarge_ppc.img -cdrom debian-31r2-powerpc-netinst.iso -boot d

D'après le HOWTO, le noyau 2.6 ne passe pas - utiliser install-powerpc-2.4 ramdisk_size=10000 au boot.

Démarrer sur son propre disque-dur

qemu -snapshot -hda /dev/hda -hdb /dev/hdb

Démarrer sur une image de partition

(et non sur une image de disque complet)

qemu -hda debian.img -kernel bzImage -append "root=/dev/hda" # ...

Démarrer sur une image PXE/BOOTP/netboot

patch pour la version 0.9.0, intégré dans 0.9.1.

Préparation de l'exécutable:

wget ftp://ftp.fr.debian.org/debian/dists/sarge/main/installer-i386/current/images/netboot/netboot.tar.gz
mkdir debian-netboot/
tar xzf netboot.tar.gz -C debian-netboot/

Lancer l'installation netboot:

qemu ignorezmoi.img -boot n -tftp debian-netboot/ -bootp /pxelinux.0

L'installateur Debian se lance :)

Démarrer l'émulateur sur le réseau

qemu -hda nimportequoi.img -boot n -net nic -net tap,ifname=tap1,script=no

Le transfert TFTP initial du noyau est beaucoup plus lent que sur une machine physique - bizarre.

VNC

Exemple:

qemu -vnc :0 -k fr os.img

Pour y accéder:

vncviewer localhost

Très pratique pour passer une VM en tâche de fond.

Problème: la souris VNC et la souris système de sont pas synchro :/

(Edit de Hostin : afin de corriger ce probleme il faut demarrer avec "-usbdevice tablet" ;-) )

Partage Samba avec l'hôte

qemu -smb /path os.img

ou plutôt, si vous êtes chez Debian:

sudo qemu -smb /path os.img

Purée, je vais encore râler contre les distros, mais QUEL BESOIN ONT CES FOUTUS PACKAGEURS de coder en dur secrets.tdb dans /var/lib/ alors que c'est sensé être configurable (option private dir)? Cf. debian/patch/fhs.patch. Du coup il n'est plus possible de lancer smbd sans être root, faute de droits >(


Dans la VM, au choix:

mount //10.0.2.4/qemu smb/
mount -t cifs //10.0.2.4/qemu smb/
smbclient //10.0.2.4/qemu

Optimisation PC->PC

KQEMU - QEMU Accelerator Module

KQEMU est libre depuis le 5 février :)

Il permet d'accélérer des systèmes à base de Linux ou de W2K et ultérieur.

Remarque: kqemu ne donne pas nécessairement de bons résultats. Win98 fonctionne mieux sans. désactiver éventuellement l'ACPI pour installer WXP.

Si j'ai bien compris, il y a trois mode:

  • pas d'accélération (option -no-kqemu)
  • accélération normale (pas d'option et /dev/kqemu installé)
  • accélération noyau (-kernel-kqemu)

qvm86

qvm86 permettait d'avoir une émulation plus rapide mais le code n'a pas été touché depuis 2005-09-04 (qemu 0.7.2), et l'auteur encourage [2] de passer à VirtualBox à la place. Il y a un patch plus récent mais je n'arrive pas à savoir sur quelle version de qemu il fonctionne. Apparemment [3] le patch s'applique sur la v0.8.0 mais ne contient que les changements sur qvm86, pas les changements correspondants sur qvm86 (notamment, il manque une mise à jour de patch.qvm86).

Compilation:

cvs -d:pserver:anonymous@cvs.sv.gnu.org:/sources/qemu co -D 2006-09-05 qemu
cd qemu/
cvs -d:pserver:anonymous@cvs.sv.gnu.org:/sources/qvm86 co qvm86
cat qvm86/patch.qvm86 | patch -p0
./configure --target-list=i386-softmmu --cc=gcc-3.3
make
# sudo make install
# cf. i386-softmmu/qemu et qvm86/qvm86.ko

Je ne sais pas trop comment tester l'efficacité du module. En tout cas c'est un excellent moyen de reproduire un BSOD W98 ;) (note: cet OS n'est pas sensé fonctionner avec un accélérateur de toute façon)

Optimisation avec le noyau Linux

Il y a un patch très simple dans les sources de kqemu (linux-2.6.9-qemu-fast.patch) qui notamment (si j'ai bien compris) réserve une plage mémoire pour qemu. Je suppose que c'est de cela qu'il s'agit lorsque l'on voit des références à une commande qemu-fast. Cependant je ne sais pas comment produire cet exécutable.

Désinstallation de la version binaire

tar tzf qemu-0.8.2-i386.tar.gz | (cd / && sudo xargs rm)

QEMU-compatible kernel

Configuration rapide

make defconfig ARCH=i386
make xconfig
# Activer: NE2K_PCI=Y (ns2000 PCI network ethernet card)
make
file arch/i386/boot/bzImage

Ce noyau est malheureusement trop volumineux pour tenir sur une disquette (2.5Mo) - ce qui est nécessaire pour suivre certains HOWTO les séquences d'amorçage ([4][5]).

Utiliser éventuellement make ROOT_DEV=/dev/hda1.

Configuration précise: méthode

Analyse de la configuration

  • Depuis une image qemu qui fonctionne:
$ uname --machine
i686
$ cat /proc/cpuinfo
[...]
model name      : Pentium II (Klamath)
[...]
# Remarque: il y a une variante x86_64, avec qemu-system-x86_64
$ lspci
0000:00:00.0 Host bridge: Intel Corp. 440FX - 82441FX PMC [Natoma] (rev 02)
0000:00:01.0 ISA bridge: Intel Corp. 82371SB PIIX3 ISA [Natoma/Triton II]
0000:00:01.1 IDE interface: Intel Corp. 82371SB PIIX3 IDE [Natoma/Triton II]
0000:00:01.3 Bridge: Intel Corp. 82371AB/EB/MB PIIX4 ACPI
0000:00:02.0 VGA compatible controller: Cirrus Logic GD 5446
0000:00:03.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8029(AS)
  • Sur la console qemu (Ctrl+Alt+2):
(qemu) info network
VLAN 0 devices:
  user redirector
  ne2000 pci macaddr=...

Méthode

make allnoconfig

Puis amélioration au fur et à mesure:

  • Erreurs au chargement du noyau
  • File -> Search dans qconf

Configuration

Essentiel

Kernel support for ELF binaries (BINFMT_ELF)
# Disque-dur
# 0000:00:01.1 IDE interface: Intel Corp. 82371SB PIIX3 IDE [Natoma/Triton II]
ATA/ATAPI/MFM/RLL support (IDE)
Enhanced IDE/MFM/RLL disk/cdrom/tape/floppy support (BLK_DEV_IDE)
Include IDE/ATA-2 DISK support (BLK_DEV_IDEDISK)
#?PCI IDE chipset support (BLK_DEV_IDEPCI)
#?Generic PCI bus-master DMA support (BLK_DEV_IDEDMA_PCI)
#?Intel PIIXn chipsets support (BLK_DEV_PIIX)
#?? DMA?
Ext3 journalling file system support (EXT3_FS)
# and/or:
Reiserfs support (REISERFS_FS)

La suite

# Précision du type de processeur
Pentium-II/Celeron(pre-Coppermine) (MPENTIUMII)

# Servers (Apache...)
System V IPC (SYSVIPC)

# Systèmes de fichiers
Second extended fs support (EXT2_FS)
# /dev/shm
Virtual memory file system support (former shm fs) (TMPFS)

?
#Deadline I/O scheduler (IOSCHED_DEADLINE)
#Deadline (DEFAULT_DEADLINE)

# Floppy
Normal floppy disk support (BLK_DEV_FD)

# Lecteur CD-ROM
Include IDE/ATAPI CDROM support (BLK_DEV_IDECD)
# ^ À tester! ^
ISO 9660 CDROM file system support (ISO9660_FS)
Microsoft Joliet CDROM extensions (JOLIET)

# Network
# 0000:00:03.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8029(AS)
PCI support (PCI)

Networking support (NET)
# /dev/log
Unix domain sockets (UNIX)
TCP/IP networking (INET)
Packet socket (PACKET)

Network device support (NETDEVICES)
Ethernet (10 or 100Mbit) (NET_ETHERNET)
EISA, VLB, PCI and on board controllers (NET_PCI)
PCI NE2000 and clones support (see help) (NE2K_PCI)
# TODO: "Qemu can emulate several different models of network card.
# Valid values for type are ne2k_pci, ne2k_isa, rtl8139, smc91c111 and lance.
# Not all devices are supported on all targets." [6]

Divers

Kernel .config support (IKCONFIG)
Enable access to .config through /proc/config.gz (IKCONFIG_PROC)
CIFS support (advanced network filesystem for Samba, Window and other CIFS compliant servers) (CIFS)

# For the vga=ask kernel parameter
Video mode selection support (VIDEO_SELECT)
Support for frame buffer devices (FB)
Cirrus Logic support (FB_CIRRUS)

Multicast

Par exemple -net socket,mcast=239.192.168.1:1102.

D'après le livre User Mode Linux il faut activer:

IP: multicasting (IP_MULTICAST)
IP: multicast routing (IP_MROUTE) # nécessaire?

Le réseau multicast est compatible avec UML (ainsi que les réseaux multicast réels, en fait :)).

VDE - Virtual Distributed Ethernet

apt-get install vde2

On peut créer un réseau entre machines facilement sans accès root avec VDE:

vde_switch
qemu ... -net nic,macaddr=52:54:00:00:00:01 -net vde,sock=/tmp/vde.ctl
qemu ... -net nic,macaddr=52:54:00:00:00:02 -net vde,sock=/tmp/vde.ctl

VPN

# IPSec - cf. http://www.ipsec-howto.org/x299.html

#? Transformation user configuration interface (XFRM_USER) # for racoon only?
PF_KEY sockets (NET_KEY)

IP: AH transformation (INET_AH)
IP: ESP transformation (INET_ESP)
#?IP: IPComp transformation (INET_IPCOMP) # strictly necessary?
IP: IPsec transport mode (INET_XFRM_MODE_TRANSPORT)
IP: IPsec tunnel mode (INET_XFRM_MODE_TUNNEL)
#?IP: IPsec BEET mode (INET_XFRM_MODE_BEET)

Null algorithms (CRYPTO_NULL)
AES cipher algorithms (i586) (CRYPTO_AES_586)
# PPTP (client only?) [7]
IP: GRE tunnels over IP (NET_IPGRE)
PPP (point-to-point protocol) support (PPP)
PPP MPPE compression (encryption) (EXPERIMENTAL) (PPP_MPPE)
PPP support for async serial ports (PPP_ASYNC)

Virtual FAT disk images

Ex: qemu debian.img -hdb fat:/tmp

VFAT (Windows-95) fs support (VFAT_FS)
Codepage 437 (United States, Canada) (NLS_CODEPAGE_437)
NLS ISO 8859-1 (Latin 1; Western European Languages) (NLS_ISO8859_1)
# Pas nécessaire pour fat:, mais indispensable pour monter de vraies
# partitions FAT françaises
# Codepage 850 (Europe) (NLS_CODEPAGE_850)


Carte graphique

0000:00:02.0 VGA compatible controller: Cirrus Logic GD 5446

Supprimé pour l'instant

# Software poweroff:
Power Management support (PM)
ACPI Support (ACPI)
Button (ACPI_BUTTON)

The IPv6 protocol (IPV6)

?generic/default IDE chipset support (IDE_GENERIC)

Autre matériel

0000:00:01.3 Bridge: Intel Corp. 82371AB/EB/MB PIIX4 ACPI
?

0000:00:00.0 Host bridge: Intel Corp. 440FX - 82441FX PMC [Natoma] (rev 02)
?

0000:00:01.0 ISA bridge: Intel Corp. 82371SB PIIX3 ISA [Natoma/Triton II]
?

Automatisation

On peut prédéfinir ces options dans un fichier allno.config, pris en compte au moment du make allnoconfig (cf. le README du noyau). Le fichier se présente sous cette forme (préfixer par CONFIG_ et finir par =y - comme dans un .config):

CONFIG_BINFMT_ELF=y
CONFIG_IDE=y
[...]
CONFIG_CIFS=y
CONFIG_VFAT_FS=y
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_ISO8859_1=y

Note: en fait, il faut rajouter un certain nombre d'option qui sont automatiquement ajoutées par xconfig (notamment CONFIG_IDE_GENERIC pour le disque-dur...).

Liens

Outils personnels