DOSEMU mit LINUX lässt 20 Jahre altes Client-Server-System weiterleben

Der Client, ein Industrie-PC vom Typ DLOG MPC5 ist in die Jahre gekommen. Die Hardware ist aus dem Jahre 2004, die Anwendungssoftware 1997 geschrieben und die Betriebssystemsoftware MS-DOS 6.22 von 1994. Für die Hardware gibt es keine Ersatzteile mehr und für das Betriebssystem keine Hardware bzw. keine Treiber.

IST-Hardware
Display Farb-TFT, 10.4’’, SVGA 800 x 600 Punkte
Maus Resistiver analog Touch-Screen
Speicher Compact Flash
Schnittstellen RS232, USB
Netzwerk Cisco WLAN Adapter

Wie kann die Anwendung, Teil eines Client-Server-Systems, mit moderner Hardware unverändert weiter betrieben werden?

IST-Software
Betriebssystem MS-DOS 6.22
User-Interface Grafisches Benutzer-Interface, welches für 640×480 Punkte (VGA) konzipiert wurde und von der Hardware auf 800×600 Punkte extrapoliert wird
Netzwerk TCP/IP-Netzwerkanbindung mit PC/TCP Protokollstack; dabei besteht der allergrößte Teil der Netzwerk-Kommunikation aus Filetransfers per FTP

Das Projekt

Die alte Hardware wird ersetzt durch einen Industrie PC vom Typ IND FTF2475A.
Für diese Plattform vertreibt IND-Systeme die Betriebssysteme Windows Embedded Standard 7 (WES7) und Debian Linux (Version 7 „Wheezy“) in einer speziellen, „gehärteten“ Variante von IND-Systeme.

Für die DOS-Emulation sind mehrere Lösungsansätze vorstellbar: DOSBOX, VirtualBox, VMware, DOSEMU. Die Möglichkeit die Anwendung unter Windows im Kompatibilitätsmodus zu betreiben, scheidet aus, da es keine Netzwerkunterstützung für DOS Anwendungen gibt.

Gewählt wird die Kombination DOSEMU mit Linux, weil sowohl Emulator als auch Betriebssystem komplett auf Open Source beruhen und so zumindest theoretisch alle Möglichkeiten gegeben sind, etwaige Probleme aus eigener Kraft zu beheben. Ausserdem verspricht DOSEMU Lösungsmöglichkeiten für das (vermeintlich) schwierigste Problem, die Netzwerkanbindung.

DOSEMU ist ein sehr altes Open-Source-Projekt, es entstand 1992, hat eine Entwicklung von über 16 Jahren hinter sich und die letzte Version im Debian Projekt mit der Kennung 1.4.0.1 stammt aus 2008. Von daher ist klar, dass keine aktive Entwickler-Community mehr existiert, die eventuell Unterstützung leisten könnte.

Das Projekt beginnt mit einer Proof of Concept Phase: Die Anwendungssoftware in einer DOSEMU-Box soll das Display, das Keyboard, die Maus, den Touch und schließlich das Netzwerk ansprechen können.
So früh wie möglich soll sich zeigen, ob unüberwindbare Hindernisse drohen. Denn von der Anwendungssoftware gibt es weder Dokumentation noch ist bekannt, ob sie sich an offizielle und damit an die emulierten APIs hält.

  • Wird die VGA-Grafik richtig dargestellt?
  • Läßt sich der Touchscreen bedienen, beim FTF2475A über RS232, beim MPC5 über PS/2 angeschlossen?
  • Wie soll der Netzwerk-Stack konfiguriert werden, damit der Anwendungsserver einen neuen Client nicht von einem alten Client unterscheiden kann bzw. muss?
  • In welcher Variante wird DOSEMU am besten benutzt? Im Console Graphics Mode mit direktem VGA Hardware Access, im SDL Mode unter Benutzung von Framebuffer Console Devices oder im X11-Modus, bei dem der X11-Server die Hardware-Kontrolle inne hat.

Die Tests mit DOSEMU „from stock“ zeigen, dass die Geräte Keyboard und Maus ohne Probleme benutzt werden können.

Die VGA-Grafik der Applikation wird zwar richtig dargestellt, jedoch kommt es im Console Graphics Mode reproduzierbar zu einem Absturz des gesamten Systems, sobald die DOSEMU-Sitzung mit dem exitemu -Kommando beendet wird.

Auch der Touchscreen macht Probleme. Dabei geht es zum Glück nicht darum, dass etwa die Touch-Hardware des MPC5, die intern über die PS/2-Schnittstelle angeschlossen ist, emuliert werden müsste. Vielmehr muss der Elo-Touchscreen des neuen Gerätes mit DOSEMU „verheiratet“ werden. Die native Mausunterstützung von DOSEMU ist zwar ausreichend, solange es sich um Geräte handelt, die relative Bewegungen erzeugen. Ein Touchscreen aber erzeugt absolute Zeigerbewegungen und diese Art von „pointer device“ kann in DOSEMU nicht konfiguriert werden, obwohl in den Quellen Code dafür vorhanden ist.
Damit scheidet der Console Graphics Mode aus. Und auch der SDL-Mode verspricht keine Lösung für das Maus-Problem. Nur das X11-Grafiksystem bietet eine native Unterstützung für den Elo-Touchscreen.

Mit DOSEMU als X11-Client konfiguriert funktioniert schließlich fast alles, aber nur, wenn DOSEMU im Fenstermodus betrieben wird. Im Fullscreen-Modus, der für vollständige Kompatibilität mit dem Alt-Gerät wichtig ist, funktioniert die Anzeige zwar, aber der Input per Touchscreen ist unbrauchbar. Ein Tap auf den Bildschirm positioniert den Cursor an eine beliebige Stelle, aber nicht dahin, wo getippt wurde.
Zum Glück ist die Lösung für dieses Problem relativ einfach. Es genügt, den Fullscreen-Mode in X mit dem Mouse-Grab-Mode zu kombinieren. Interessanterweise gibt es dafür keine Konfigurations-Option, sondern nur einen Hotkey, siehe DOSEMU Manual. Also wird die Hotkey-Aktion in die X_init() -Funktion eingebaut:

--- old/dosemu/src/plugin/X/X.c
+++ new/dosemu/src/plugin/X/X.c
@@ -740,6 +740,8 @@ int X_init()
if(getenv("DOSEMU_HIDE_WINDOW") == NULL) {
  if (config.X_fullscreen) {
    toggle_fullscreen_mode(1);
+   force_grab = 0;
+   toggle_mouse_grab();
    have_focus = TRUE;
  } else {
    XMapWindow(display, main window);

Schließlich die Netzwerkanbindung:

Die DOS-Applikation benutzt TCP sockets und zwar in Form des PC/TCP – Protokollstacks, einem Produkt der Firma „FTP Software“. Die unterste Schicht dieses Protokollstacks ist der sogenannte packet driver. Dieser Treiber bildet die Schnittstelle zum Network (WLAN) Adapter. Beim Alt-System ist das der Treiber cscpkt.com von Cisco. Er kann ersetzt werden durch einen generischen packet driver, der Bestandteil der DOSEMU – Software ist und lediglich in der Konfigurationsdatei aktiviert werden muss. Ebenfalls in der DOSEMU-Konfigurationsdatei gibt man an, mit welchem Netzwerk-Adapter der Treiber „reden“ soll. Zur Auswahl stehen der physische Netzwerk-Adapter „wlan0“ und der virtuelle Netzwerk-Adapter „tap0“. Die Wahl für „tap0“ fällt leicht: Hier kommuniziert die DOS-Applikation mit einem simulierten Ethernet-Gerät. Auf der Linux-Seite dann werden Daten von und für dieses virtuelle Netzwerk-Gerät über IP-Routing an das reale Netzwerk-Gerät (WLAN-Adapter) weitergeleitet. So bildet die DOS-Box mit ihrem Linux-Host ein eigenes IP-Subnetz und wird über IP-Masquerading (NAT) vor der Aussenwelt versteckt. Diese Technik ist ausführlich im DOSEMU-Handbuch unter Networking using DOSEMU beschrieben.

Es gibt allerdings einen kleinen Haken: Die funktioniert nicht. Von der DOS-Box werden keine IP-Verbindungen aufgebaut.

Eine Internet-Recherche ergibt: Dieses Problem wurde schon 2008 in der Mailingliste Linux-MSDOS im Thread Running PC/TCP inside DosEmu diskutiert und von Mauro Flores (Uruguay) gelöst. Er reichte damals folgenden Patch ein:

--- old/dosemu/src/dosext/net/net/pktnew.c
+++ new/dosemu/src/dosext/net/net/pktnew.c
@@ -709,6 +709,11 @@ static int pkt_receive(void)
        *--p = (char)(ETH_P_IPX >> 8);
    }
#endif
+   if( size < ETH_ZLEN ) { 
+     pd_printf("Fixing packet padding. Actual length: %d\n", size); 
+     memset( pkt_buf+size, '0', ETH_ZLEN-size ); 
+     size = ETH_ZLEN; 
+   } 

    p_stats->packets_in++;
    p_stats->bytes_in += size;

Leider ist dieser Patch weder in den Main-Trunk noch in die Debian-Distribution oder die Ubuntu-Distribution eingeflossen. Ohne diesen Patch funktioniert ARP nicht und ohne ARP funktioniert herzlich wenig in IPv4-Netzwerken.

Die technischen Grundlagen für den Prototypen sind nun klar: Linux, X11, XDOSEMU, TAP.

Durch die Verlagerung der virtualisierten DOS-Box hinter ein NAT-Gateway entsteht ein Problem: Die DOS-Applikation benutzt aktives FTP. Das bedeutet: Der FTP-Client baut einen Kommunikations-Kanal zum FTP-Host auf und übergibt ihm die eigene IP-Adresse und Port-Nummer, damit er mit diesen Parametern den Daten-Kanal eröffnet. Das funktioniert nicht, weil die DOS-Box nun in einem IP-Subnetz existiert, welches der Aussenwelt unbekannt ist.

Die Lösung ist, das aktive FTP der DOS-Box auf der Linux-Seite in passives FTP umzuwandeln. Das frei verfügbare Software-Paket ftp-proxy kann genau diese Aufgabe übernehmen.

Nun kann der Prototyp mit folgender Konfiguration an den Start gehen:

Bekanntmachung des TAP Gerätes:

tunctl
ifconfig tap0 $VMIP netmask 255.255.255.0 up

Bekanntmachung des FTP-Proxy-Dienstes:

echo "ftpproxy $FTPPROXYPORT/tcp" >> /etc/services

Konfiguration des FTP-Proxy: Transformation von aktivem nach passivem FTP und Startart inetd

cat > /etc/proxy-suite/ftp-proxy.conf <<! 
[-Global-]
ServerType                inetd 
LogDestination            daemon 
AllowTransProxy           yes 
AllowMagicUser            yes 
UseMagicChar              % 
PortResetsPasv            yes 
DestinationTransferMode   passive 
!

Bekanntmachung des FTP-Proxy beim inetd Superserver

update_inetd --group STANDARD --add 'ftpproxy stream tcp no wait root /usr/sbin/ftp-proxy'

Einrichtung der NAT-Regeln und Umleitung des Datenverkehrs an den FTP-Proxy

sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
iptables -t nat -A PREROUTING -i tap0 -p tcp ! -d $VMIP --dport 21 -j REDIRECT --to-ports $FTPPROXYPORT
iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE

Starten der Anwendung

dosemu.bin -X

Im Produktiv-Betrieb zeigen sich noch einige positive Seiteneffekte der Umstellung:

  • Die DOS-Box kann in einem mit WPA2 geschützten Funknetz mitmachen, ohne selbst etwas von dieser Verschlüsselungstechnik zu verstehen.
  • Die Linux-Edition von IND-Systeme läßt die Anwendungen in einer RAM-Disk laufen und versieht die Flashdisk mit einem Schreibschutz. Dadurch wird das Filesystem gegen Beschädigungen geschützt. Die DOS-Applikation profitiert von dieser Technik und ist nun wesentlich robuster.
  • Durch die Virtualisierung und Einbettung in ein modernes Betriebssystem können Fernwartung, SNMP und Mobile Device Management genutzt werden.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.