X server e Desktop App con Windows Subsystem for Linux

Nel codice etico del bravo tecnico, ed ancor più in quello del consulente informatico, esiste la rigida regola di utilizzare e proporre sempre soluzioni supportate dai produttori. Perché tenere un’azienda ferma minuti, ore, o addirittura giorni perché i sistemi si bloccano, non rispondono quello che ci aspettiamo, e non poter chiedere aiuto a nessuno non è mai piacevole.

Ci sono delle situazioni, però, in cui utilizzare soluzioni non supportate è tollerato, se non addirittura una necessità. I motivi possono essere i più disparati: hardware o software oltre la data di “End of Support” a cui non esiste un’alternativa, budget limitato, incompatibilità con sistemi esistenti, e mille altre ragioni più o meno tecniche.

Immaginiamo ad esempio di dover dismettere un vecchissimo computer linux che ospita il gestionale di un commercialista. Il gestionale non viene più utilizzato, ma sarebbe comodo poterne utilizzare alcune funzionalità nel caso ce ne fosse bisogno. Il gestionale è scritto per funzionare su una macchina Linux con interfaccia grafica, ed il commercialista ci chiede se possiamo spostare questo software sul suo client Windows10 prima di dismettere il vecchio computer.

Poiché ormai avendo più volte letto l’articolo Windows Subsystem for Linux: finalmente in una release ufficiale sappiamo installare ed utilizzare Windows Subsystem for Linux (WSL), proviamo ad installare tutto il necessario per far girare dei software Linux che utilizzano una interfaccia grafica. Proviamo quindi a configurare un server X su Ubuntu, ed utilizzarlo per lanciare degli eseguibili.

Ci ritroviamo quindi nella condizione di dover utilizzare una funzionalità non supportata: WSL, infatti, è pensato per poter utilizzare degli eseguibili Linux in ambiente Windows 10 limitatamente alla riga di comando, e dobbiamo tenere presente alcune cose mentre cerchiamo di mettere a punto questa forzatura:

  • Il server X effettua delle chiamate al Kernel Linux, che nel nostro caso è un sistema formato da delle librerie per la traduzione delle chiamate di sistema ed un Kernel Windows. Il “sistema di traduzione” non è pensato per gestire delle Desktop App
  • L’ambiente che utilizziamo in WSL è in User Mode, quindi qualsiasi chiamata che richiede un livello di esecuzione più basso (Kernel mode) fallisce
  • La gestione dei Bus di Linux è completamente diversa da quella di Windows, quindi molte “istruzioni” potrebbero non funzionare correttamente

Considerando, però, che non abbiamo niente da perdere proviamo ad installare X server – il gestore grafico di Linux. X server (conosciuto anche semplicemente come X) è il servizio di base per l’utilizzo di qualsiasi interfaccia grafica; essendo Linux un sistema open, infatti, esistono molte interfacce grafiche diverse. Uno dei nostri problemi, quindi, sarà anche cercare l’interfaccia più adatta al nostro scopo. Io ho scelto Unity ed LXDE, laprima perché è prodotta da Canonical per Ubuntu, e per questo motivo mi aspetterei maggiore compatibilità, la seconda perché è molto leggera e mi piace graficamente.

Avvio delle applicazioni in finestra

Passiamo finalmente alla pratica, e grazie ad apt-get installiamo da root i pacchetti ubuntu-desktop e unity.

Per guadagnare i privilegi di root eseguiamo da utente

sudo bash

ed inseriamo la password scelta in fase di configurazione di WSL

Installiamo quindi i pacchetti con

apt-get install ubuntu-desktop unity


Il sistema propone un download di 569MB (potrebbe variare a seconda delle versioni), che diventeranno 2Gb di software. Confermiamo ed attendiamo speranzosi…

Al termine dell’installazione possiamo notare che ci sono degli errori relativi al dbus, il sottosistema di scambio messaggi tra applicazioni presente sul sistema operativo Linux, che utilizza funzioni non ancora implementate su WSL. In mancanza di questo, le funzionalità grafiche non saranno disponibili; vediamo quindi come modificare la configurazione del servizio in questione per renderlo utilizzabile.

Quello che andremo a fare è modificare il “mezzo” su cui viaggiano questi messaggi dai socket linux predefiniti (e non implementati), al prococollo TCP. E’ necessario quindi sostituire nel file

/etc/dbus-1/session.conf,

La riga

<listen>unix:tmpdir=/tmp</listen>

con

<listen>tcp:host=localhost,port=0</listen>

E’ possibile effettuare la sostituzione con un editor di testo oppure con il comando:

sudo sed -i 's$<listen>.*</listen>$<listen>tcp:host=localhost,port=0</listen>$' /etc/dbus-1/session.conf

Installiamo ora il tool per la configurazione dell’interfaccia grafica Unity, chiamato per brevità ccsm

apt-get install compizconfig-settings-manager

L’installazione di pochi mega termina senza problemi e siamo pronti per provare ad avviare il nostro server grafico.

Generalmente una macchina Linux ha la possibilità di “disegnare” le finestre attraverso i messaggi scambiati tra il server X e il sottosistema video. Il kernel Windows, però, – ricordiamo che l’unico kernel in uso è quello Windows, non essendo WSL una macchina virtuale- non è in grado di comprendere questi messaggi, ed abbiamo la necessità di installare un software per scambiare i messaggi con il server X di Linux.

In termini pratici per visualizzare l’ambiente desktop abbiamo bisogno di utilizzare un X server anche sulla macchina Windows, e siamo costretti a ricorrere a software di terze parti (ce ne sono molti open source); è proprio questo il motivo per cui questa soluzione non è attualmente supportata da Microsoft.

Per questo esempio utilizziamo vcXsrv (https://sourceforge.net/projects/vcxsrv/), ma nessuno ci vieta di provare CygWinX (http://x.cygwin.com/), Xming (https://sourceforge.net/projects/xming/) oppure mobaXterm (http://mobaxterm.mobatek.net/).

Quindi scarichiamo da https://sourceforge.net/projects/vcxsrv/files/latest/download ed installiamo banalmente l’applicazione vcXsrv (oggi alla versione 64.1) con le opzioni di default.

Lanciamo quindi vcXrsv dopo averlo cercato nelle app ed esportiamo la variabile display da Windows bash per presentare all’X server di Windows le finestre che andremo ad aprire. Eseguiamo quindi:

export DISPLAY=:0

Proviamo ad aprire qualche tool Linux con interfaccia grafica, iniziando con qualcosa di semplicissimo:

xcalc

Si, è vero, c’è Windows Calc che è molto più comodo, ma non dimentichiamo che stiamo facendo tutto questo per il nostro povero commercialista. Proviamo a spingerci un po’ oltre:

Da Windows bash proviamo a vedere cosa succede digitando:

firefox

Beh, abbiamo un bel po’ di warning che ci avvisano che non è possibile utilizzare il multithreading, ma abbiamo un browser attivo e funzionante.

Visualizzazione del Desktop Linux

Vediamo cosa succede se installiamo un server VNC su WSL e proviamo a connetterci con il proprio viewer; questa volta utilizzeremo LXDE, un altro ambiente Desktop Open Source per Linux. Installiamo LXDE e server vnc con un semplice

sudo apt-get install xorg lxde-core tightvncserver

avviamo per la prima volta il servizio vnc ed impostiamo una password

tightvncserver :1


Ora la configurazione è stata creata e possiamo stoppare vnc server:

tightvncserver -kill :1

e possiamo modificare il nostro file di configurazione per creare la sessione server utilizzando LXDE; è sufficiente aprire con un editor di testo il file xstartup

nano ~/.vnc/xstartup

La notazione ~ serve ad indicare la home dell’utente così come avviene nella PowerShell di Windows. Il file xstartup, infatti, si trova nella cartella .vnc (sotto Linux il punto iniziale indica una cartella nascosta), che a sua volta si trova all’interno del profilo utente corrente.

All’interno del file dobbiamo poi aggiungere queste righe posizionandole in fondo alla configurazione:

lxterminal &

/usr/bin/lxsession -s LXDE &

Il file diventerà così:

Salviamo con ctrl-x e yes e riavviamo il servizio tightvnc

tightvncserver :1

Passiamo poi al “client” Windows: scarichiamo VNC Viewer ed installiamolo. Possiamo scaricare il viewer da questa pagina: https://www.realvnc.com/download/viewer/

Eseguiamolo ed apriamo una connessione verso localhost:5901, la porta di default che identifica il display 1

Confermiamo che siamo coscienti di utilizzare una connessione non criptata ed immettiamo la password scelta in precedenza.

Et Voilà, il desktop della nostra macchina Linux, anzi della nostra macchina Windows su cui gira un desktop Linux J

Non ci rimane che provare a copiare il software del commercialista, e con un po’ di fortuna potremmo avergli risolto un bel problema! Ricordiamo che anche dal Desktop abbiamo accesso a tutto il filesystem Windows, trovando il contenuto del nostro volume C:\ all’interno del path Linux /mnt/

Utilizzo di un server X Windows

Un’altra possibilità, forse ancora più elegante, per utilizzare l’interfaccia grafica Linux è quella di esportare la variabile DISPLAY come abbiamo fatto in precedenza per xcalc e firefox, e lanciare non più una singola applicazione desktop, ma l’intera interfaccia grafica. Proviamo a vedere cosa succede lanciando l’interfaccia installata in precedenza: unity.

Lanciamo il server X di Windows con i settings avanzati aprendolo tramite l’uility XLaunch, richiamando la stessa dalle app di Windows; impostiamo quindi un’unica finestra ed il display numero 0 e lasciamo le restanti opzioni con i valori di default.

Ricordiamo da Windows bash di esportare il display se non è stato fatto con

export DISPLAY=:0

e lanciamo la configurazione dell’ambiente grafico Linux con

ccsm

Aggiungiamo le spunte per l’abilitazione delle funzionalità necessarie così come negli screenshot seguenti

Dopo aver cliccato su Close, saremo in grado di lanciare l’interfaccia grafica di unity digitando

compiz

direttamente dalla riga di comando di Windows bash. Io in questo caso non sono stato molto fortunato, e come segnalano molti possessori di schede video Nvidia, ho ottenuto un crash dell’applicazione nel momento in cui ha inizializzato le librerie OpenGL.

Al momento non sono riuscito a trovare un workaround valido, ma ho voluto segnalare comunque l’intera procedura perché, su diversi dispositivi questa va a buon fine.

Lo scopo di questo articolo è ovviamente andare un po’ più a fondo sulle potenzialità offerte da WSL, ritenendolo una funzionalità davvero particolare e interessante.

A questo punto posso svelarvi il segreto che ho tenuto nascosto per tutta la durata dell’articolo: non esiste nessun commercialista 🙂