Compilation de SDLMAME sur les architectures non-i386



Note: pour installer Qemu depuis les dernières sources disponibles,
- supprimez les paquets existants
 # aptitude remove --purge qemu kqemu-common

- installez les dépendances (paquets dev)
 # aptitude build-dep qemu

- récupérez le tar.gz sur http://www.nongnu.org/qemu/download.html
- décompressez et compilez
 $ ./configure && make
# make install


Qemu permet d'émuler un processeur et ainsi d'exécuter une Debian amd64 virtuelle sur un PC hôte i386. (KVM est un fork de Qemu).

Lecture préliminaire :
LA documentation en ligne http://www.qemu.org/qemu-doc.html
Installation et utilisation de KVM/Qemu http://www.linux-france.org/prj/inetdoc/articles/vm/
Installation de Qemu depuis les sources et émulation ARM http://www.aurel32.net/info/debian_arm_qemu.php
Qemu cheat sheet http://tipc.wiki.sourceforge.net/QEMU+Cheat+Sheet
Gestion des images systèmes http://en.wikibooks.org/wiki/QEMU/Images
Images pré-installées Debian (voir le readme dans la page de téléchargement) http://blog.aurel32.net/?p=46
Images pré-installées diverses http://www.oszoo.org/wiki/index.php/Main_Page
Et bien sûr $ man qemu, $ man kvm :)

Installer QEMU depuis les paquets debian (voir la note de droite pour obtenir Qemu depuis les sources) :
# apt-get install qemu


Enregistrer le script ~/bin/qemu-dist-arch :
#!/bin/bash

#
# qemu-dist-arch - copyleft 2009 <ludomatic@gmail.com>
#

### constants
SELFVER="0.3";
SELFEXEC=`basename $0`;

### functions
help()
{
  if [ "$1" = "arguments" ]; then
    echo "Abortig, arguments are missing !";
  else
    echo "$SELFEXEC version $SELFVER - qemu switch launcher.";
  fi
  if [ "$1" != "version" ]; then
    echo "Usage: either";
    echo "  - directly '$SELFEXEC <dist> <arch> <id>' (eg. '$SELFEXEC lenny amd64 1')";
    echo "  - or a symlink named '$SELFEXEC-<dist>-<arch> <id>' (eg. '$SELFEXEC-lenny-amd64 1')";
    echo "optional <id> value from 1 to 9, set to 1 by default.";
    exit 1;
  fi
  #echo $DISTRIB $ARCH;
  exit 0;
}

### checking params
if [ "$1" = "--help" ]; then
  help;
fi
if [ "$1" = "--version" ] || [ "$1" = "-v" ]; then
  help version;
fi
### get ditribution (etch, lenny, ...) and architecture (i386, amd64, ...)
if [ ! -z `echo $SELFEXEC | grep -- '-'`  ]; then
  BINARCH=`echo $SELFEXEC | cut -f3 -d '-'`;
  DISTRIB=`echo $SELFEXEC | cut -f2 -d '-'`;
else
  if [ $# -lt 1 ]; then
    help arguments;
  fi
  DISTRIB=$1;
  BINARCH=$2;
  shift 2;
fi
### optionnal numeric id is set?
if [ ! -z $1 ]; then
  if [ $1 -gt 0 ] && [ $1 -lt 10 ]; then
    NUMID=$1;
    shift 1
  fi
fi
if [ -z $NUMID ]; then
  NUMID=1;
fi;
### checking that all params fine
if [ -z $DISTRIB ] || [ -z $BINARCH ]; then
  help arguments;
fi

### switching stuff
CPUNAME="qemu-system-$BINARCH";
HOSTNAME="$DISTRIB-$BINARCH-$NUMID";
FILEPATH="/home/ludo/qemu/$DISTRIB-$BINARCH";
ROOTFS="$FILEPATH/debian_${DISTRIB}_${BINARCH}_small.qcow";
case "$DISTRIB-$BINARCH" in
  lenny-amd64)
    CPUNAME="qemu-system-x86_64";
    #CPUNAME="kvm -cpu qemu64";
    ROOTFS="$FILEPATH/debian_${DISTRIB}_${BINARCH}.qcow";
  ;;
  lenny-powerpc)
    CPUNAME="qemu-system-ppc";
    OPTDEVROOT="hdc";
  ;;
  lenny-arm)
    INITRD="$FILEPATH/initrd.img-2.6.26-2-versatile";
    KERNEL="$FILEPATH/vmlinuz-2.6.26-2-versatile";
  ;;
  *)
    echo "Warning: Unknown '$DISTRIB/$BINARCH'.";
    echo -n "Continue [y/N]? ";
    read KEYPRESS;
    if [ "$KEYPRESS" != "y" ] && [ "$KEYPRESS" != "Y" ]; then
      echo "Aborting. Use --help for help.";
      exit 2;
    fi
  ;;
esac

### Let's build qemu command
if [ -z $OPTDEVROOT ]; then
  OPTDEVROOT="hda";
fi
if [ ! -z $INITRD ] && [ -f $INITRD ] && [ ! -z $KERNEL ] && [ -f $KERNEL ]; then
  OPTKERNEL=" -kernel $KERNEL -initrd $INITRD -append 'root=/dev/$OPTDEVROOT console=ttyS0' ";
fi
if [ ! -f $ROOTFS ]; then
  echo "File system not found '$ROOTFS'. Aborting.";
  exit 3;
fi

### go!
echo "Starting $HOSTNAME...";
echo "  $CPUNAME $ROOTFS";
echo "  vnc localhost:590$NUMID";
echo "  ssh localhost:220$NUMID";
echo "  telnet localhost:230$NUMID";
$CPUNAME \
-name $HOSTNAME \
-k fr \
-m 644 \
-$OPTDEVROOT $ROOTFS $OPTKERNEL \
-redir tcp:220$NUMID::22 \
-serial stdio -serial telnet:localhost:230$NUMID,server,nowait \
-usb -usbdevice tablet \
-curses \
-vnc :$NUMID \
$@

exit $?

# active plus d'un processeur (plus lent)
# -smp 2
# utilise #%SHIFT#%+#%CTRL#%#+%ALT#% au lieu de #%CTRL#%+#%ALT#% par défaut pour retrouver le focus
# -alt-grab
# n'applique pas le modifications sur l'image, travaille en leture seule
# -snapshot
# passer du mode graphique SDL par défaut à CURSES
# -curses
# pas de mode graphique!
# -nographic
# booter depuis l'image ISO
# -cdrom /chemin/vers/image.iso -boot d
# activer la carte réseau RTL8139 en spécifiant une adresse MAC
# -net nic,model=rtl8139,macaddr=01:23:45:67:89:a${NUMID} -net user
# activer le lecteur disquette
# -fda /dev/fd0



- amd64


Télécharger la machine virtuelle pré-installée Lenny amd64 depuis http://people.debian.org/~aurel32/qemu/amd64/debian_lenny_amd64_small.qcow.gz dans ~/qemu/lenny-amd64/
Puis la décompresser avec :
$ gzip -d debian_lenny_amd64_small.qcow.gz


Créer un lien symbolique nommé exactement qemu-lenny-amd64 depuis le fichier précédent qemu-dist-arch. Vérifier notamment le chemin et le nom des images ($ROOTFS) et lancer directement le lien symbolique qui va exécuter Qemu avec le bon CPU : le script va extraire du nom "qemu-lenny-amd64" la distribution "lenny" et l'architecture "amd64" puis initialiser les variables correctement. Si plusieurs machines sont lancées en parallèle, il est utile de définir manuellement un identifiant par machine (défini à "1" par défaut) en paramètre :
qemu-lenny-amd64 2
qemu-lenny-amd64 3

Un autre moyen pourrait être de lancer le script original avec des paramètres :
 qemu-dist-arch lenny amd64 1


L'image va booter en environnement console, en anglais avec les comptes root (pwd:root) et user (pwd:user).
Mettre le système à la bonne heure
debian-amd64# dpkg-reconfigure tzdata

Lancer le client DHCP si l'IP n'est pas attribuée
debian-amd64# dhclient eth0

Mettre à jour le sources.list pour utiliser un dépôt plus proche et effectuer la mise à jour des listes de packages (un dist-upgrade sur architecture ARM pourrait casser le boot)
debian-amd64# apt-get update && aptitude reinstall debian-archive-keyring

Installer les paquets
debian-amd64# aptitude install mc vim console-setup ssh

Franciser le clavier (en console uniquement, pour gnome passer par les préférences clavier)
debian-amd64# dpkg-reconfigure console-setup

Remplacer l'éditeur texte par défaut (nano) par mcedit
debian-amd64# update-alternatives --config editor

Renommer le compte utilisateur user par défaut en ludo en changeant également le dossier personnel de /home/user vers /home/ludo. En profiter pour changer les mots de passe root et ludo
debian-amd64# vipw
debian-amd64# vipw -s
debian-amd64# vigr
debian-amd64# vigr -s
debian-amd64# mv /home/user /home/ludo
debian-amd64# passwd ludo
debian-amd64# passwd

Si le réseau ne se lance pas automatiquement (vérifier eth0 avec ifconfig), éditer le fichier /etc/crontab et ajouter cette ligne (client dhcp sur eth0):
@reboot     root    dhclient eth0


Rebooter pour appliquer les changements. À partir de cette image préparée, il est possible de ne travailler qu'en mode "lecture-seule" grâce à l'option -snapshot au lancement de qemu. Les modifications apportées à l'image ne seront pas appliquées à la fermeture, sauf par sauvegarde manuelle avec CTRL+a, s.

Les raccourcis Qemu avec l'émulation graphique activée :
Ctrl+Alt+f Passe ou reviens en mode plein-écran
Ctrl+Alt+n Bascule sur la console virtuelle 'n'. Les consoles par défaut sont:
1 - Affichage de l'écran du système client
2 - Moniteur
3 - Port série
Dans la console virtuelle, Ctrl+Up, Ctrl+Down, Ctrl+Pageup et Ctrl+Pagedown permettent de naviguer dans les logs.
Ctrl+Alt Bascule la capture des périphériques d'entrée (clavier, souris).

Les raccourcis Qemu sans émulation graphique avec l'option -nographic :
Ctrl+a, h ou Ctrl+a, ? Liste ces commandes
Ctrl+a, x Quitte l'émulateur
Ctrl+a, s Enregistre l'état de la machine dans le fichier image (si l'option -snapshot a été utilisée)
Ctrl+a, t Active/Désactive les timestamps dans la console
Ctrl+a, b Envoie un "break" (magic sysrq keys du noyau Linux)
Ctrl+a, c Bascule entre la console et le moniteur
Ctrl+a, Ctrl+a Transmet un Ctrl-a au système client

L'installation de SDLMAME se poursuit avec les paquets nécessaires à la compilation:
debian-amd64# aptitude install autoconf automake fakeroot dh-make debhelper devscripts gnupg lintian quilt sudo pbuilder rsync screen

Mettre l'utilisateur ludo dans les usagers sudoers avec visudo:
ludo ALL=(ALL) NOPASSWD: ALL


Au moyen de scp ou rsync sur l'environnement hôte (ludo@10.0.2.2) :
- Copier dans l'environnement amd64 les scripts pbuilders perso:
/bin/@pbuilder-etch-amd64
/bin/@pbuilder-lenny-amd64
/bin/@pbuilder-squeeze-amd64
/bin/pbuilder/pbuilder-dist-arch
- Mettre à jour le ~/.bashrc en conséquence:
PATH="$HOME/bin:$PATH"
alias ll='ls -la'
alias lh='ls -lah'
export EDITOR='mcedit'
export DEBNAME='Ludovic Lechapt'
export DEBEMAIL=ludomatic@gmail.com
export EMAIL=ludomatic@gmail.com
export DEBFULLNAME='Ludovic Lechapt'

- Copier les fichiers et dossiers précédemment crées (lors du paquet i386 de la machine hôte) dans "~/dev/deb/sdlmame/[VERSION]/" (voir plus bas pour modifier le contenu du fichier "build.sh") :
sdlmame-[VERSION]/
build.sh
sdlmame_[0132].orig.tar.gz
- Copier la clé gnupg (dossier des clés gpg) via ~/.gnupg/
- Copier les fichiers de préférences utilisateur ~/.pbuilderrc :
# https://bugs.launchpad.net/ubuntu/+source/pbuilder/+bug/118180
DEBBUILDOPTS="-b"
MEMORY_MEGS=512
export PTR64=1
export OPTIMIZE=0

- Copier le fichier de préférences utilisateur ~/.quiltrc :
# The directory in which patches are found (defaults to "patches").
QUILT_PATCHES=debian/patches


VÉRIFIER les sources APT puis construction de l'environnement de compilation pbuilder:
debian-amd64# su - ludo
debian-amd64$ pbuilder-etch-amd64 create

On peut s'y loguer avec la commade login (ajouter le paramètre --save-after-login pour enregistrer les changements dans l'image tgz à la sortie):
debian-amd64$ pbuilder-etch-amd64 login


Et on construit le paquet sdlmame pour etch amd64 (anciennement ~/dev/deb/sdlmame/0132/sdlmame-0132# dpkg-buildpackage -b) avec ce script exécuté depuis le dossier contenant le fichier .orig.tar.gz:
debian-amd64$ cd ~/dev/deb/sdlmame/[VERSION]/
debian-amd64$ ./build.sh


Fichier ~/dev/deb/sdlmame/[VERSION]/build.sh :
#!/bin/bash

VER="0132";

DIST="etch";
#DIST="lenny";
#DIST="squeeze";

PACKVER="1"; # à incrémenter si modifs sur le package
SUBVER="1";  # à incrémenter si update des sources upstream sans changer le packaging

#ARCH="i386";
ARCH="amd64";

rm -f ./*diff.gz ./*.dsc ./*.build ./*.changes
cd sdlmame-$VER

debuild -S -sa && pbuilder-$DIST-$ARCH build ../sdlmame_$VER-$PACKVER${DIST}${SUBVER}.dsc && lintian -iv /var/cache/pbuilder/$DIST-$ARCH/result/sdlmame_$VER-$PACKVER${DIST}${SUBVER}_$ARCH.changes

if [ -f /var/cache/pbuilder/$DIST-$ARCH/result/sdlmame_$VER-$PACKVER${DIST}${SUBVER}_$ARCH.changes ]; then
  debsign -S /var/cache/pbuilder/$DIST-$ARCH/result/sdlmame_$VER-$PACKVER${DIST}${SUBVER}_$ARCH.changes
fi

exit $?



- powerpc


Installer au minimum Qemu version 0.10.0 !
Pour Qemu 0.10.x : qemu-system-ppc -hdc debian_lenny_powerpc_small.qcow
Après Qemu 0.10.x : qemu-system-ppc -hda debian_lenny_powerpc_small.qcow


- arm


Installer au minimum Qemu version 0.9.1 !
qemu-system-arm -M versatilepb -kernel vmlinuz-2.6.26-2-versatile -initrd initrd.img-2.6.26-2-versatile -hda debian_lenny_arm_small.qcow -append "root=/dev/sda1"

Valid XHTML :: Valid CSS: :: Powered by WikkaWiki