"Eseguire applicazioni x86/x86-64 su Fedora Asahi Remix"

Ci sono molte applicazioni x86/x86-64 legacy che gli utenti desiderano eseguire su piattaforme arm64, inclusi giochi e applicazioni Windows. Per supportare questo scenario in Fedora Asahi Remix, abbiamo integrato uno stack di componenti esistenti e personalizzati per rendere possibile l’esecuzione trasparente di app x86/x86-64 direttamente su Linux arm64.

Poiché le piattaforme Apple utilizzano nativamente una dimensione della pagina di 16K e i processori x86/x86-64 utilizzano una dimensione della pagina di 4K, questo aspetto è particolarmente complesso, dato che le applicazioni x86/x86-64 generalmente non funzionano quando si interfacciano con un kernel host che richiede un allineamento della pagina a 16K. Per colmare questo divario, stiamo utilizzando una microVM per eseguire un kernel Linux guest completamente separato in modalità con dimensione della pagina a 4K. Per mantenerlo il più trasparente possibile, l’ambiente guest è progettato per essere il più vicino possibile all’ambiente host, e utilizziamo il passthrough nativo della GPU di contesto per avere una grafica ad alte prestazioni all’interno del guest.

Lo stack è composto da questi componenti:

  • muvm (pacchetto: muvm), il nostro avviatore di microVM personalizzato basato su libkrun. Questo include anche componenti per il forwarding di X11 e il proxying dei dispositivi di input HID.

  • FEX-emu (pacchetto: fex-emu), un emulatore x86/x86-64 veloce in spazio utente incentrato sulla correttezza.

  • Il Fedora FEX RootFS (pacchetto: fex-emu-rootfs-fedora), che fornisce le dipendenze delle librerie x86/x86-64 comuni utilizzate dalle applicazioni emulate.

  • mesa (pacchetti: mesa-fex-emu-overlay-i386 e mesa-fex-emu-overlay-x86-64), compilato per le architetture x86/x86-64 e pacchettizzato come un overlay FEX RootFS. Questo fornisce il supporto OpenGL/OpenCL/Vulkan per le GPU Apple.

Abbiamo anche il nostro wrapper per Steam che automatizza il processo di installazione e avvio di Steam all’interno dello stack della microVM. Quando si eseguono giochi per Windows tramite Steam, dietro le quinte vengono utilizzati questi componenti open-source:

  • Proton, una distribuzione di Wine orientata al gaming.

  • dxvk, un livello di traduzione che converte le API di Windows DirectX 8 - DirectX 11 in Vulkan.

  • vkd3d-proton, un livello di traduzione che converte le API di Windows DirectX 12 in Vulkan.

Ambito

Questo stack tecnologico è rivolto principalmente all’esecuzione di giochi x86 e x86-64, ma può essere utilizzato anche per eseguire applicazioni di produttività non videoludiche. Quando possibile, dovresti preferire le alternative native rispetto all’emulazione. Per maggiori informazioni, leggi questa voce delle FAQ.

L’ambito di questa soluzione è limitato alle applicazioni x86 e x86-64 portatili destinate a essere eseguite dalla tua home directory (o, al massimo, scompattate manualmente in /opt dall’utente), inclusi gli AppImage. Non è destinata a eseguire applicazioni x86-64 che devono essere installate come pacchetti di sistema, che sono compilate per una specifica distribuzione Linux o che richiedono l’installazione di complesse dipendenze di sistema, oppure che richiedono l’esecuzione di programmi di installazione dedicati come root.

In particolare, l’ambiente x86-64 non è un file system radice autosufficiente, bensì un overlay minimo e immutabile sovrapposto al file system radice arm64 esistente. Ciò significa che non è possibile apportarvi modifiche, installare pacchetti aggiuntivi, ecc. All’interno dell’ambiente x86-64 non è disponibile alcun tipo di accesso root.

Utilizzo

Steam

Basta usare dnf install steam per installare il nostro wrapper per Steam, e poi avviare Steam dal lanciatore del desktop (o tramite il comando steam) per scaricare e installare Steam. Questo installerà automaticamente tutte le dipendenze necessarie.

Altre applicazioni

Per installare lo stack di emulazione da solo, usa dnf install fex-emu. Questo scaricherà automaticamente le dipendenze richieste.

Non puoi eseguire direttamente le applicazioni x86-64 dall’host (per ora), poiché devono essere avviate dalla microVM. Per farlo, esegui muvm -- /percorso/dell/eseguibile. Devi utilizzare un percorso assoluto, dato che attualmente muvm non mantiene la directory di lavoro corrente. In questo ambiente, il supporto binfmt del kernel è già configurato per utilizzare FEX per eseguire le applicazioni x86/x86-64, quindi dovresti essere in grado di avviarle normalmente.

Se la tua applicazione utilizza uno script di avvio della shell (launcher shell script) invece di eseguire direttamente il suo binario principale, dovresti eseguirla tramite FEXBash. Per esempio, usa muvm -- FEXBash /percorso/del/launcher.sh. In questo modo si assicura che la shell venga eseguita nell’ambiente emulato e che alcuni comandi di shell critici si comportino come farebbero per le applicazioni x86-64, rendendo più probabile che lo script funzioni come previsto.

Puoi anche usare muvm -- bash per avviare una shell arm64 all’interno della MicroVM a 4K, oppure muvm -- FEXBash per avviare una shell x86-64. La shell x86-64 si comporterà in modo simile alla shell arm64 e la maggior parte dei comandi verrà eseguita come binari arm64, ma alcuni (come ls) verranno eseguiti in emulazione, il che ti permette di "vedere" il mondo così come lo vedono le applicazioni x86-64.

Come funziona

muvm crea una macchina virtuale che condivide il più possibile con il sistema operativo host. All’interno della VM, il file system radice è lo stesso del file system radice dell’host, con le seguenti eccezioni:

  • /dev, /sys e /proc sono privati del guest, a eccezione di /dev/shm che è condiviso con l’host, consentendo alle applicazioni dell’host e del guest di condividere la memoria in modo coerente.

  • Anche /run è privato del guest

  • Le immagini rootfs e di overlay di FEX-emu sono montate sotto /run/fex-emu/, con il rootfs di overlay combinato disponibile in /run/fex-emu/rootfs.

  • /usr/share/fex-emu e /usr/local/share/fex-emu sono sovramontati con un tmpfs per iniettare un file Config.json di FEX idoneo all’uso all’interno della VM

  • Un tmpfs è montato anche su /tmp/.X11-unix, quindi i socket del server X11 sono privati della VM

  • L’intera visualizzazione del file system dell’host è disponibile in /run/muvm-host, inclusi eventuali montaggi sovrapposti. Per esempio, puoi accedere alla directory /run dell’host tramite /run/muvm-host/run. (Nota: /run/muvm-host/dev esiste ma non farà ciò che speri. I dispositivi dell’host non sono disponibili nel guest.)

Questo significa che /usr, /home, /etc, /opt, /var, /tmp e qualsiasi altra directory nella radice del tuo file system sono condivise tra il guest e l’host. Il sistema operativo guest aarch64 non esegue un proprio file system radice, ma esegue esattamente gli stessi binari del tuo sistema operativo host.

Inoltre, FEX stesso utilizza il file system montato in /run/fex-emu/rootfs come suo RootFS virtuale. Questo significa che le applicazioni x86/x86-64 (e solo quelle) vedranno il contenuto di quella directory sovrapposto al file system radice. È in questo modo che rendiamo disponibili le librerie x86/x86-64 a tali applicazioni, continuando comunque a condividere la maggior parte dei contenuti del file system.

Quando muvm si avvia, registra FEX come provider binfmt, in modo che le applicazioni x86/x86-64 vengano eseguite in modo trasparente attraverso di esso. All’avvio, FEX rileverà che il supporto TSO è disponibile sulla piattaforma Apple Silicon (anche all’interno della VM) e lo abiliterà automaticamente per un’emulazione accurata e più veloce.

I punti di montaggio (mountpoint) dell’host vengono propagati al guest nel momento in care vi si accede per la prima volta, in modo del tutto automatico. Questo consente alle applicazioni del guest di distinguere i diversi file system, mantenendo corretta la semantica dei dispositivi e degli inode. Se hai una partizione montata sull’host in /mnt/steam e lanci mount all’interno del guest, all’inizio non la vedrai. Se esegui ls /mnt/steam e poi lanci di nuovo mount, il montaggio sarà magicamente apparso nell’elenco dei montaggi. Questo comportamento è normale e funziona esattamente come previsto!

Problemi noti

Le prestazioni non sono ottimali

Poiché questo progetto è ancora nelle sue fasi iniziali, per il rilascio iniziale abbiamo puntato alla correttezza. L’ottimizzazione delle prestazioni avverrà nel corso del tempo. Siamo a conoscenza di diverse modifiche che dovrebbero portare significativi miglioramenti prestazionali e ci stiamo lavorando attivamente!

Per i giochi Windows da DX8 a DX11 in esecuzione sotto Proton in particolare, potresti voler provare WineD3D invece di DXVK. WineD3D utilizza OpenGL invece di Vulkan come backend, e potrebbe avere prestazioni migliori grazie a ottimizzazioni presenti nel nostro driver OpenGL che non sono disponibili su Vulkan. Per abilitarlo, modifica le opzioni di avvio di Steam in PROTON_USE_WINED3D=1 %command%. Nota che DXVK tende ad avere una compatibilità migliore, quindi si tratta di un compromesso. Facci sapere quali giochi funzionano meglio utilizzando l’uno o l’altro backend!

I vecchi giochi a 32 bit potrebbero funzionare molto lentamente se fanno un uso intenso dell’unità a virgola mobile x87 a 80 bit, poiché queste operazioni devono essere emulate via software per garantire la piena compatibilità (lo stesso problema si verifica con Rosetta su macOS). È possibile avviare questi giochi con l’emulazione a virgola mobile a 64 bit basata su hardware, che è meno accurata ma molto più veloce. Per farlo, modifica le opzioni di avvio di Steam in FEX_X87REDUCEDPRECISION=1 %command%. Questa modalità può causare lievi problemi in alcuni giochi a causa della minore precisione, ma la maggior parte dovrebbe funzionare correttamente (e molto più velocemente).

La VM utilizza molta RAM

Per consentire alle applicazioni guest di utilizzare un’elevata quantità di RAM (come richiesto da alcuni giochi moderni), per impostazione predefinita muvm permette al guest di utilizzare fino all'80% della RAM del sistema. Questo significa anche che una parte di essa verrà occupata dalla page cache del guest, facendo apparire all’host come se la VM stesse consumando la maggior parte della RAM di sistema. muvm ha la capacità di ridurre l’utilizzo della page cache del guest all’aumentare della pressione della memoria sull’host, quindi se si aumenta l’utilizzo della memoria dell’host, la VM dovrebbe ridurre di conseguenza il proprio utilizzo (purché sia in grado di scartare la RAM della cache inutilizzata).

Sulle macchine con un quantitativo di RAM inferiore (16 GB o meno), consigliamo di non eseguire applicazioni host pesanti mentre la VM è in uso. Non raccomandiamo l’esecuzione di giochi complessi su macchine con 8 GB di RAM.

Per ispezionare l’utilizzo della memoria della VM mentre è in esecuzione, usa muvm -ti -- free. Puoi anche eseguire muvm -ti -- htop (se hai htop installato) per ottenere informazioni più dettagliate, oppure sostituirlo con lo strumento di informazioni di sistema che preferisci.

Se desideri limitare l’utilizzo massimo della memoria della MicroVM, puoi configurare l’allocazione della RAM del guest con il parametro muvm --mem=DIMENSIONE.

Non riesco ad accedere ai supporti montati sotto /run/media all’interno della VM

Questo non funziona (nemmeno tramite /run/muvm-host/run/media) a causa della mancanza del supporto per le ACL POSIX in libkrun in questo momento. È necessario montare manualmente tutti i dischi che si desidera utilizzare all’interno della VM, ad esempio sotto /mnt.

FAQ

È come Rosetta su macOS?

Questo è quanto di più vicino a Rosetta si possa ottenere! La differenza principale è che Rosetta aggira il problema della dimensione delle pagine affidandosi invece al supporto per dimensioni di pagina multiple del kernel XNU per i processi utente, quindi non ha bisogno di una VM. Sebbene in teoria non sarebbe del tutto impossibile fare in modo che Linux supporti dimensioni di pagina miste, si tratterebbe di un progetto enorme che probabilmente richiederebbe anni per essere completato, e non è affatto chiaro se una tale modifica verrebbe accettata upstream (Linux non ha ancora nemmeno la selezione della dimensione delle pagine all’avvio all’interno di un singolo kernel!).

A parte il problema della dimensione delle pagine, FEX e Rosetta sono tecnologie paragonabili (entrambe sono emulatori, a prescindere da ciò che il marketing di Apple voglia far credere). Sia FEX che Rosetta utilizzano la caratteristica peculiare delle CPU Apple Silicon che è in assoluto la più importante per le prestazioni di emulazione x86/x86-64: la modalità TSO. Grazie a questa funzionalità, FEX può offrire un’emulazione x86/x86-64 veloce e accurata sui sistemi Apple Silicon.

Perché non usare semplicemente un kernel host a 4K?

Mentre i sistemi Apple Silicon supportano pagine di CPU a 4K, il resto dell’hardware (IOMMU, GPU) funziona esclusivamente con pagine a 16K. Il kernel Linux non si adatta bene a questo ambiente, poiché generalmente presuppone che la dimensione delle pagine della CPU sia pari o superiore a quella delle pagine della IOMMU. In passato abbiamo utilizzato alcune patch del kernel per far funzionare parzialmente questo sistema, ma erano instabili e incomplete, motivo per cui abbiamo abbandonato l’approccio. Anche se funzionasse correttamente, l’esecuzione dell’intero sistema con pagine a 4K ha un impatto misurabile sulle prestazioni, pertanto non distribuiremmo mai kernel a 4K per impostazione predefinita. Di conseguenza, per eseguire app x86/x86-64 gli utenti dovrebbero cambiare manualmente il proprio kernel e riavviare, il che è piuttosto scomodo.

Perché non usare box64?

box64 e FEX-Emu hanno approcci differenti all’emulazione, con FEX-Emu che punta a una maggiore correttezza per impostazione predefinita (ma richiede una configurazione più complessa), mentre box64 mira a coprire più casi d’uso pronti all’uso (come l’esecuzione di un sottoinsieme di applicazioni direttamente su un kernel a 16K senza una VM, utilizzando alcuni stratagemmi). Abbiamo scelto FEX-Emu per il nostro stack perché riteniamo che il suo approccio garantirà una maggiore compatibilità, ma entrambi hanno la loro utilità. box64 è pacchettizzato in Fedora, quindi incoraggiamo gli utenti a provarlo (sia nativamente che all’interno di muvm) e a farci sapere come si comporta nel confronto!

La mia applicazione x86-64 o x86 non trova alcune librerie di sistema, cosa devo fare?

Il nostro RootFS immutabile contiene un ampio set di librerie x86-64 e x86 comuni che vengono utilizzate frequentemente come dipendenze, ma non possiamo includere ogni possibile libreria. Puoi visualizzare l’elenco dei pacchetti qui.

Se la libreria mancante è relativamente semplice, comune, priva di dipendenze o con dipendenze molto elementari, e non aggiungerebbe molto peso alle nostre immagini del RootFS, invia una PR alla repository collegata sopra in modo da poterla includere nelle versioni future del RootFS. Assicurati di specificare quale applicazione richiede tale libreria e i motivi per cui ritieni che dovremmo includerla.

Se la tua applicazione richiede un framework complicato (come Qt) o una libreria insolita e di nicchia, allora non è concepita come un’applicazione "portabile" e non ci si aspetta che funzioni immediatamente sulla maggior parte dei sistemi. Per aggirare il problema, puoi scaricare manualmente le libreria mancanti, estrarle nella tua directory home e usare LD_LIBRARY_PATH per fare in modo che la tua applicazione le trovi. Puoi utilizzare il seguente comando per scaricare gli RPM x86-64 dalla tua installazione Fedora arm64:

Puoi quindi usare rpmdev-extract per estrarre il contenuto dell'RPM, e poi configurare LD_LIBRARY_PATH come appropriato.

È anche possibile sovrapporre gli RPM nel RootFS esistente, sebbene questa debba essere considerata una funzionalità avanzata. Una volta ottenuto un RPM, puoi convertirlo in un'immagine erofs usando questi comandi:

``` rpm2archive -n mypackage.rpm mkfs.erofs --tar=f mypackage.rpm.erofs mypackage.rpm.tar ```

Successivamente, puoi avviare manualmente muvm con le immagini erofs di base e la tua immagine erofs personalizzata sovrapposta, in questo modo:

muvm \ -f /usr/share/fex-emu/RootFS/default.erofs \ -f /usr/share/fex-emu/overlays/mesa-x86_64.erofs \ -f /usr/share/fex-emu/overlays/mesa-i386.erofs \ -f mypackage.rpm.erofs \ <your muvm arguments here>

Questo sovrapporrà il pacchetto aggiuntivo sul RootFS utilizzato per FEX. Tieni presente che questo potrebbe o meno funzionare come previsto, e non deve essere considerato una soluzione supportata.

=== Steam dice che steamwebhelper è andato in crash, cosa faccio?

Lascialo semplicemente riavviare e dovrebbe funzionare al secondo tentativo. Steam ha un timeout per steamwebhelper e, quando viene eseguito sotto emulazione, l'avvio è abbastanza lento da far scadere il timeout. Di solito questo accade solo a un avvio a freddo.

=== Non riesco a scaricare/avviare determinati giochi su Steam

Assicurati che Steam Play sia abilitato per tutti i giochi. Dovrebbe trovarsi sotto Menu > Impostazioni > Compatibilità > Abilita Steam Play per tutti gli altri titoli. Riavvia Steam una volta abilitato.

=== La pressione dei tasti fa smettere di rispondere il touchpad

Questo è causato dalla funzione del touchpad 'Disabilita durante la digitazione'. Puoi disattivarla nelle impostazioni del touchpad/input del tuo ambiente desktop.

=== Posso eseguire applicazioni Windows al di fuori di Steam?

Al momento, non supportiamo l'esecuzione di app Windows al di fuori di Steam poiché Wine non-Proton non funziona ancora su Fedora. Stiamo lavorando per risolvere il problema sottostante di FEX, quindi prevediamo di supportare questa funzionalità relativamente presto.

Nel frattempo, puoi utilizzare Proton di Steam per eseguire applicazioni Windows non di Steam direttamente da Steam.

=== Posso eseguire applicazioni Linux x86-64/x86?

I giochi Linux nativi dovrebbero generalmente funzionare sotto muvm, a patto che siano autosufficienti e non dipendano da librerie complesse del sistema ospitante (forniamo un'ampia selezione di dipendenze comuni, ma non qualsiasi cosa esistente al mondo).

=== Wayland è supportato?

Wayland non è supportato all'interno della VM in questo momento. Poiché la maggior parte delle applicazioni x86/x86-64 legacy che le persone vogliono eseguire sono applicazioni X11, ci stiamo concentrando prima sul supporto X11. Ciò significa che al momento non è possibile eseguire app Wayland native all'interno della VM. Naturalmente, il desktop host è comunque un desktop Wayland e il supporto X11 è fornito da XWayland.

=== Posso accedere all'hardware dalle applicazioni in esecuzione all'interno della microVM?

Poiché la VM non esegue il passthrough di nessun hardware dell'host a eccezione della GPU e del filesystem virtuale, non potrai utilizzare applicazioni che richiedono l'accesso diretto all'hardware. Utilizziamo il passthrough software per le seguenti interfacce:

- Protocollo X11 (schermo, tastiera, mouse)
- Gamepad tramite passthrough hid/uinput
- I/O audio tramite il protocollo socket PulseAudio footnote:[Questo funziona con PipeWire in esecuzione sull'host tramite pipewire-pulse, come installato di default. *Non* è necessario e non si dovrebbe installare PulseAudio vero e proprio, poiché ciò comprometterebbe il supporto degli altoparlanti!]

Stiamo valutando la possibilità di effettuare il passthrough di PipeWire, il che consentirà l'utilizzo delle webcam all'interno della VM.

=== Posso utilizzare i metodi di input (IME) nelle applicazioni all'interno della microVM?

Puoi utilizzare il classico sistema di metodi di input *xim* utilizzato in X11. muvm dovrebbe già configurare le variabili d'ambiente in modo appropriato per far sì che funzioni con le applicazioni Qt e GTK (caricando il plugin "xim"), a patto che il framework del metodo di input che stai utilizzando sul sistema host lo supporti. Lo abbiamo testato con *fcitx5* e Steam in esecuzione su KDE Plasma.

In futuro, una volta che il passthrough di Wayland sarà supportato, il meccanismo nativo del protocollo di input di Wayland dovrebbe funzionare con qualsiasi framework di metodi di input dell'host (tramite un plugin solitamente chiamato "wayland"). Non ci sono piani per supportare metodi di input non basati sul window system (come i plugin diretti "ibus" e "fcitx"), poiché ciò richiederebbe la distribuzione di librerie condivise x86-64 per tutti i possibili metodi di input all'interno del sistema x86-64 virtuale immutabile, e richiederebbe inoltre il proxy dei loro protocolli personalizzati, il che è infattibile.

=== Questa è una VM simile a Qemu/libvirt/UTM/Parallels/VMWare/VirtualBox/ecc.?

No, muvm non funziona come una VM tradizionale ad intero sistema. Sebbene utilizzi a sua volta KVM come backend per una virtualizzazione efficiente, il concetto è molto diverso dalle VM tradizionali che eseguono sistemi operativi ospiti completamente separati. Il kernel ospite è un [https://github.com/containers/libkrunfw](https://github.com/containers/libkrunfw)[kernel speciale] ottimizzato per avviarsi in una frazione di secondo, e il monitor della VM effettua il passthrough del filesystem dell'host quasi così com'è. Non c'è un passthrough hardware di basso livello (USB, ecc.) e ci concentriamo invece sul passthrough di protocolli software di livello superiore, come X11/Wayland. La VM non esegue un proprio sistema di init autonomo, ma solo un codice di avvio minimale. Ciò significa che l'ambiente all'interno della VM dovrebbe "sembrare" lo stesso del sistema operativo host dal punto di vista delle applicazioni, solo con una dimensione della pagina di 4K anziché di 16K.

=== I browser funzionano all'interno della VM ospite?

Sì, ma funzioneranno in modalità X11. Tuttavia, c'è un avvertimento: *le istanze del browser all'interno dell'ospite non possono comunicare con le istanze del browser all'esterno dell'ospite, ed è pericoloso eseguire lo stesso profilo del browser sia nell'ospite che nell'host*.

Per evitare questi problemi, muvm configura una variabile d'ambiente per forzare Firefox a utilizzare un profilo dedicato quando viene avviato all'interno della VM. Ciò significa che le applicazioni che avviano un browser (ad esempio per scopi di accesso o di documentazione) funzioneranno come previsto, ma Firefox si avvierà utilizzando un profilo dedicato senza accedere ai tuoi cookie, alla cronologia, ecc.

CAUTION: Se avvii simultaneamente lo stesso profilo del browser nell'ospite e nell'host, i dati del tuo profilo potrebbero corrompersi. Se il tuo browser predefinito non è Firefox, e stai utilizzando app emulate che potrebbero avviare inavvertitamente il tuo browser predefinito, ti consigliamo vivamente di chiudere tutte le finestre del browser prima di utilizzare muvm o di configurare manualmente dei profili separati.

=== Posso usare sudo all'interno della VM?

Poiché il monitor della VM viene eseguito con l'identità del tuo utente, non può ottenere i privilegi di root. "root" all'interno della VM ha comunque solo i privilegi del tuo utente, quindi sudo non ha molto senso (e infatti non funziona). Consigliamo di installare il software che desideri utilizzare con muvm+FEX all'interno della tua directory home. Per il software progettato per essere installato sotto /opt o simili, consigliamo di eseguire i passaggi di installazione manualmente sul sistema operativo host, per poi avviare semplicemente l'app sotto muvm.

"Se hai bisogno di accedere a una shell root all'interno della VM per scopi di debug, puoi eseguire `muvm -tip 3335 +++--+++ bash`. Tieni presente che, nonostante tu sia "root", non sarai in grado di modificare la maggior parte dei file di sistema di proprietà di root, e tutti i file creati saranno in realtà di proprietà dell'identità del tuo utente non-root. Una shell root è utile principalmente per fare cose come lo `strace` di altri processi o per modificare le impostazioni di configurazione del kernel o della rete dell'ospite (ma queste modifiche non persisteranno al riavvio della VM)."

=== Le applicazioni all'interno della VM possono comunicare con le applicazioni all'esterno della VM?

La comunicazione è per lo più limitata al filesystem dell'host. La VM condivide la tua directory home (e di fatto la maggior parte del filesystem) con l'host, quindi qualsiasi file creato da un lato sarà visibile dall'altro.

Grazie a virtiofs-DAX, la comunicazione tramite memoria condivisa (`/dev/shm`) è disponibile anche tra le app ospiti e le app host. Questo viene utilizzato, ad esempio, dal codice di inoltro di X11.

È anche possibile condividere l'audio tra le app dell'host e quelle dell'ospite utilizzando il supporto per l'inoltro di PulseAudio. Ad esempio, puoi registrare l'audio dell'ospite utilizzando un'app di registrazione sull'host e registrando dal dispositivo "Monitor" del sistema. Puoi anche configurare sink/source virtuali nell'host utilizzando i normali meccanismi di PipeWire, e indicare alle app ospiti di utilizzarli per l'I/O audio per avere un instradamento e un'elaborazione audio personalizzati. Nota che il protocollo nativo di PipeWire non viene passato, ma solo il protocollo PulseAudio che è più limitato (ma più comunemente usato dalle applicazioni). Le applicazioni ALSA sono supportate tramite il plug-in `pulse`.

"Se utilizzi un compositore host che supporta l'XWayland video bridging (come KDE Plasma / KWin), sarai in grado di condividere lo schermo / catturare lo schermo dalla VM, inclusi gli schermi host completi e le finestre Wayland. Assicurati che l'app in esecuzione supporti la cattura di finestre/schermi XComposite "classica". Quando avvii la condivisione dello schermo, potrai selezionare direttamente le finestre delle applicazioni X11 o scegliere la finestra virtuale "Xwayland Video Bridge". Quando lo farai, KDE ti chiederà automaticamente quale finestra o schermo effettivo desideri condividere."

=== Perché la VM ha meno core CPU?

Per impostazione predefinita, `muvm` passa tante CPU quanti sono i core di prestazioni (performance core) presenti sulla macchina host, e associa tali vCPU ai core di prestazioni fisici. Poiché lo scheduler della CPU dell'host non ha visibilità sullo scheduler della CPU dell'ospite, questo garantisce che le prestazioni siano costanti. È possibile modificare questo comportamento con l'opzione `muvm --cpu-list=CPU_LIST`.

=== Come posso utilizzare un'unità esterna come cartella della libreria di Steam?

Segui questi passaggi per configurare un'unità esterna per Steam:

. Formatta la tua unità esterna utilizzando un filesystem nativo di Linux, come ext4.
+
NOTE: FAT32, exFAT e altri filesystem privi di supporto per i permessi di Linux non funzioneranno.

. Monta la tua unità manualmente in una directory accessibile a muvm, come `/mnt/steam`.
+
NOTE: Consigliamo di montare l'unità manualmente (ad es. `sudo mount /dev/sdX1 /mnt/steam`, dove `sdX1` è il file di dispositivo della tua unità). Se configuri l'unità per montarsi automaticamente tramite `/etc/fstab`, il sistema non si avvierà qualora l'unità non fosse collegata.
+
NOTE: Il punto di montaggio predefinito per le unità montate tramite l'ambiente desktop (udisks) non funzionerà in questo momento.

. Assicurati che la radice del filesystem sia accessibile al tuo utente normale:
+
`sudo chown $\{USER}: /mnt/steam`

. Crea una cartella vuota chiamata `steamapps` nella radice del punto di montaggio:
+
`mkdir /mnt/steam/steamapps`

. Avvia Steam normalmente

. Fai clic sulla scheda Libreria, quindi fai clic sull'icona dell'ingranaggio (impostazioni)

. Seleziona *Spazio di archiviazione* nel menu a sinistra, fai clic sulla casella combinata nella parte superiore del pannello e seleziona *Aggiungi unità*.

. Sfoglia fino al punto di montaggio della tua unità (`/mnt/steam`), in modo che l'unica cartella visibile nella finestra dell'elenco di selezione dei file sia la cartella vuota `steamapps` all'interno, quindi (senza effettuare ulteriori selezioni) fai clic sul pulsante *Seleziona*.

Ora dovresti essere in grado di selezionare la nuova posizione di scaricamento, impostarla come predefinita e scaricare i giochi al suo interno.