Porte seriali e virtualizzazione

di | 3 Ottobre 2010

Chi mi conosce sa che io sono da lungo tempo un sostenitore dei sistemi di virtualizzazione. I vantaggi sono innegabili e tangibili un po’ per tutti, particolarmente per chi ha la necessità di utilizzare architetture che prevedano più server. E senza dimenticare un elemento, di cui si parla relativamente poco ma che è innegabilmente importante, quale il risparmio energetico derivante dalla riduzione della  ferraglia .

La soluzione che attualmente prediligo per la virtualizzazione dei server è Xenserver di Citrix. E’ un software che ha tanti elementi positivi, ma un grande buco: non consentire il ‘passaggio’ alle macchine virtuali di hardware presente nel sistema ospite, il cosiddetto passthrough, peraltro disponibile già da un po’ di anni nella versione open-source dell’ hypervisor .

Ci sono però varie soluzioni per mettere una pezza al problema. Ve ne propongo una per trasferire una delle porte seriali della macchina ospite (o, volendo, di un altro computer) ad una delle macchine virtuali per mezzo della rete ethernet, utilizzando un metodo definito ‘serial over IP’.

E’ vero: al giorno d’oggi i dispositivi con interfacce seriali sono relativamente poco diffusi. Ci sono, tuttavia, alcuni settori in ambito professionale, neppure tanto di nicchia, in cui il collegamento seriale di dispositivi periferici è tutt’ora il più comune e frequente. Non è quindi raro imbattersi in situazioni di questo tipo.

Nel caso particolare, la mia necessità consisteva nel collegare una delle porte seriali del server Xen (che impiega come sistema operativo Centos) ad una macchina virtuale Windows. Il tutto, preferibilmente, utilizzando software open-source.

Lato Linux la scelta è caduta su remserial . E’ un piccolo programma che redireziona la comunicazione di una porta seriale verso una porta TCP. Per lanciarlo come daemon è sufficiente editare /etc/rc.local ed inserirci la riga di comando:

remserial -d -p 23000 -s "19200 raw" /dev/ttyS0 &

In questo caso, selezionando come porta seriale ttyS0 a 19200 baud e la porta 23000 TCP lato network.

Lato Windows la scelta è invece caduta sul progetto com0com , finalizzato alla creazione di porte virtuali seriali. L’installazione è lineare, mentre in fase di configurazione è sufficiente creare una porta virtuale COM facilmente individuabile, come in questo caso:

  com0com

Sempre nel progetto com0com è presente un programma in grado di redirigere la porta virtuale verso una connessione TCP, chiamato com2tcp. Per funzionare in modo corretto è però necessario lanciarlo automaticamente come processo di sistema assieme a com0com. Per ottenere questo risultato è possibile utilizzare programmi commerciali di vario tipo, o ricorrere a due file contenuti nel Resource Kit di Windows NT – srvany.exe ed instsrv.exe – che possono essere scaricati dal sito Microsoft.

Questa soluzione, però, richiede la modifica manuale di alcune chiavi dei registri del sistema. E’ quindi potenzialmente pericolosa , in quanto modifiche errate potrebbero portare al blocco totale del sistema operativo. Proseguite, quindi, solo se sapete come operare: io non mi assumo responsabilità di sorta.

Il programma srvany opera come una sorta di wrapper, strutturato per lavorare come servizio ed in grado di lanciare in background un generico programma eseguibile. Instsrv, invece, consente di installare e rimuovere manualmente un servizio. AI fini di questo esempio, tutti i programmi necessari sono stati installati in c:\programmi\com0com.

Dopo essersi posizionati con il prompt dei comandi nella cartella di installazione è sufficiente digitare il comando

instsrv com2tcp c:\programmi\com0com\srvany.exe

Per installare un servizio con dal nome com2tcp  che lancia automaticamente il wrapper durante l’avvio del sistema. Questo mette in esecuzione il solo wrapper: é però necessario indicargli cosa lanciare. Per fare questo è necessario modificare manualmente il registro di sistema, utilizzando regedit o un altro programma analogo a vostra scelta.

E’ sufficiente creare una chiave ed una voce di registro nel ramo dell’albero che fa capo al servizio creato, cioè – nel caso in esempio – a:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Com2Tcp\

ovviamente sostituendo a Com2Tcp il nome che avrete scelto per il vostro servizio. Una volta posizionati in questo ramo dell’albero delle chiavi è necessario creare una nuova chiave dal nome Application e, dentro questa, una voce ‘stringa’ (REG_SZ) dal nome Parameters , in cui deve essere inserita la stringa di lancio del programma Com2TCP.

Il risultato finale sarà questo:

srvany

Il valore da assegnare alla chiave di registro è quello necessario a connettere com2tcp alla porta in cui è in ascolto il daemon  remserial precedentemente installato. Nel mio caso è il seguente:

C:\programmi\com0com\com2tcp.exe --telnet \\.\CNCB0 <server> <porta>

Et Voilà, les jeux son fait… la porta è ora disponibile sul client windows.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *