QEMU
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
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
- Installing from Scratch...: HOWTO pour recréer l'image Debian Sarge
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
- Utilisez dhcp3-server/sarge ou dhcpd/etch comme serveur DHCP (dhcp3-server/etch|lenny ne fonctionne pas, je ne sais pas pourquoi; pistes: 1 2, mais ça ne change rien pour moi)
- Passez en mode bridge sur la machine hôte pour récupérer les réponses DHCP (UserModeLinux#Mode_semi-root_avec_tuntap).
- Puis lancez:
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 >(
- bug chez Debian: ça ne fait que 2-3 ans.
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
- Documentation officielle
- Guide simplifié pour QEMU
- Unofficial #qemu Wiki
- The QEMU forum
- QEMU Networking: panorama des différentes solutions de connexion réseau
- tuntap nécessite des permissions supplémentaires
- Limitations de Etherboot: utiliser ISC DHCPd v2 (pas v3).
- QEMU compilé pour Fedora