Exécuter des binaires Intel dans Debian ARM avec Rosetta

illustrations illustrations illustrations illustrations illustrations illustrations illustrations
post-thumb

Publié le 12 janvier 2023 par Andrew Owen (4 minutes)

J’ai déjà parlé d’UTM. Il s’agit d’un joli wrapper pour QEMU qui vous permet de créer des machines virtuelles ARM et d’émuler des machines non-ARM sur macOS. Il est possible de le télécharger gratuitement depuis le site web, ou de l’obtenir dans l’app store. Mais l’une des fonctionnalités que j’attendais avec impatience est la possibilité d’utiliser Rosetta pour traduire les instructions X64 en instructions ARM64, ce qui est pris en charge dans la dernière version d’UTM sur macOS Ventura. J’espérais pouvoir installer des VM Intel en utilisant Rosetta, mais pour cela il faut toujours utiliser QEMU. Ce que vous pouvez faire, c’est installer une VM ARM Debian, activer Rosetta, puis exécuter des paquets Debian X64 sur cette VM. Cela peut être utile si vous avez besoin d’un paquet particulier qui n’a pas de version ARM native. Jusqu’à présent, je n’ai réussi à faire fonctionner que des paquets, et non des binaires Intel individuels. Il y a aussi une grosse mise en garde:

Il y a un bogue présent dans les machines virtuelles Linux sur Ventura et la puce M1 de base qui provoque une panique aléatoire du noyau et un gel de la machine virtuelle. Malheureusement, cela signifie que les utilisateurs de la puce M1 de base doivent éviter le backend de virtualisation d’Apple jusqu’à ce qu’Apple ou les responsables de Linux fournissent un correctif.

Je travaille sur un M1 Pro, et cela semble bien fonctionner. Après avoir installé UTM, vous aurez besoin de l’installateur Debian Net. Vous devrez également installer Rosetta.

Configurer la VM

  1. Ouvrez UTM et cliquez sur Add ( ➕ ) pour ouvrir l’assistant de création de VM.
  2. Dans le panneau Start, cliquez sur Virtualize, puis dans le panneau Operating System, cliquez sur Linux.
  3. Dans le panneau Linux, sélectionnez Use Apple Virtualization, puis Enable Rosetta (x86_64 Emulation).
  4. Cliquez sur Browse et sélectionnez l’installateur Debian ISO que vous avez téléchargé plus tôt, puis cliquez sur Next.
  5. Choisissez la quantité de RAM et de cœurs de CPU que vous voulez que la VM utilise, puis cliquez sur Next. J’ai utilisé les paramètres par défaut.
  6. Définissez l’espace disque maximum à allouer, puis cliquez sur Next. J’ai laissé la valeur par défaut de 64 Go. L’image n’occupera pas la totalité de l’espace disque lorsque vous la créerez, et pourra être réduite si vous disposez de suffisamment d’espace disque pour une copie, c’est pourquoi vous devez définir l’espace maximum dont vous pensez avoir besoin.
  7. (facultatif) Choisissez un dossier partagé à monter dans la VM, puis cliquez sur Next. Si vous sautez cette étape, vous pouvez sélectionner le dossier ultérieurement à partir de la barre d’outils VM.
  8. Cliquez sur Save pour créer la VM, puis cliquez sur Run ( ▶️ ) pour démarrer la VM.

Installer Debian

  1. Lorsque la VM démarre, sélectionnez Install et suivez l’assistant d’installation.
  2. Lors du formatage du disque, installez sur le disque virtuel 1 (vda), en utilisant tout le disque, tous les fichiers dans une seule partition.
  3. Dans la sélection des logiciels, sélectionnez GNOME, le serveur SSH et les utilitaires système standard.
  4. Après l’installation, éjectez le disque et redémarrez.

Activer sudo

$ set USERNAME=`whoami`
$ su -p
# /usr/sbin/usermod -aG sudo $USERNAME

Après avoir activé sudo pour l’utilisateur par défaut, vous devez redémarrer la machine virtuelle pour que la modification prenne effet.

Installer le logiciel

  1. Installez les outils de l’invité: sudo apt install spice-vdagent.
  2. Installez le support du format binaire: sudo apt install binfmt-support.
  3. Créez un point de montage: sudo mkdir /media/rosetta.
  4. Montez Rosetta: sudo mount -t virtiofs rosetta /media/rosetta.
  5. Ajoutez cette ligne au fichier /etc/fstab: rosetta /media/rosetta virtiofs ro,nofail 0 0.
  6. Enregistrez Rosetta en tant que gestionnaire ELF X64:
sudo / usr / sbin / update - binfmts--install rosetta / media / rosetta / rosetta \
--magic "\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x3e\x00" \
--mask "\xff\xff\xff\xff\xff\xfe\xfe\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff" \
--credentials yes--preserve no--fix - binary yes

Le paramètre magique décrit les 20 premiers octets de l’en-tête ELF pour les binaires X64. Le noyau Linux effectue un ET logique bit à bit avec les 20 premiers octets de tout binaire que vous essayez d’exécuter avec la valeur du masque. S’il y a une correspondance, il utilise le gestionnaire enregistré pour interpréter le binaire. Dans le cas contraire, il signale une erreur.

7. Activer les paquets X64:

sudo dpkg --add-architecture amd64
sudo apt update

Vous pouvez maintenant installer et exécuter n’importe quel paquet X64 dans le dépôt Debian avec sudo apt install packagename:amd64.

Installer WINE

L’un de ces paquets est WINE, qui vous permettra d’exécuter certains binaires Windows 64 bits. Mais vous devrez également installer WINE32 pour le lancer. Je ne sais pas s’il est possible de convaincre Rosetta d’exécuter également des binaires 32 bits. Il faudra que je fasse des recherches plus approfondies. Vous devrez également activer les paquets X86:

sudo dpkg --add-architecture i386
sudo apt update

Vous pouvez ensuite installer WINE avec:

sudo apt install wine64:amd64
sudo apt install wine32:i386

Pour l’instant, seul l’explorateur de fichiers intégré fonctionne (lancement avec wine64 explorer). Si je parviens à faire fonctionner les applications 32 bits, j’écrirai un nouvel article à ce sujet.