Résurrection de Yulai

Comme je vous l'avais promis il y a très longtemps dans Clonage de FreeBSD, voici la suite de l'histoire de Yulai, après sa mort en juin 2010. Et puis, il faut bien que mérite ma place dans le planet BSD francophone ;-)

Yulai est donc un ordinateur de jeu, utilisé intensément par le passé. Donc l'objectif est de faire fonctionner un jeu pour Windows 32 bits, sur un Wine 32 bits, dans un chroot FreeBSD 32 bits, sur un X.org 64 bits, dans un FreeBSD 64 bits, avec un driver graphique 64 bits.

Ça fait long comme chaîne, donc énormément d'occasions pour que quelque chose tourne mal. En plus, il n'est seulement question de faire fonctionner l'application, mais en plus de faire passer les informations et les instructions nécessaires à l'accélération 3D matérielle d'un bout à l'autre de cette chaîne.

C'est donc une agréable surprise que le résumé de ce billet est le même que lorsque j'ai installé mon HTPC : ça juste marche bien, du premier coup, out-of-the-box. Cependant, je reconnais que tout n'est pas aussi immédiat, et même si ça marche, il faut quand même (trouver et) suivre le wiki.

Voici donc une version en Français de la procédure, avec ce qu'il faut pour avoir les drivers nVidia propriétaires (il faut ce qu'il faut, pour jouer).

Création d'un chroot

À ce stade, le problème est que le système d'exploitation est un FreeBSD 64 bits, mais Wine ne fonctionne que sur des systèmes d'exploitation 32 bits, justement parce que ce n'est pas un émulateur et que les instructions de l'application sont balancées brutalement vers le CPU (si j'ai bien tout compris).

La solution habituelle à ce genre de problèmes est d'avoir un userland en 64 bits pour le système et les applications tolérantes, et en plus un autre userland 32 bits pour les applications comme Wine. Manifestement, cette idée n'est pas (encore ?) mise en place sur FreeBSD.

Donc il s'agit ici de modifier un peu cette solution pour le faire « à la main », en mettant le userland FreeBSD 32 bits dans une sous-arborescence séparée, exactement comme pour un jail (mais en fait ici un chroot suffit).

zfs create ztank/wine
make -C /usr/src buildworld installworld distribution TARGET=i386 DESTDIR=/ztank/wine
cp -i /etc/resolv.conf /ztank/wine/etc

Ensuite il faut importer l'arbre des ports et les sources dans le chroot. Lors de la réactivation de Yulai, ztank était le pool système, donc il suffisait de cloner les FS :

zfs snapshot ztank/base/usr/ports@now
zfs snapshot ztank/base/usr/src@now
zfs clone ztank/base/usr/ports@now ztank/wine/usr/ports
zfs clone ztank/base/usr/src@now ztank/wine/usr/src

La deuxième fois, j'ai installé le chroot sur un SSD, donc sur un pool différent (zssd), avec un nullfs :

mkdir /zssd/wine/usr/{ports,src}
mount -t nullfs /usr/ports /zssd/wine/usr/ports
mount -t nullfs /usr/src /zssd/wine/usr/src

Sinon on peut aussi les retélécharger, avec portsnap, csup et tout ça. Ou bien copier brutalement les répertoire du système vers le chroot.

Entrer dans le chroot

Alors que la procédure précédente n'est à faire qu'une seule fois, il peut être utile de revenir plusieurs fois dans le chroot. Par exemple pour mettre à jour Wine ou les drivers.

chroot /ztank/wine /bin/csh
setenv MACHINE i386
setenv UNAME_p i386
setenv UNAME_m i386
mount -t devfs devfs /dev
/etc/rc.d/ldconfig start

Installer les ports

Le problème lorsqu'on écrit des articles trop longtemps après les faits (4 novembre 2010 pour la première installation, 21 mars 2011 pour l'installation sur le SSD), et qu'on est mauvaise en prise de notes, c'est qu'on ne se souvient plus exactement de tout le contexte.

Par exemple à ce stade, je n'ai pas la moindre idée de pourquoi j'ai installé le serveur X11 :

make -C /usr/ports/x11-servers/xorg-server config
# NO_AIGLX, SUID, NO_HAL
make -C /usr/ports/x11-servers/xorg-server config-recursive
# (tout par défaut)
make -C /usr/ports/x11-servers/xorg-server install

Ensuite, plus facile, j'ai installé les drivers nVidia, pour avoir la partie userland (mais le module noyau est dans le même port, même s'il n'est d'aucune utilité ici), avec les mêmes options que sur le système, à savoir FREEBSD_AGP, ACPI_PM, LINUX (pour si un jour je veux faire tourner des binaires linux 32-bits) et WBINVD :

make -C /usr/ports/x11/nvidia-driver install

Enfin, le plus important, installer wine lui-même :

make -C /usr/ports/emulators/wine install

Utiliser wine

Ce qui est formidable avec cette solution, c'est qu'il n'y a pas besoin d'être dans le chroot pour utiliser le wine ainsi installé. Pour toutes les commandes « système » (mise à jour, recompilation, etc) on ne peut pas y échapper, mais tout ce qui se fait en utilisateur non-privilégié se fait très bien depuis le système 64 bits, en adaptant un peu les variables d'environnement.

Pour se faire, j'ai mis un script wine32 dans mon $PATH (en l'occurrence, dans $HOME/bin/) :

#!/bin/sh
LD_32_LIBRARY_PATH=/ztank/wine/usr/local/lib PATH=/ztank/wine/usr/local/bin:$PATH exec /ztank/wine/usr/local/bin/wine "$@"

L'utilisation est ensuite aussi simple que :

cd ~/games/World\ of\ Warcraft
wine32 Wow.exe

Bonus : patcher Wine

Je ne suis pas tout-à-fait une fangirl de Blizzard, mais j'ai quand même été rapidement tentée par Diablo III. Non, pas juste le jour de sa sortie, j'ai une vraie vie moi, mais le premier jour férié qui a suivi.

Quand j'ai lu que ça ne fonctionnait pas vraiment out-of-the-box, et encore moins sur la version stable de Wine, j'ai eu un peu peur. Et pourtant, là encore, tout s'est super bien passé.

D'après l'appdb de Wine, à l'époque aussi bien que maintenant, il suffit d'appliquer quelques patchs fournis à la version développement de Wine pour que tout se passe bien.

Pour des power users (dont je crois faire partie), « il suffit de patcher » veut dire que ça marche presque tout de suite ; mais je peux comprendre que ça puisse rebuter les lusers de base. Et c'est à mon avis à ce niveau que les systèmes de ports comme celui de FreeBSD sont merveilleux : comme tout est basé sur des sources, qu'il faut assez souvent adapter (enfin plutôt porter), tout est déjà en place pour patcher des sources.

Donc pour l'utilisateur de base, la difficulté ne va pas plus loin qu'extraire le diff à proprement parler des fichiers donnés sur l'appdb, supprimer les a/ et b/ au début des noms de fichiers, et enregistrer ça dans /usr/ports/emulators/wine-devel/files/ avec un nom qui commence par patch-.

Ensuite il suffit d'installer normalement le port wine-devel à la place de wine :

make -C /usr/ports/emulators/wine deinstall
make -C /usr/ports/emulators/wine-devel reinstall clean

Et voilà o/. Le script wine32 ci-dessus permet de faire fonctionner Diablo III sans que je rencontre le moindre problème (en dehors de l'agent d'authentification) :

cd ~/games/Diablo\ III
wine32 "C:\users\public\Application Data\Battle.net\Agent\Agent.954\Agent.exe" --nohttpauth &
wine32 Diablo\ III\ Launcher.exe

Commentaires

Pas de commentaire pour le moment.

Poster un commentaire

Mise en forme historique : pour mettre en valeur un mot ou un groupe de mot, tapez une étoile de part et d'autre, sans mettre d'espace entre l'étoile et le mot, comme ceci : *mise en valeur*. Pour insérer un lien, mettez le entre crochets, comme ceci : [http://instinctive.eu/].

Mise en forme markdown : voir le guide détaillé, en résumé c'est le Markdown traditionnel, sans HTML ni titres, mais avec les tables PHP-Markdown-Extra.

Attention : les balises HTML entrées dans les commentaires seront affichées telles quelles, et non pas interprétées.

Autour de cette page

 

Autour de cet article

  • Publié le 17 juin 2012 à 17h11
  • État de la bête : jetée au jeu, pour qu'elle meurre par le jeu.
  • Pas de commentaire
  • Tag : BSD
  • Tag : Geek

Derniers commentaires

Tags

Archives

Site-level navigation and features

 

Instinctive.eu

Contact

Sections

Validation

Copyright © 2008-2016 Natacha Kerensikova

Butterfly images are copyright © 2008 Shoofly