- PVSM.RU - https://www.pvsm.ru -
В прошлой статье [1], помимо всего прочего, я рассказывал, как можно запустить Quake для DOS, загрузив DOS на современном компьютере. Отказ от использования эмуляторов позволяет погрузиться в прошлое наиболее реалистично, однако есть ряд недостатков:
В этой статье я приведу решение, лишённое этих недостатков. Хотя оно подразумевает использование эмуляции, возможность игры в интернете позволяет забыть об этом. Обладая минимальными знаниями по работе в Linux, любой желающий может повторить это решение у себя.
Исходный код решения вы можете найти в моём репозитории на GitHub [2]. Использовать его можно по своему усмотрению. Загрузить и запустить или воспользоваться для прояснения моментов, которые могут оказаться сложными, — решать вам.
Когда я учился на первом и втором курсах института, игра Quake была хитом. Играли в неё в компьютерных клубах или дома, если кто-то был редким обладателем компьютера. Мы, студенты, всегда искали возможность поиграть в неё в компьютерном классе — уж очень привлекательны были сетевые возможности Quake для нас, людей, не избалованных современным интернетом. Даже те, у кого был компьютер дома, приходили в институт из-за возможности поиграть по локальной сети.
Локальная сеть была организована на основе протоколов IPX/SPX. Про TCP/IP можно было почитать в журналах или умных книжках, которые мы, к сожалению, тоже редко видели.
Сегодня вы можете вернуть себе и вашим друзьям те ощущения азарта от сетевой игры в Quake для DOS. Причём неважно, где находятся ваши друзья — главное, чтобы у них было стабильное и относительно быстрое интернет-соединение.
Для меня сам факт того, что ты играешь в ту самую игру, в которую играл более 25 лет назад, вызывает приятные приступы ностальгии. Надеюсь, я не одинок.
В 90-е в компьютерных классах моего института стояли компьютеры без звуковых карт, поэтому игра мне запомнилась без звука. Сейчас же, используя эмуляцию, можно будет поиграть со звуком.
Для начала нам не повредит немного теории. Если читатель знаком с теорией или она ему не нужна, то можно сразу перейти к делу [4].
Виртуализация и эмуляция сейчас используются практически везде. На это есть ряд причин:
Сети бывают локальные и глобальные. Проблема глобальных сетей в том, что каждый узел глобальной сети обязан иметь глобальный IP-адрес, а этих адресов не так уж и много по современным меркам. Поэтому часто провайдеры не выдают своим клиентам глобальные IP-адреса, а используют технологию NAT.
С большой долей вероятности доступ в интернет вам предоставляется с помощью Network Address Translation (NAT), поэтому кратко рассмотрим эту технологию, не вдаваясь в скучные и утомительные подробности.
NAT позволяет нескольким компьютерам использовать один и тот же глобальный IP-адрес в интернете. Среднестатистический пользователь в большинстве случаев не заметит разницы, разделяет ли он IP-адрес в интернете с кем-то или нет. Исключением может быть ситуация, когда он увидит на каком-нибудь сайте сообщение, что его IP-адрес забанен из-за большого количества запросов, или когда у него возникнут сложности с загрузкой редкого торрента.
Но если вы захотите создать на своём компьютере сервер, а ваш провайдер предоставляет доступ с использованием NAT, то обратиться к серверу из интернета будет сложно или вообще невозможно. Поэтому часто для размещения своих серверов в интернете используют технологию Virtual Private Server (
Организации, которые предоставляют услугу
У
Эта услуга выгодна как провайдеру, так и конечному пользователю. Провайдер может более рационально использовать имеющийся у него пул физических компьютеров, а пользователь получает виртуальный компьютер, почти не отличающийся от реального, по гораздо меньшей цене, чем в случае аренды реального компьютера.
Благодаря современным графическим пользовательским интерфейсам провайдера, создание
Пользователи получают полноценный узел в интернете, который могут использовать по своему усмотрению. Это может быть персональный сайт, VPN-сервер, игровой сервер. Применение ограничивается только фантазией, знаниями и умениями пользователя.
Многие задачи по администрированию
Суть туннелирования заключается в том, что пакеты из одного протокола передачи данных помещаются без изменения в пакеты другого для передачи по сети. Говорят, что второй протокол является транспортным протоколом для другого. Чаще всего туннелирование, обычно совместно с шифрованием, используется для организации VPN (Virtual Private Network).
В нашем случае мы будем использовать UDP-туннель для передачи пакетов IPX. Иными словами, пакеты IPX будут упаковываться в пакеты UDP и передаваться в сети. Это сделает возможным использование протокола IPX в интернете.
Если вы размещаете сервер в интернете, то вам лучше защитить его при помощи Firewall. В Firewall прописываются правила, которые определяют на базовом уровне, откуда можно обратиться к вашему серверу и к каким службам сервера. К счастью, большинство провайдеров
Ранее я практически не сталкивался с этим эмулятором. Если я хотел запустить приложения для DOS, то использовал виртуальные машины (VMWare Player, VMWare Workstation, Oracle Virtual Box) или эмуляторы (Bochs, Qemu). Попробовав DOSBox, а потом и DOSBox Staging, я понял для себя, что последний лучше всего подходит для запуска старых игр для DOS.
Изначально я недооценивал этот эмулятор, считая его просто упрощённой версией VMWare, Virtual Box или Qemu. Однако из-за того, что его назначение узкоспециализированное – эмуляция DOS, его скорость и точность эмуляции впечатляют.
По моим ощущениям совместимость с программами для DOS у него гораздо выше, чем у упомянутых ранее виртуальных машин и эмуляторов. Он великолепно эмулирует работу звуковых карт, сетевой протокол IPX, что для меня ранее казалось проблематичным. Если DOS-программа не воспроизводила звук или нельзя было воспользоваться её сетевыми возможностями, я делал поправку на то, что всё-таки прошло много времени, и, раз не работает, можно опустить этот момент.
IPX-сеть можно создать, используя команду ipxnet startserver в консоли DOSBox Staging, но это решение не очень удобное, если размещать сервер IPX на
Ipxbox — это программа, написанная на языке Go, позволяющая организовывать IPX-сеть из экземпляров DOSBox в TCP/IP сети. Если интересно, что ещё позволяет делать программа, можете посмотреть дополнительную информацию на сайте [6] или на YouTube-канале автора программы [7].
Чем больше я использую Docker, тем больше убеждаюсь в том, что это универсальное решение, которому можно найти всё больше и больше применений. В нашем случае я создал Docker-образы dedicated-сервера Quake и программы ipxbox.
Вероятно, можно было найти уже современную реализацию сервера Quake для Linux и упаковать его в Docker-образ, но тогда нужно было бы думать, как настроить TCP/IP в DOS. Поэтому я решил создать докер-образ с Quake для DOS, а не Linux. Получилось интересное, на мой взгляд, и работающее решение – Quake для DOS, запускаемый в Docker-контейнере.
Нам понадобится несколько Docker-контейнеров: один контейнер с IPX-сервером и один или несколько контейнеров с Quake-серверами. Управлять таким вроде бы и небольшим разнообразием уже не так удобно, как одним контейнером, поэтому нам поможет утилита docker-compose.
Docker-compose позволяет создавать несколько Docker-контейнеров и управлять ими. Структура мультиконтейнерного приложения описывается в файле docker-compose.yml.
QUAKE.EXE -nocdaudio
....
[ipx]
ipx = true
[autoexec]
mount c: c:games
c:
cd quake
Теперь в DOSBox Staging для запуска Quake можно будет просто ввести в консоли start.
Если у вас есть локальная сеть, то перед запуском Quake можно на одном из компьютеров запустить IPX-сервер при помощи команды в DOSBox консоли:
DOSBOX> ipxnet startserver 10000
Где 10000 — это номер UDP-порта, на котором будет запущен IPX-сервер. Разумеется, вы можете использовать другой порт.
Остальные игроки в локальной сети могут подключиться к этой созданной IPX-сети с помощью команды:
DOSBOX> ipxnet connect your.machine 10000
Где your.machine — это IP-адрес или доменное имя компьютера, на котором запущен IPX-сервер.
Теперь вы можете играть по сети, только сеть локальная, а подключиться к ней из интернета будет проблематично. Я решил эту проблему путём создания общедоступного сервера IPX в сети Internet. Чтобы всех игроков поставить в равные условия, я также создал dedicated-сервер Quake, а вернее два, чтобы добавить универсальности решению.
Самый простой способ запустить IPX-сервер и dedicated Quake сервера — загрузить созданный мной docker-compose.yml файл [11] из интернета и выполнить в директории с файлом docker-compose.yml следующую команду:
$ docker-compose up -d
Чтобы остановить и удалить сервера, выполняются команды:
$ docker-compose stop
$ docker-compose rm
Если вы хотите узнать, как сделать такой файл самим и больше подробностей, то ниже приведена инструкция.
Структуру проекта и содержимое файлов вы можете посмотреть в репозитории, ниже привожу описание только самых важных из них.
Для ясности структура директорий с файлами приведена на рисунке.
Структура проекта
FROM ubuntu:22.04 as builder
RUN apt-get update && apt install --yes golang libpcap-dev openssl ca-certificates
RUN mkdir -p /app/
WORKDIR /app/
RUN go mod init m.test
ARG CERT_LOCATION=/usr/local/share/ca-certificates
RUN mkdir -p ${CERT_LOCATION}
RUN openssl s_client -showcerts -connect github.com:443 </dev/null 2>/dev/null|openssl x509 -outform PEM > ${CERT_LOCATION}/github.crt
RUN openssl s_client -showcerts -connect proxy.golang.org:443 </dev/null 2>/dev/null|openssl x509 -outform PEM > ${CERT_LOCATION}/proxy.golang.crt
RUN update-ca-certificates
RUN go get github.com/fragglet/ipxbox
RUN go build github.com/fragglet/ipxbox
FROM ubuntu:22.04
RUN apt-get update
RUN apt install --yes libpcap-dev
WORKDIR /app
COPY --from=builder /app/ipxbox /app/ipxbox
CMD ./ipxbox --port 10000
Файл ipxbox/Dockerfile
Чтобы созданный Docker-образ содержал меньше ненужных данных, в Dockerfile описываем так называемый multistage build. Он подразумевает, что в одном Dockerfile описывается один Docker-образ со средой для сборки, а второй для размещения собранных файлов. В результате Docker-образ будет занимать меньше места на диске.
FROM ubuntu:20.04
RUN apt update && apt install --yes software-properties-common
RUN add-apt-repository ppa:feignint/dosbox-staging &&
apt update &&
apt install --yes dosbox-staging gettext
RUN mkdir -p /app/quake
COPY quake/ /app/quake
ENV SDL_VIDEODRIVER=dummy
ENV IPX_SERVER_ADDRESS=192.168.0.161
ENV IPX_SERVER_PORT=10000
ENV QUAKE_SERVER_NAME="DEFAULT SERVER"
COPY dosbox-staging.conf.templ /app/dosbox-staging.conf.templ
COPY quake-config.cfg.templ /app/quake-config.cfg.templ
COPY start.sh /app/start.sh
RUN chmod 777 /app/start.sh
CMD /app/start.sh
Файл quake-server/Dockerfile
При запуске Docker-контейнера у нас будут добавлены следующие переменные окружения: SDL_VIDEO_DRIVER, IPX_SERVER_ADDRESS, IPX_SERVER_PORТ и QUAKE_SERVER_NAME.
SDL_VIDEO_DRIVER нужно проинициализировать значением dummy, чтобы DOSBox запустился в так называемом headless mode, т. е. без использования графических возможностей. Для сервера они нам не нужны.
IPX_SERVER_ADDRESS и IPX_SERVER_PORT нужны, чтобы указать DOSBox, где находится IPX-сервер.
QUAKE_SERVER_NAME — это имя dedicated Quake-сервера, который будет отображаться в списке при подсоединении к сетевой игре.
Файлы dosbox-staging.conf.templ и quake-config.cfg.templ — это шаблоны конфигураций DOSBox и Quake, которые преобразовываются в файлы конфигурации при запуске скрипта start.sh.
Скрипт start.sh, помимо этого, ещё выполняет задержку в 10 секунд перед запуском dedicated Quake-сервера. Это нужно, чтобы IPX-сервер успел загрузиться до запуска dedicated Quake-сервера. Решение неэлегантное, но на первый случай сгодится ввиду своей простоты.
Для скрипта start.sh устанавливаются атрибуты 777, чтобы его можно было запустить. По умолчанию git не хранит атрибуты файлов — можно или повозиться с настройкой Git или воспользоваться этим решением.
version: "3.9"
services:
ipxserver:
restart: always
build: ipxbox/.
ports:
- "10000:10000/udp"
image: "artyomsoft/ipxbox"
gameserver1:
restart: always
build: quake-server/.
depends_on:
- ipxserver
environment:
- IPX_SERVER_ADDRESS=ipxserver
- IPX_SERVER_PORT=10000
- QUAKE_SERVER_NAME=DEFAULT_S1
image: "artyomsoft/quake-server"
gameserver2:
restart: always
build: quake-server/.
depends_on:
- ipxserver
environment:
- IPX_SERVER_ADDRESS=ipxserver
- IPX_SERVER_PORT=10000
- QUAKE_SERVER_NAME=DEFAULT_S2
image: "artyomsoft/quake-server"
Файл docker-compose.yml
Файл docker-compose.yml, думаю, понятен без дополнительных пояснений.
$ docker-compose up --build --force-recreate -d
Опция build нужна, чтобы перед запуском контейнеров собрались образы для них, опция --force-recreate нужна, чтобы контейнеры пересоздавались при запуске, а опция d, чтобы они запускались в фоне.
DOSBOX> ipxnet connect 127.0.0.1 10000
DOSBOX> start
$ docker-compose stop
$ docker-compose rm
Собираем и пушим образы на DockerHub:
$docker-compose build
$doker-compose push
Для хранения исходного приложения я использовал GitHub. Вы также можете создать публичный репозиторий на GitHub и поместить приложение туда.
Shell в Linux трепетно относится к окончаниям строк в файлах *.sh, поэтому убедитесь, что у вас файлы *.sh имеют Unix-окончание строк и явно пропишите это в файле .gitattributes.
Создайте репозиторий на GitHub, а потом у себя в корне проекта выполните следующие команды:
$ git init
$ git add .
$ git remote add origin <ссылка на ваш репозиторий>
$ git commit -m "Initial commit"
$ git push -u master origin
После успешного пуша репозитория на github создайте release и добавьте туда файл docker-compose.yml. Это позволит удобно скачивать этот файл по HTTP.
Выбор
За стоимость двух поездок в метро или бургера вы получаете на месяц в пользование
Чтобы получить
Из всех параметров конфигурации сервера для тарифа Start, предложенных RUVDS, я поменял только операционную систему на Ubuntu 20.04 и через несколько минут я получил готовый
Конфигурация моего
Если вы выберете расположение
RUVDS не является регистратором доменов, и если вы хотите, чтобы у вашего
Адреса DNS RUVDS
Привязка доменного имени к
Для более безопасной работы VPS-сервера желательно настроить Firewall. Firewall настраиваем не в
Правила Firewall
$apt update
$ apt install --yes docker.io curl
$ curl -SL https://github.com/docker/compose/releases/download/v2.15.0/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
$ ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
$ chmod +x /usr/local/bin/docker-compose
$ systemctl enable docker
Так как теперь Docker прописан в автозагрузку (команда systemclt enable docker), то и мультиконтейнерные приложения будет перезапускаться при перезагрузке
$ cd ~
$ mkdir quake-servers
$ cd quake-servers
$ curl -SL <http адрес вашего docker-compose.yml> -o docker-compose.yml
$ docker-compose up -d
Если вы создали свой GitHub-репозиторий и релиз в нём, то используйте http-ссылку на docker-compose.yml из него. Важно, чтобы
DOS BOX> ipxnet connect <адрес вашего VPS> 10000
DOS BOX> start
Выбор севера Quake
Игровой процесс
Вы можете запустить два экземпляра DOSBox c Quake и таким образом проверить, как они работают по сети вместе.
Теперь вы можете делиться с друзьями адресом вашего ipxbox и играть с ними по сети в Quake для DOS, вспоминая те добрые времена. А ещё можно создать групповой звонок в Telegram, и тогда вы сможете делиться своими эмоциями голосом во время игры.
Чтобы заставить всё работать как надо, я перепробовал несколько вариантов решения проблемы. Например, для создания IPX-сервера я изначально использовал эмулятор DOSBox, но потом посчитал, что использование выделенного сервера для IPX более элегантное решение.
Вместо Docker и docker-compose можно было обойтись systemd, но такое решение мне кажется более сложным и менее переносимым.
Моё решение годится небольшой компании для развлекательных целей, так как создание решения уровня production требует значительных доработок.
В частности, я знаю про следующие недостатки:
Несмотря на развлекательный характер статьи, вы получили базовые знания и умения по работе c
Говорят, что, если у вас что-то не получается с первого раза — это даже хорошо, так как вы больше изучите и запомните. Скажу по секрету, у меня тоже не всё было гладко с первого раза, так что дерзайте.
Автор:
artyomsoft
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/dosbox/382662
Ссылки в тексте:
[1] В прошлой статье: https://habr.com/ru/company/ruvds/blog/707220/
[2] моём репозитории на GitHub: https://github.com/artyomsoft/quake-for-dos-over-ipx
[3] VPS: https://www.reg.ru/?rlink=reflink-717
[4] перейти к делу: #howto
[5] Варианты внешних серверов с сайта DOSBox: https://www.dosbox.com/wiki/Connectivity#Dedicated_server
[6] на сайте: https://github.com/fragglet/ipxbox
[7] на YouTube-канале автора программы: https://www.youtube.com/user/fragglet
[8] Quake: https://archive.org/download/quake_dos/Quake.zip
[9] archive.org: https://archive.org/details/quake_dos
[10] DOSBox Staging: https://github.com/dosbox-staging/dosbox-staging/releases/download/v0.80.1/dosbox-staging-v0.80.1-setup.exe
[11] созданный мной docker-compose.yml файл: https://github.com/artyomsoft/quake-for-dos-over-ipx/releases/download/v0.0.1/docker-compose.yml
[12] тарифном плане Start от RUVDS: https://ruvds.com/vps_start/
[13] сайте RUVDS: https://ruvds.com/
[14] Источник: https://habr.com/ru/post/710546/?utm_source=habrahabr&utm_medium=rss&utm_campaign=710546
Нажмите здесь для печати.