DOSEMU: l'emulatore di hardware DOS compatibile

DOSEMU (1) è fondamentalmente un emulatore dell'hardware x86 per vari sistemi Unix funzionanti su architettura i386. Il suo obiettivo è quello di permettere il funzionamento del sistema operativo Dos (MS-Dos o cloni). Si tratta di un progetto eternamente in fase di sviluppo (alpha), anche se da diversi anni è sufficientemente funzionante. Tuttavia non ci sono punti fermi: da una versione all'altra si possono incontrare novità imprevedibili.

Dal momento che l'emulazione riguarda l'hardware, il Dos deve essere installato all'interno di questo sistema di emulazione; quindi, è necessaria una copia di questo sistema operativo, insieme alla licenza d'uso.

DOSEMU permette di utilizzare la stessa copia installata del Dos su più terminali contemporaneamente. Se si intende concedere l'utilizzo simultaneo di una singola copia di questo sistema operativo, è necessario un numero maggiore di licenze d'uso, oppure una licenza multipla.

A fianco del lavoro su DOSEMU è anche in corso quello sul progetto FreeDOS per un sistema operativo Dos libero (capitolo u212).

Predisporre un ambiente adatto al Dos all'interno di DOSEMU

Perché il sistema operativo Dos possa funzionare all'interno di DOSEMU, occorre preparare un file-immagine di un disco Dos dal quale si possa effettuare l'avvio del Dos stesso. Questo file che viene descritto di seguito, viene visto dal Dos come disco C:.

Successivamente è conveniente predisporre uno spazio all'interno del file system del proprio sistema GNU/Linux da utilizzare per i programmi Dos che deve essere letto come un disco di rete.

Un disco «C:» immagine

Per effettuare l'avvio del Dos occorre che sia predisposta l'immagine di un disco di piccole dimensioni. Questo potrebbe essere un file contenuto nella directory /var/lib/dosemu/, oppure /var/state/dosemu/, il cui nome inizia normalmente per hdimage.

Attualmente, il file dovrebbe chiamarsi hdimage.first e al limite potrebbe essere un collegamento simbolico a un altro file che costituisce l'immagine vera e propria.

Se non esiste questo file è necessario copiarlo dal pacchetto sorgente. Il nome dovrebbe essere hdimage.dist, o qualcosa di simile. Questa immagine deve essere preparata in seguito.

Un disco «D:» virtuale o di rete

In questa fase conviene preparare una directory che definisca l'inizio (la radice) del disco D: virtuale utilizzato dai programmi Dos. Stabiliamo che questo sia /var/emul/dos/. Da questo punto in poi, D:\ è equivalente a /var/emul/dos/.

La struttura essenziale del disco «D:» virtuale

Il disco D: virtuale dovrebbe contenere alcune directory che riproducono in pratica il classico ambiente Dos:

Per evitare la proliferazione di directory temporanee, è possibile utilizzare al posto di /var/emul/dos/temp/ un collegamento simbolico che punti a /tmp/.

ln -s /tmp /var/emul/dos/temp[Invio]

La configurazione di DOSEMU

La configurazione di DOSEMU consiste nella modifica dei file /etc/dosemu.conf e di /etc/dosemu.users. Il file /etc/dosemu.users permette di definire gli utenti che possono utilizzare DOSEMU, mentre l'altro stabilisce tutte le altre caratteristiche.

Purtroppo, la configurazione di DOSEMU, specialmente per ciò che riguarda il file /etc/dosemu.conf, è complessa e cambia da versione a versione. Inoltre, DOSEMU può costituire anche un problema per la sicurezza del sistema dal momento che di solito l'eseguibile dos, deve essere SUID-root (cioè deve appartenere a root e avere il bit SUID attivato) per utilizzare funzionalità particolari dell'hardware (soprattutto l'adattatore grafico VGA).(2)

File «/etc/dosemu.users»

DOSEMU permette di distinguere alcune categorie di utenti, attribuendogli privilegi differenti, in base a una diversa configurazione nel file /etc/dosemu.conf. Tali categorie di utenti dipendono quindi dalla configurazione di questo file.

Il file /etc/dosemu.users può contenere righe di commento, introdotte dal simbolo #, righe bianche o vuote, che vengono ignorate, e direttive espresse dalla sintassi seguente:

utente [variabile_di_configurazione...]

In pratica, si possono abbinare a un utente una o più variabili di configurazione che fanno riferimento a elementi del file /etc/dosemu.conf. È da osservare, in particolare, che si può indicare anche un utente particolare, all, per fare riferimento a tutti gli utenti a cui non si fa menzione in modo esplicito.

A titolo di compromesso, viene mostrato un esempio di configurazione del file /etc/dosemu.users che dovrebbe essere sufficiente nella maggior parte delle situazioni. Si tratta in pratica della versione standard distribuita assieme a DOSEMU, con l'aggiunta di qualche utente ipotetico.

# This is a sample /etc/dosemu.users file
# For more details look at ./doc/README.conf

root c_all              # root is allowed to do all weird things
nobody guest            # variable 'guest' is checked in /etc/dosemu.conf
                        # to allow only DEXE execution
guest guest             # login guest treated as 'nobody'

# Utenti inseriti normalmente
tizio
caio
sempronio

# If you want to allow limited dosemu to all users, uncomment the line below
#all restricted         # all other users have normal user restrictions

Come si intuisce, l'utente root ha tutti i diritti necessari a compiere quello che vuole dall'interno di DOSEMU. Sono previsti gli utenti nobody e guest, a cui sono concesse solo poche cose, mentre agli utenti tizio, caio e sempronio sono concessi privilegi normali. Infine, appare commentata la direttiva all restricted, con la quale si potrebbe consentire l'utilizzo di DOSEMU a tutti gli altri utenti, con privilegi ridotti.

File «/etc/dosemu.conf»

La preparazione di /etc/dosemu.conf è invece più delicata. Il file di esempio già fornito all'interno del pacchetto di distribuzione di DOSEMU è commentato molto dettagliatamente, però è anche molto complesso. Di seguito vengono indicate solo alcune parti particolarmente importanti. Le altre direttive di questo file, possono essere lasciate come sono, ignorandole, almeno fino a quando non si raggiunge una buona esperienza con l'uso di DOSEMU.

# Viene impostata la mappa della tastiera per uniformarsi alla
# disposizione dei tasti in Italia.
$_rawkeyboard = (1)     # bypass normal keyboard input, maybe dangerous
$_layout = "it"         # one of: finnish(-latin1), de(-latin1), be, it, us
                        # uk, dk(-latin1), keyb-no, no-latin1, dvorak, po
                        # sg(-latin1), fr(-latin1), sf(-latin1), es(-latin1)
                        # sw, hu(-latin2), hu-cwi, keyb-user
$_keybint = (on)        # emulate PCish keyboard interrupt


# Vengono definite le potenzialità dello schermo
# (per poter utilizzare la grafica, come impostato in questo
# esempio, occorre avviare il programma dos con i privilegi
# dell'utente root).
$_video = "vga"         # one of: plainvga, vga, ega, mda, mga, cga
$_console = (1)         # use 'console' video
$_graphics = (1)        # use the cards BIOS to set graphics
$_videoportaccess = (1) # allow videoportaccess when 'graphics' enabled
$_vbios_seg = (0xc000)  # set the address of your VBIOS (e.g. 0xe000)
$_vbios_size = (0x10000)# set the size of your BIOS (e.g. 0x8000)
$_vmemsize = (1024)     # size of regen buffer
$_chipset = ""          # one of: plainvga, trident, et4000, diamond, avance
                        # cirrus, matrox, wdvga, paradise
$_dualmon = (0)         # if you have one vga _plus_ one hgc (2 monitors)


# Viene definito l'uso dei dischetti e dell'immagine del disco C:.
$_floppy_a ="threeinch" # or "fiveinch" or empty, if not existing
$_floppy_b = ""         # ditto for B:

$_hdimage = "hdimage.first" # list of hdimages under /var/lib/dosemu
                        # assigned in this order such as
                        # "hdimage_c hdimage_d hdimage_e"
                        # If the name begins with '/dev/', then partition
                        # access is done instead of virtual hdimage such as
                        # "/dev/hda1" or "/dev/hda1:ro" for readonly
                        # Currently mounted devices and swap are refused.
                        # Hdimages and devices may be mixed such as
                        # "hdimage_c /dev/hda1 /dev/hda3:ro"
                        # Note: 'wholedisk' is _not_ supported.
$_hdimage_r = $_hdimage # hdimages for 'restricted access (if different)


# Viene definita la stampante.
$_printer = "lp"        # list of (/etc/printcap) printer names to appear as
                        # LPT1, LPT2, LPT3 (not all are needed, empty for none)
$_printer_timeout = (20)# idle time in seconds before spooling out

$_ports = ""            # list of portnumbers such as "0x1ce 0x1cf 0x238"
                        # or "0x1ce range 0x280,0x29f 310"
                        # or "range 0x1a0,(0x1a0+15)"

Installare e utilizzare il Dos

Il problema successivo è quello di riuscire a installare il Dos nel file-immagine che serve per effettuare l'avvio del Dos stesso. L'immagine in questione, che probabilmente è il file /var/lib/dosemu/hdimage.first, contiene già una serie di programmi Dos che fanno parte di DOSEMU e come tali non vanno cancellati. Ma l'immagine che viene distribuita così non è avviabile e il problema è proprio quello di inserirvi il kernel del Dos e l'interprete dei comandi COMMAND.COM, salvo il caso in cui sia già presente una versione di FreeDOS.

  1. Preparazione di un dischetto di avvio

    Per prima cosa occorre preparare un dischetto Dos avviabile che contenga qualche programma di servizio indispensabile. Da un elaboratore che stia eseguendo il sistema operativo Dos si procede come segue:

    C:> FORMAT A: /S[Invio]

    C:> COPY C:\DOS\SYS.* A:[Invio]

    C:> COPY C:\DOS\FDISK.* A:[Invio]

    Oltre a questi file converrebbe preparare nel dischetto un programma per la creazione e modifica di file di testo. Questo serve per preparare i file CONFIG.SYS e AUTOEXEC.BAT.

  2. Avvio del dischetto attraverso DOSEMU

    È necessario quindi avviare il Dos contenuto nel dischetto appena creato attraverso DOSEMU. Per fare questo, dall'elaboratore GNU/Linux si avvia DOSEMU nel modo seguente:

    dos -A[Invio]

    Se tutto è andato bene si avvia il Dos; quindi, dopo la richiesta della data e dell'ora appare l'invito classico (il prompt), per l'inserimento dei comandi attraverso la shell (COMMAND.COM).

    A:\>
    
  3. Trasferimento del sistema

    Per trasferire nel file-immagine il sistema contenuto nel dischetto, in modo da rendere questa immagine avviabile, occorre procedere prima con la creazione di un MBR (Master boot record):

    A:\> FDISK /MBR[Invio]

    quindi con il trasferimento del sistema:

    A:\> SYS C:[Invio]

    Se è andato tutto bene, adesso il disco C:, cioè l'immagine, è pronto.(3)

  4. Controllo del disco C:

    Il disco C: dovrebbe contenere alcuni file di DOSEMU. Per verificare il contenuto è sufficiente spostarsi in C:.

    A:\> C:[Invio]

    C:\> DIR[Invio]

  5. Modifica di config.sys

    Trovandosi in C:, potrebbe essere conveniente modificare i file CONFIG.SYS e AUTOEXEC.BAT. Si inizia con CONFIG.SYS.

    Si stabilisce di poter utilizzare tutte le lettere di unità (drive) a disposizione.

    LASTDRIVE=Z
    

    Si definisce attraverso il driver EMUFS.SYS di DOSEMU che la prossima lettera di disco a disposizione punti alla directory /var/emul/dos/. Di conseguenza, quella directory viene interpretata come disco D:

    DEVICE=C:\EMUFS.SYS /var/emul/dos
    

    Viene avviato il driver EMS.SYS di DOSEMU che si occupa della gestione della memoria estesa.

    DEVICE=C:\EMS.SYS
    

    Se in seguito se ne presenta l'opportunità, è sempre possibile apportare modifiche a questo file.

  6. Modifica di AUTOEXEC.BAT

    Inizialmente il file non necessita di modifiche. È possibile vedere in seguito come configurare al meglio questo file.

  7. Conclusione dell'installazione

    Per terminare la sessione di lavoro dell'installazione occorre fare terminare l'esecuzione di DOSEMU, avviato in precedenza con il comando dos -A. Per chiudere si utilizza il programma EXITEMU.COM:

    C:\> C:\EXITEMU[Invio]

  8. Verifica

    Se tutto è andato come previsto, il Dos è pronto. Si può provare ad avviare il Dos senza l'uso del dischetto semplicemente con il comando:

    dos[Invio]

    Se ha funzionato, si ottiene l'invito normale:

    C:\>
    

    Per uscire si utilizza il programma EXITEMU.COM:

    C:\> EXITEMU[Invio]

I dischi virtuali con «LREDIR.COM»

Il programma LREDIR.COM è in grado di consentire l'accesso a porzioni del file system di GNU/Linux attribuendo una lettera di unità. Per esempio:

C:\> LREDIR X: \linux\fs\/home[Invio]

fa sì che il disco X: corrisponda al contenuto della directory /home/. Invece,

C:\> LREDIR Y: \linux\fs\${home}[Invio]

fa sì che il disco Y: corrisponda al contenuto della directory personale dell'utente che sta usando DOSEMU.

Il mouse

Teoricamente, DOSEMU è in grado di gestire da solo il mouse. In pratica potrebbe non essere così. In tal caso conviene provare ad avviare un programma apposito all'interno del CONFIG.SYS o di AUTOEXEC.BAT.

Un esempio di «AUTOEXEC.BAT»

Nell'esempio seguente viene utilizzato un programma per la gestione del mouse estraneo a DOSEMU. Il disco D: è stato definito implicitamente all'interno di CONFIG.SYS attraverso DEVICE=C:\EMUFS.SYS /var/emul/dos.

@echo off

LREDIR H: linux\fs\${home}
LREDIR R: linux\fs\/mnt/cdrom

PROMPT=$p$g
PATH=c:\
PATH=%PATH%;D:\;D:\DOS

SET TEMP=D:\TEMP

D:

D:\DOS\MOUSE

ECHO "Questo è DOSEMU. Benvenuto!"

DOSEMU e le console virtuali

Quando viene avviato il Dos attraverso DOSEMU, questo opera nella console virtuale sulla quale ci si trova. Di solito, per passare da una console virtuale all'altra è sufficiente premere la combinazione [Alt F1] o [Alt F2]... Quando ci si trova su una console virtuale all'interno della quale sta funzionando il Dos, per passare a un'altra si agisce con la combinazione [Ctrl Alt F1] o [Ctrl Alt F2]...

DOSEMU da X

Per avviare il Dos in una finestra del sistema grafico X, conviene avviare DOSEMU attraverso xdos che normalmente è un collegamento simbolico a dos.

DOSEMU e Mtools

Nelle sezioni precedenti si è visto l'uso del file-immagine /var/lib/dosemu/hdimage, che costituisce normalmente il disco C: per DOSEMU. Questo file non è gestibile con strumenti Unix normali, soprattutto perché non è un'immagine standard. Si tratta dell'immagine di un piccolo disco fisso contenente una partizione, con l'aggiunta di un'intestazione aggiuntiva.

Questo disco C: può essere utilizzato principalmente attraverso strumenti Dos all'interno di DOSEMU, così come è stato già mostrato, oppure può essere raggiunto anche tramite Mtools, purché configurato opportunamente. Infatti, è sufficiente informare Mtools sulla posizione esatta in cui ha inizio la prima partizione all'interno del file-immagine, per potervici accedere anche con questo strumento. Potrebbe trattarsi della direttiva seguente, nel file di configurazione /etc/mtools.conf.

drive n: file="/var/lib/dosemu/hdimage.first" partition=1 offset=128

In tal modo, per Mtools, il disco N: corrisponderebbe al disco C: di DOSEMU.

È importante fare attenzione al valore dello scostamento (offset) che potrebbe cambiare da una versione all'altra di DOSEMU.

Implicazioni sulla gestione dei permessi

Il Dos non è un sistema operativo multiutente e di conseguenza non è in grado di attribuire dei permessi ai file. Quando si utilizza il Dos all'interno di DOSEMU, i permessi vengono gestiti in modo predefinito.

Quando si crea un file gli vengono attribuiti i permessi predefiniti in base a quanto stabilito con la maschera dei permessi; inoltre, l'utente e il gruppo proprietario corrispondono all'utente che ha avviato DOSEMU e al gruppo cui questo utente appartiene.

Quando si accede a un file, l'apparenza delle caratteristiche di questo cambiano a seconda che l'accesso avvenga da parte di un utente rispetto a un altro: l'utente che ha creato il file può modificarlo, un altro potrebbe trovarlo protetto in sola lettura.

In particolare, i file contenuti nel file-immagine che costituisce il disco C: hanno le proprietà e i permessi del file-immagine stesso.

Ma il Dos non è in grado di gestire tutte le finezze che può invece amministrare un sistema Unix, di conseguenza, quando si tenta di fare qualcosa che i permessi non consentono, si ottengono per lo più delle segnalazioni di errore che normalmente non si vedono quando si usa il Dos da solo senza emulazioni.

Quando si utilizza il Dos con DOSEMU su un sistema al quale accede un solo utente, non dovrebbero porsi problemi: basta che l'unico utente utilizzi sempre lo stesso nominativo (lo stesso UID). Quando lo si utilizza invece in un sistema al quale accedono più utenti, è ragionevole desiderare che i dati personali possano essere inaccessibili agli altri; quindi, questo modo trasparente di gestire i permessi può essere solo positivo. Quando si vogliono gestire alcune attività in gruppo si può aggirare eventualmente l'ostacolo utilizzando un utente comune creato appositamente per quel compito.

Un'ultima annotazione deve essere fatta per i file eseguibili che non necessitano dei permessi di esecuzione, come invece richiederebbe GNU/Linux. È generalmente sufficiente che ci siano i permessi di lettura. A volte sono necessari anche quelli in scrittura, ma prima di dare questi permessi è meglio verificare, onde evitare di lasciare campo libero a un possibile virus.


1) DOSEMU   GNU GPL

2) Se ci si accontenta di uno schermo a caratteri, senza grafica e senza cornici, non dovrebbe essere necessario attivare il bit SUID.

3) Il comando FDISK /MBR riguarda precisamente MS-Dos, mentre nel caso di cloni le cose potrebbero essere differenti; per esempio potrebbe essere necessario avviare il programma nel modo solito e poi specificare la richiesta selezionando una voce da un menù.

«a2» 2013.11.11 --- Copyright © Daniele Giacomini -- appunti2@gmail.com http://informaticalibera.net