La volontà di portare le applicazioni Windows su Linux non è cosa dei giorni nostri. Bisogna infatti risalire addirittura al 1993 quando nacque il progetto Wine (Wine is Not an emulator). All’epoca Bob Amstadt (il capo progetto iniziale) e Eric Youngdale avevano in progetto quello di eseguire Windows 3.1, che non era un sistema operativo ma un “ambiente operativo”, sotto Linux. Poco dopo, Alexandre Julliard, ingegnere software francese, prese le redini del progetto e ne divenne il maintainer principale. A distanza di oltre tre decenni, il progetto Wine è maturato enormemente, tanto che è ormai un punto di riferimento essenziale per eseguire applicazioni Windows su Linux.
Wine non è un emulatore: cosa significa davvero?
L’acronimo “Wine Is Not an Emulator” evidenzia la natura peculiare del software: Wine non emula un ambiente Windows, bensì reimplementa le API (Application Programming Interfaces) di Windows in un contesto Unix-like.
A differenza di un emulatore, che ricrea via software l’hardware di una piattaforma (introducendo inevitabilmente overhead in termini di prestazioni), Wine agisce come un layer di compatibilità che traduce le chiamate di sistema di Windows in chiamate POSIX equivalenti su Unix.
L’approccio è uno dei vari schemi che si possono usare per eseguire app Linux, Windows, macOS e Android sullo stesso sistema. Grazie all’utilizzo del layer di compatibilità, i programmi Windows possono funzionare su Linux con prestazioni sostanzialmente inalterate rispetto al sistema operativo di casa Microsoft. Inoltre, utilizzando Wine su Linux i programmi Windows possono interagire con il file system, la rete e l’ambiente grafico.
Architettura tecnica di Wine su Linux
L’architettura di Wine è modulare ma, allo stesso tempo, piuttosto complessa. Si compone di numerosi componenti, ognuno dei quali riproduce una parte dell’infrastruttura software di Windows.
Wine opera completamente nello user space dell’utente e include centinaia di librerie DLL (Dynamic Link Libraries) che reimplementano le corrispondenti versioni Windows: kernel32.dll
, user32.dll
, gdi32.dll
, ntdll.dll
, shell32.dll
e così via. Giusto per nominare le librerie più comunemente utilizzate per eseguire i vari porgrammi.
Le librerie DLL sono caricate dalle applicazioni Windows come se fossero quelle originali, ma in realtà contengono codice scritto per funzionare su Linux.
Il componente WineServer è un daemon centrale che gestisce molte delle funzionalità condivise tra i processi. Ad esempio, gestione degli handle, sincronizzazione tra processi, gestione delle finestre e degli oggetti, named pipes e meccanismi IPC (inter-process communication). WineServer si comporta come una sorta di “kernel utente” (proprio perché operativo in user space) che centralizza le operazioni condivise tra le varie istanze delle applicazioni Windows.
Un altro componente principale è WineLoader: si tratta del programma responsabile del caricamento degli eseguibili Windows (.exe
) e del bootstrap (avvio) dell’ambiente di esecuzione. WineLoader avvia il processo, carica le DLL necessarie, e si connette con il WineServer.
Wine implementa driver virtuali per dispositivi come schede grafiche (Direct3D tramite Vulkan od OpenGL), dispositivi audio (ALSA, PulseAudio) e dispositivi di input. Nel caso della grafica 3D, Wine utilizza vkd3d e DXVK per tradurre le API Direct3D in chiamate Vulkan, permettendo l’esecuzione di giochi moderni con accelerazione hardware nativa.
Un ambiente Windows fittizio con Wine su Linux
Il modo migliore per descrivere Wine è come un programma che crea un ambiente Windows fittizio. Questo ambiente consente di caricare in memoria eseguibili e DLL Windows. Wine simula l’ambiente Windows intercettando un gran numero di chiamate alle API di Windows, facendo credere all’applicazione di essere in esecuzione su un vero sistema Windows.
Per capire meglio come Wine realizza questa “magia”, consideriamo un semplice esempio. Immaginate di avviare un’applicazione Windows come il vecchio gioco “Campo Minato“. Ve lo ricordate, no?…
Quando questa applicazione tenta di interagire con il sistema operativo per, ad esempio, avviare un timer, chiama specifiche funzioni dell’API di Windows, come la funzione SetTimer
. In un sistema Windows nativo, questa chiamata verrebbe gestita direttamente dal kernel di Windows e dalle sue librerie. Invece, quando l’applicazione è in esecuzione sotto Wine, questa chiamata API è intercettata proprio da Wine.
DLL implementazione delle API
Abbiamo detto che Wine include proprie versioni di molte DLL di Windows, come la già citata user32.dll
, che contiene funzioni relative all’interfaccia utente, inclusa la gestione dei timer.
Quando un’applicazione Windows tenta di caricare una DLL, Wine ne fornisce la sua versione. Torniamo all’esempio della funzione SetTimer
. Nel momento in cui l’applicazione, ad esempio il buon vecchio “Campo Minato“, chiama SetTimer
facendo leva sul contenuto della DLL user32.dll
, Wine intercetta la chiamata.
Esaminando il codice sorgente di Wine, si scopre che l’implementazione di user32.dll
in Wine (nel file message.c
all’interno della directory dlls/user32
) effettua una chiamata a una funzione di livello più basso chiamata nuser_SetTimer
.
Il ruolo cruciale di WineServer
A questo punto entra in gioco un componente essenziale dell’architettura di Wine: il WineServer. Se osserviamo i processi in esecuzione quando un’applicazione Wine è attiva, noteremo la presenza del processo wineserver
. WineServer agisce come una sorta di kernel fittizio: la sua responsabilità principale è quella di gestire la sincronizzazione e la condivisione di informazioni tra più processi Wine.
Quando la funzione nuser_SetTimer
viene chiamata, essa avvia una richiesta al WineServer chiamata set_windows_timer
, passando parametri come l’intervallo del timer. WineServer si occupa quindi di gestire internamente il timer, inviando segnali appropriati all’applicazione Wine quando scade l’intervallo. È importante notare che WineServer si avvia automaticamente alla prima esecuzione di un’applicazione Wine e rimane attivo fino alla chiusura dell’ultima istanza di Wine.
Manipolazione del comportamento e debugging
La capacità di Wine di intercettare e implementare le API di Windows permette anche di modificare il comportamento delle applicazioni.
Limitandoci all’esempio del “Campo Minato“, se si agisce sul codice sorgente di Wine modificando il valore del timeout passato alla funzione set_windows_timer
, è possibile influenzare direttamente il funzionamento dell’applicazione Windows. Ad esempio, si può far scorrere il tempo molto più velocemente o molto più lentamente!
Per analizzare e comprendere il flusso di esecuzione delle applicazioni Windows sotto Wine, è disponibile un debugger specifico chiamato WineDbg. A differenza di debugger standard come GDB, WineDbg è progettato per funzionare con il modo in cui Wine carica manualmente gli eseguibili e le DLL in memoria.
Utilizzando WineDbg, gli sviluppatori e gli utenti possono impostare punti di interruzione (breakpoint), esaminare la memoria e analizzare le chiamate di funzione.
Altre funzionalità essenziali di Wine su Linux
Oltre alla gestione delle API e all’esecuzione delle applicazioni, Wine offre diverse altre funzionalità importanti:
- Utilità integrate: Wine include diverse utility da riga di comando, come
wine cmd
, che fornisce un prompt dei comandi simile a quello di Windows, ewine regedit
, che permette di visualizzare e modificare il registro di sistema di Wine. - Gestione del file system: Wine espone il file system del sistema host come l’unità Z:, mentre crea una struttura di directory che simula un ambiente Windows all’interno della directory di configurazione di Wine, tipicamente mappata come unità C:. Questa struttura include directory come
Program Files
oltre alle altre tipiche locazioni di sistema di un’installazione Windows. - Gestione del registro: Il funzionamento del registro di sistema di Windows è accuratamente ricalcato da Wine attraverso file di testo che memorizzano le informazioni di configurazione.
Come installare Wine su Linux
L’installazione di Wine su Linux varia leggermente a seconda della distribuzione in uso. Esistono diverse distribuzioni Linux che integrano Wine preinstallato per facilitare l’esecuzione di applicazioni Windows. In generale, si tratta di distro che hanno come obiettivo primario proprio quello di raccogliere il favore di chi si sta allontanando da Windows, anche nell’ottica dell’imminente fine del supporto di Windows 10.
Tra le principali distribuzioni che ospitano già Wine nel pacchetto base, citiamo ZorinOS: offre un’interfaccia utente simile a quella di Windows, rendendola ideale per gli utenti che provengono dai sistemi operativi Microsoft. Altri nomi sono Nobara e Garuda.
Impostazione dell’ambiente per installare Wine su Debian e Ubuntu
Agendo dalla finestra del terminale, per installare Wine su Linux e in particolare su distribuzioni come Debian, Ubuntu e derivate, basta innanzi tutto digitare quanto segue:
sudo apt update && sudo apt upgrade -y
sudo dpkg --add-architecture i386
I due comandi permettono di aggiornare il sistema operativo e i pacchetti installati, nonché di abilitare il caricamento di programmi basati sull’architettura utilizzata da Windows.
Su Debian si devono impartire i seguenti comandi:
sudo mkdir -pm755 /etc/apt/keyrings
sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
Il comando successivo permette di aggiungere il repository corretto (sostituire bookworm
per Debian 12 Bookworm con bullseye
o sid
a seconda della versione in uso):
sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/debian/dists/bookworm/winehq-bookworm.sources
Su Ubuntu si può procedere invece così come segue:
sudo mkdir -pm755 /etc/apt/keyrings
sudo wget -O /etc/apt/keyrings/winehq-archive.key https://dl.winehq.org/wine-builds/winehq.key
sudo wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/$(lsb_release -cs)/winehq-$(lsb_release -cs).sources
Installazione di Wine su Linux Debian e Ubuntu
A questo punto, basta impartire i due comandi che seguono per installare la versione più stabile di Wine:
sudo apt update
sudo apt install --install-recommends winehq-stable
Alla fine dell’installazione, digitando ciò che segue, Wine crea un ambiente Windows (~/.wine
) e chiederà di installare Wine Mono (per .NET) e Gecko (per il rendering Web):
winecfg
Come si vede nell’immagine, agendo sul menu a tendina nella scheda Applicazioni, è possibile specificare la versione di Windows (ad esempio Windows 10) che si desidera “replicare” all’interno dell’ambiente Linux in uso. Si può digitare nuovamente il comando winecfg
in qualsiasi momento.
Esecuzione di applicazioni Windows con Wine su Linux
Adesso, scaricando un’applicazione Windows quindi cliccando due volte sul suo eseguibile, Wine provvede ad avviarla e a renderla utilizzabile su Linux. A seconda della tipologia di programma Windows in esecuzione, Wine provvede a caricare automaticamente tutte le librerie necessarie.
Mono è un progetto open source creato da Ximian (poi acquisita da Novell, quindi da Xamarin e infine da Microsoft) per implementare la piattaforma .NET su sistemi Unix-like, in modo compatibile con Microsoft .NET Framework. Ecco, ad agosto 2024 Microsoft ha donato a Wine il progetto Mono con l’obiettivo di sostenere la comunità e migliorare l’interoperabilità delle applicazioni Windows basate su .NET.
Il bello è che se si prova ad avviare un programma Windows .NET che, ad esempio, richiede una certa versione del .NET Desktop Runtime, è possibile avviarne il download dai server Microsoft utilizzando il sistema Linux. Penserà poi Wine a tradurre tutte le richieste e ad avviare correttamente ciascuna applicazione .NET.
Nell’immagine che segue, potete notare che applicazioni Windows come Notepad++ e KeePass sono in esecuzione su un sistema Linux Q4OS basato su Debian. Non fatevi ingannare dalla barra delle applicazioni in basso e dal menu Start in stile Windows: il sistema operativo è basato su kernel Linux; ciò che abbiamo fatto è semplicemente installare uno dei tanti temi in stile Windows disponibili per la distribuzione Q4OS.
Wine e i software commerciali: CrossOver e Proton
In apertura abbiamo menzionato Alexandre Julliard, ingegnere che ha preso in mano, a suo tempo, il timone del progetto Wine. Julliard lavora per CodeWeavers, azienda che fornisce una versione commerciale di Wine: è supportata commercialmente ed è chiamata CrossOver.
A gennaio 2024, la nota sviluppatrice di CodeWeavers Elizabeth “Zeb” Figura aveva annunciato una storica patch per Wine, accreditata di miglioramenti velocistici senza paragoni nel portare i programmi Windows su Linux. CodeWeavers, infatti, contribuisce attivamente al codice di Wine, finanziandone lo sviluppo.
L’altra “variante” di Wine si chiama Proton ed è sviluppata da Valve Corporation, ottimizzata per il gaming su Steam. Integra DXVK, vkd3d e una serie di patch per migliorare la compatibilità e le prestazioni dei giochi. Grazie a Proton, molti giochi Windows sono giocabili su Linux direttamente da Steam, senza interventi manuali da parte dell’utente.
Le migliori interfacce grafiche per Wine su Linux: Bottles, PlayOnLinux e altre alternative
L’utilizzo di Wine da terminale può risultare poco agevole per utenti meno esperti o per chi desidera gestire molteplici ambienti Windows in modo più ordinato. Fortunatamente, esistono diverse interfacce grafiche (GUI) che facilitano l’installazione, la configurazione e l’esecuzione di applicazioni Windows su Linux, anche nell’ambito di configurazioni più articolate come quelle che richiedono .NET Framework, DirectX o ambienti isolati.
Bottles, GUI moderna e modulare per Wine
Bottles è attualmente la soluzione più avanzata e user-friendly per gestire Wine tramite interfaccia grafica. Basata su tecnologie moderne come Flatpak e GTK, offre un’interfaccia pulita e potente per gestire “bottiglie” (ambienti Wine isolati e configurabili). Ne abbiamo parlato nel dettaglio nell’articolo dedicato al funzionamento di Bottles.
L’applicazione è immediata da usare e offre il supporto per tante versioni di Wine (Wine Vanilla, Staging, Caffe, Proton), si occupa dell’installazione semplificata di runtime (i.e. .NET, DXVK, vcrun), supporta applicazioni Windows e giochi, integra meccanismi di backup e ripristino delle bottiglie.
L’installazione si effettua tramite Flatpak, che deve essere già installato sul sistema Linux insieme con Flathub:
flatpak install flathub com.usebottles.bottles
Una volta creata una nuova “bottiglia” con Bottles, basta scegliere il tipo di applicazione Windows da eseguire (Gaming, Application, Custom) quindi trascinare un file eseguibile nella finestra o cliccare su Run Executable.
PlayOnLinux, alternativa storica con script integrati
PlayOnLinux è un’interfaccia GUI che esiste da anni e che facilita l’installazione di software e giochi Windows utilizzando script preconfigurati. Ogni applicazione è eseguita in un ambiente Wine separato, grazie anche a una vasta libreria di script predefiniti (Office, Adobe, Steam…).
Il programma assicura una facile gestione delle versioni Wine e un facile supporto per .NET, DirectX, vcrun,… tramite il modulo chiamato winetricks
.
L’installazione di PlayOnLinux su Debian/Ubuntu può essere avviata con il comando che segue:
sudo apt install playonlinux
WineZGUI, una GUI minimale e diretta
Come ulteriore alternativa, si può volgere lo sguardo anche su WineZGUI. Si tratta di un’interfaccia open source per Wine focalizzata su semplicità e leggerezza.
Garantisce l’installazione rapida dei programmi Windows a partire dai rispettivi eseguibili, non dipende da ambienti grafici complessi e assicura una perfetta gestione dei log di Wine.
Può essere installata in locale clonando il repository GitHub ufficiale:
git clone https://github.com/Gictorbit/wineZGUI
cd wineZGUI
./wineZGUI.sh
Lutris: pensata per il gaming, ma utile anche per le applicazioni Windows
Lutris è una piattaforma pensata per i giochi, ma può gestire qualsiasi eseguibile Windows. Integra supporto per Wine, Proton, DOSBox, ScummVM e altro ancora.
Tra le caratteristiche principali, spicca l’approccio guidato per l’installazione di giochi e software con la possibilità di beneficiare dell’integrazione con Steam, Epic Games, GOG.
Per installare Lutris su Ubuntu e derivate, basta digitare quanto segue nella finestra del terminale:
sudo add-apt-repository ppa:lutris-team/lutris
sudo apt update
sudo apt install lutris