In questa guida, andremo alla scoperta di come eseguire le applicazioni x86 su un Raspberry Pi (o qualsiasi altra board con processore ARM) utilizzando il software box86.

Box86 è un software di emulazione dello spazio utente che consente di eseguire applicazioni GNU/Linux x86 su un dispositivo ARM come il Raspberry Pi. Tramite quest’ultimo, possiamo eseguire una varietà di software x86 che include applicazioni come Zoom o giochi non troppo pesanti.

Alcune considerazioni

Ci sono alcune considerazioni da fare per usare box86 sul tuo Raspberry Pi:

  • Innanzitutto è che può eseguire solo applicazioni x86. Il software creato per 64-bit non potrà essere eseguito.
  • Il secondo è che è necessario eseguire un sistema a 32 bit. Il modo in cui box86 è progettato è che converte le tipiche chiamate x86 in chiamate ARM a 32 bit.
  • Una delle migliori caratteristiche di Box86 è che dispone di un recompiler dinamico (DynaRec). Come suggerisce il nome, un recompiler dinamico prende le istruzioni e le ricompila attivamente in istruzioni ARM ottimizzate. Un interprete, al contrario, mapperebbe le istruzioni x86 a un equivalente ARM senza considerare quanto sarebbe ben ottimizzato il risultato. Nel caso di box86, la funzione DynaRec consente all’emulatore di eseguire il software da 5 a 10 volte più velocemente di quello che il suo interprete è in grado di fare.
  • Si noti che box86 è puramente un emulatore x86 per ARM. Non è possibile eseguire applicazioni Windows utilizzando box86 sul tuo Raspberry Pi. Occorrerà usare Wine insieme a Box86 per questo.

Requisiti

  • Raspberry PI (in questo caso, va bene un qualsiasi modello, ma suggeriamo per questioni di performance almeno un Raspberry PI 2 o anche meglio il 3).
  • Scheda SD da almeno 8 GB
  • Connettività internet ethernet/wireless

Preparazione all’installazione di box86

Prima di poter compilare l’emulatore x86 sul nostro Raspberry Pi, avremo bisogno di fare un po’ di preparazione. La compilazione di box86 sul Raspberry Pi richiede alcuni pacchetti che potrebbero non essere installati attualmente sul sistema.

1. Per prima cosa, assicuriamoci di aver installato gli ultimi aggiornamenti disponibili per il nostro sistema operativo.

Se si esegue Raspberry Pi OS, è possibile eseguire i seguenti due comandi per aggiornarlo:

sudo apt update && sudo apt upgrade -y

2. Una volta che il sistema operativo avrà finito di aggiornarsi, possiamo installare tutti i pacchetti di cui abbiamo bisogno per compilare box86. Digitiamo quindi:

sudo apt install git build-essential cmake -y

In questo caso, dobbiamo installare il pacchetto git in modo da poter clonare il repository da GitHub.

Il pacchetto build-essential contiene un set di software per lo sviluppo tra cui il compilatore stesso, che ci servirà proprio per poter compilare e installare box86 sul nostro Raspberry Pi.

Infine, dobbiamo installare il pacchetto cmake. Questo strumento è richiesto per poter compilare l’emulatore x86 sul Raspberry Pi.

3. Ora che abbiamo i pacchetti necessari installati, recuperiamo il codice sorgente di box86, tramite il seguente comando:

git clone https://github.com/ptitSeb/box86

Passi extra per sistemi operativi a 64 bit

Se stai eseguendo questo tutorial su un sistema a 64 bit (com’è molto probabile che tu stia utilizzando se hai un Raspberry PI dal 2 in poi), dovrai seguire alcuni passaggi aggiuntivi per Box86 per funzionare correttamente sul tuo sistema.

Questi passaggi non sono necessari se si utilizza un sistema operativo a 32 bit e si salta alla sezione successiva.

1. Dobbiamo aggiungere l’ARM a 32 bit (armhf) come potenziale architettura per il nostro sistema operativo Raspberry Pi. Per farlo, è necessario eseguire il seguente comando:

sudo dpkg --add-architecture armhf

2. Il prossimo passo è eseguire un aggiornamento dell’elenco dei repository dei pacchetti:

sudo apt update

3. Infine possiamo installare tutti i pacchetti di cui abbiamo bisogno per eseguire Box86 su un sistema multi-arch (nel nostro caso, ARM64), procediamo quindi con:

sudo apt install gcc-arm-linux-gnueabihf libc6:armhf

Il primo pacchetto, in particolare, viene utilizzato in modo da poter “comprendere” il codice a 32-bit sul nostro sistema operativo ARM a 64 bit. Il rimanente è invocato da Box86 per funzionare correttamente.

Compilazione dell’emulatore x86 sul Raspberry Pi

Ora che abbiamo preparato il Raspberry Pi per compilare box86, possiamo andare avanti.

1. Iniziamo spostandoci nella directory in cui abbiamo clonato il codice box86, eseguendo il seguente comando:

cd ~/box86

2. Creiamo la directory aggiuntiva “build” in cui il compilatore memorizzerà le build (il risultato della compilazione, il software finale) di box86 e spostiamoci al suo interno:

mkdir build && cd build

3. All’interno di questa directory, possiamo preparare la compilazione dell’emulatore box86 sul nostro Raspberry Pi, grazie all’uso di cmake che abbiamo installato in precedenza.

Questo comando differisce leggermente in base al modello di Raspberry PI (Raspberry Pi 2, 3, 4 o 5).

Generare il Makefile sul Raspberry Pi 4 e successivi

Se si esegue questo su un sistema operativo a 32 bit, utilizzare il seguente comando:

cmake .. -DRPI4=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo

Nel caso di un sistema operativo a 64 bit, utilizziamo il comando:

cmake .. -DRPI4ARM64=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo

Per Raspberry Pi 3

cmake .. -DRPI3=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo

Per Raspberry Pi 2

cmake .. -DRPI2=1 -DCMAKE_BUILD_TYPE=RelWithDebInfo

Anche se box86 supporta il Raspberry Pi 1 e Zero, non vale la pena usarlo per questi dispositivi a causa della mancanza di supporto per il recompiler dinamico.

4. CMake genererà quindi il makefile per compilare il software box86 sul nostro Raspberry Pi.

Possiamo usare questo file per compilare l’emulatore x86 sul nostro Raspberry Pi utilizzando il seguente comando:

make -j $(nproc)

Usiamo l’argomento -j per dire al compilatore di utilizzare più processori per compilare il software.

Usando $(nproc)Inseriamo automaticamente il numero di core che il nostro processore ha nel comando.

5. Una volta che il compilatore finisce l’esecuzione, se non ci saranno stati errori, possiamo installare l’emulatore box86 sul nostro Raspberry Pi, tramite:

sudo make install

6. Infine, dobbiamo riavviare il serviziosystemd-binfmt. Il riavvio del servizio dopo l’installazione di box86 consente di permettere al sistema operativo di essere a conoscenza di ulteriori formati binari che adesso sono supportati.

sudo systemctl restart systemd-binfmt

Se si verificasse un errore durante l’esecuzione di questo comando, provare a riavviare il Raspberry Pi, con:

sudo reboot

Eseguire un’applicazione utilizzando box86 su Raspberry Pi

A questo punto, potremo scaricare una qualsiasi applicazione compilata per Linux x86, sul nostro Raspberry Pi. Per verificare che stiamo usando box86, ci basterà visualizzare un messaggio simile al seguente:

Box86 with Dynarec v0.3.4 f19122 built on Apr 13 2024 11:24:41

Subito dopo aver lanciato l’applicazione interessata.

Risoluzione dei problemi con Box86 sul Raspberry Pi 5

Quando si prova a utilizzare Box86 su un Raspberry Pi 5 si potrebbe visualizzare un errore di segmentation fault. Questo errore è causato da Box86 che non supporta la paginazione a 16K che il Pi 5 supporta per impostazione predefinita. Fortunatamente, Raspberry Pi OS viene fornito con più kernel che possiamo applicare al nostro Raspberry Pi per cambiare ad esempio le dimensioni della pagina.

1. Per impostare la dimensione standard a 8k, è necessario modificare la configurazione di avvio, utilizzando il seguente comando all’interno del terminale.

sudo nano /boot/config.txt

2. Aggiungiamo quindi la seguente linea, assicurandoci che sia l’unico parametro “kernel=” definito all’interno del file:

kernel=kernel8.img

3. Dopo aver apportato la modifica di cui sopra alla configurazione di avvio, salvare e uscire premendo CTRL + X, seguito da Y e poi ENTER.

4. Riavviamo il sistema per applicare le modifiche:

sudo reboot

È tutto, adesso potremmo riprovare a lanciare l’applicazione x86 che ci interessava eseguire sul nostro dispositivo ARM. 🙂