Необходимость запуска DOS-приложений под Linux возникает нечасто, но случается. Вот как-то и со мной случилось, решил поделиться опытом, может, кому пригодится.

А нужно было запустить кем-то, когда-то написанное приложение для поликлиники, работающее на Foxpro под DOSом, в Linux, т.к. денег на покупку Windows лицензий не нашлось.

Исходные данные:
Suse Linux Enterprise Desktop 10.3 — рабочие станции.
Suse Linux Enterprise Server 10.3, на нем шара на Samba (я же до этого и расшаривал для работы с Windows рабочих станций, т.к. на лицензию для Win-сервака тоже денег не было), имя шары, как ни странно, — SHARE.
Происходило всё 2-3 года назад, поэтому версии SLED и SLES на момент установки были не такие уж и древние.

Т.к. сервер уже настроен, то все нижеописанные манипуляции производим на десктопе.
Ставим из репозитория, или отдельно скачиваем dosemu-xxx.rpm.

Ещё нам понадобятся кириллические шрифты (далее по тексту папка XFonts), не помню уже где я их взял, приложу в архиве к статье.

Создаём папку, куда смонтируем шару, прописываем монтирование в fstab и монтируем:
su
mkdir /mnt/dos
chmod 777 /mnt/dos
echo "//192.168.0.130/SHARE /mnt/dos cifs iocharset=utf8,codepage=cp866,noperm,forcemand,direct,nounix,nolock,username=user,password=userpassword,rw 0 0" >> /etc/fstab
mount /mnt/dos
небольшое пояснение: 192.168.0.130 — IP сервера, user и userpassword берём из пользователей на сервере, которым разрешён доступ к Samba-шаре.

Дальше копируем шрифты:
cp -rf XFonts /usr/X11R6/lib/X11/fonts/
прописываем папку подобно остальным шрифтам в файле /etc/X11/xorg.conf, и добавляем их в систему командой:

/usr/sbin/fonts-config


В /etc/dosemu.conf добавляем или изменяем в соответствующих разделах следующие опции (у меня в итоге только эти опции и остались):

## Terminal related settings
# Character set used externally to dosemu
$_external_char_set = "utf8" #кодировка в Linux
# Character set used by dos programs
$_internal_char_set = "cp866" #кодировка в DOS
## Keyboard related settings
$_layout = "ru" #задаём раскладку
## Printer and parallel port settings
$_lpt1 = "lp -o media=a4 -o cpi=11" #подключаем принтер, в моём случае матричник на LPT порту
#или
#$_lpt1 = "iconv -f cp866 -t utf8 | lp -o media=a4 -o cpi=11 -d printername"
## Setting specific to the X Window System (xdosemu, dosemu -X)
$_X_font = "vgacyr" #подключаем кириллические шрифты


В файл autoexec.bat, находящийся в папке /usr/share/dosemu/drive_z пишем следующее (!!! при копировании # и пояснения убрать!!!):

@echo off
rem autoexec.bat for DOSEMU + FreeDOS
path z:\bin;z:\gnu;z:\dosemu;p:\ovl1;p:\ovl;p:\prv # ovl1;p:\ovl;p:\prv - папки запуска программы в DOS;
set HELPPATH=z:\help
set TEMP=c:\tmp
blaster
prompt $P$G
unix -s DOSDRIVE_D
if "%DOSDRIVE_D%" == "" goto nodrived
lredir d: linux\fs%DOSDRIVE_D%:nodrived
lredir p: linux\fs/mnt/dos # назначение соответствия папки Linux диску DOS
unix -s DOSEMU_VERSION
echo "Welcome to dosemu %DOSEMU_VERSION%!"
unix -e
xmode -fullscreen on # запуск Dosemu в полноэкранном режиме
lin.bat # батник запуска программы в DOS


Для полной ясности вот содержание lin.bat (!!! при копировании # и пояснения убрать!!!):

@ echo off
p: # переходим на диск p:
cd ovl1 # далее в рабочую папку
p:\ovl1\reg01.fxp # запускаем программу (расширение .fxp у меня, у Вас скорее всего будет .exe, если не Foxpro)
xmode -fullscreen off # после окончания работы программы выходим из полноэкранного режима
exitemu # выходим из досэмулятора


Делаем первый запуск, командем:
dosemu
получим фигвам, потому что нет файла lin.bat, исправляем созданием в домашней директории, в папке .dosemu/drive_c (папка создаётся при первом запуске эмулятора) этого файла с вышеприведённым содержанием.

Ещё раз запускаем dosemu и вуаля, наша досовская прога работает, показывает текст на русском языке и даже распечатывает под Linux.

Мои изыски относились к определённой программе, но, думаю, таким способом, с заменой путей и имён файлов, запустятся если не все, то многие приложения работающие под DOS.

P.S.
Если при запуске dosemu ловим:

>LOWRAM mmap: Недопустимый аргумент


То дописываем в /etc/sysctl.conf

vm.mmap_min_addr=0


Ну и перезагружаемся.
Обещанный архив.

Комментарии (19)


  1. Newbilius
    09.10.2015 13:59
    +6

    А почему dosemu, а не DosBox, сравнивали производительность? Просто знакомый в поликлинике под Windows именно этот эмулятор использовал.


    1. shweew
      09.10.2015 14:09
      -1

      Да там вопроса в производительности не было, 6 рабочих мест всего.
      Искал инфу по теме — попался первым dosemu и он заработал к тому же, дальше искать не стал…


    1. oWeRQ
      09.10.2015 17:45
      +3

      Начнем с того, что Dosemu только под Linux, производительность близка к нативной, т. к. используется другой тип эмуляции, что делает его непереносимым с x86, но вряд ли еще где-то актуально, даже часы уже тянут DosBox…


    1. FilimoniC
      09.10.2015 19:04

      dosbox криво работает с нелатинскими символами ФС. Есть программа, работающая отлично на 98, но она создает файлы с именами, которые более поздние оси и досбокс не понимают.


      1. shweew
        09.10.2015 19:11

        В моём случае dosemu работает ровно, ни какой кривизны не было, врачи пишут всё кириллицей. Распечатывается тоже нормально.
        Правда файлы да, всё латиницей. Но это изначально и под DOS было. Так что тут ничего не скажу вразумительного.


  1. izyk
    09.10.2015 14:46
    +1

    А на Linux x64 будет работать?


    1. shweew
      09.10.2015 16:08

      Врать не буду, не пробовал, а почему нет?


      1. izyk
        09.10.2015 16:14
        +1

        1. Atakua
          10.10.2015 00:12

          Необязательно использовать аппаратный V86-режим. Можно обойтись просто интерпретацией набора 8086 и эмуляцией системных устройств, ожидаемых программами под DOS. Благо современные процессоры куда быстрее тех, что оригинально использовались с теми программами, и даже простая схема интерпретатора без всяких наворотов вполне устроит.


    1. flaresun
      09.10.2015 17:29

      У меня на Linux x64 что-то под dosemu работало, т.е. проблем из-за разрядности не было.


  1. ketrin7
    09.10.2015 19:11
    +1

    Необходимость запуска DOS-приложений под Linux возникает нечасто

    это точно ;) Такие ситуации действительно возникают не часто, но достаточно актуален ответы на вопрос — что в таком случае делать?


    1. shweew
      09.10.2015 19:17

      Вот-вот, секса поимел, пока вкурил что как.


  1. shweew
    09.10.2015 19:16

    Del


  1. vanyas
    10.10.2015 05:19

    Странно, денег на покупку windows не было, но на покупку Suse Enterprise нашлись? Почему не использовали бесплатный Open Suse?


    1. shweew
      10.10.2015 07:28
      +1

      Так никто не запрещает использовать SLED-SLES без покупки подписки на получение обновлений и исправлений.


  1. Arteridium
    10.10.2015 17:49

    А на FoxPro разве лицензии не нужны?..


    1. shweew
      10.10.2015 17:59

      Это на совести заведующего.
      Да и пост совсем не о лицензировании.


    1. khim
      11.10.2015 03:19
      +2

      Нет, не нужны. Это одна из вещей, на которых он когда-то поднялся. Среда разработки в нём всегда была платная, но, в отличие от оригинального dBase, начиная с версии 2.0 у FoxPro появился "Royalty-Free Distribution Kit". Fox Pro у меня нет, но вот тут есть пресс-релиз где этоc обыгрывается как одна из «фишек».


  1. shweew
    10.10.2015 17:59

    Опять не туда…