26 мая 2014

Мультизагрузочная флешка MultiBoot USB flash key

Данная статья является руководством, как создать загрузочную флешку используя syslinux или grub2.

Загрузочная флешка крайне полезная вещь, она может понадобиться в любой момент. Поэтому, позаботьтесь о ее создании заранее, что бы всегда быть во все оружии.

Наша флешка будет иметь красивый графический интерфейс, поддержку русских шрифтов и обладать следующими функциями:
  1. Загрузка различных ОС, включая DOS, Windows, Linux, FreeBSD и другие
  2. Загрузка с разных разделов и дисков
  3. Установка осей Windows, Linux и FreeBSD непосредственно с флешки
  4. Сканирование антивирусными средствами
  5. Диагностика, восстановление информации, изменение разделов и клонирование дисков
  6. Запуск своей среды на любом компе, Ubuntu в persistent режиме c сохранением всех изменений на флешке.
Сразу должен предупредить. Не используйте медленные флешки! Иначе Ubuntu в persistent режиме будут так сильно тормозить, что работать станет не возможно. Я экспериментировал с двумя флешками. Одна Selicon-power 32Gb, скорость чтения  20 Mb/s и записи 9Mb/s. Этого было крайне не достаточно, можно было несколько минут ждать пока запустится firefox. Вторая Transcend 64Gb, скорость чтения 40Mb/s, записи 18Mb/s. Здесь работать очень комфортно, задержек нет совсем. Измерения скорости проводил с помощью Chak Flesh.   

Безусловно ключевую роль в этом деле играет загрузчик. Традиционно для переносных накопителей используют grub4dos или syslinux. Они примерно одинаковые и все что есть у одного затем появляется у другого. Оба легки в использовании и могут грузить все необходимое. К тому же возможно вызывать один из другого. Так что особой разницы между ними нет, это больше дело вкуса и привычки.

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

Для пользователей windows есть один неудобный момент. Его нельзя установить из этой ос. Поэтому на первом этапе мы создадим вспомогательную загрузочную флешку с дистрибутивом Linux. Для этого нам потребуется образ Ubuntu и флешка размером не менее 1 Гб.

Сделать LiveUSB из образа Ubuntu можно легко и быстро с помощью программы Universal USB Installer. А можно еще быстрее, просто скопировать образ на флешку и воспользоваться загрузчиком syslinux. Кому, что больше нравится. Если вас не интересует syslinux, сразу переходите ко второму этаму. 

Создание загрузочной флешки с syslinux
И так вы уже скопировали образ на флешку. Еще из него нужно вытащить два файла initrd.lz и vmlinuz из папки casper и положить в корень. Они нужны для загрузки. Теперь скачиваем последнюю версию syslinux с официального ресурса. В архиве в папке bios будут папки win32 и win64, выбираете ту, которая соответствует разрядности вашей ос. Внутри лежит установщик syslinux.exe. Запускаете командную строку от имени администратора и даете команду установки загрузчика syslinux. Эта команда запишет файлы ldlinux.c32 и ldlinux.sys в корень, разместит загрузчик в MBR и сделает диск активным.
syslinux.exe -m -a z:
где z: - это буква вашей флешки.
Мы используем графический режим и для этого нам потребуются файлы vesamenu.c32, libutil.c32 и libcom32.c32. Надите их в папке /bios/com32 и тоже положите в корень. Теперь там осталось создать конфигурационный файл syslinux.cfg.
UI vesamenu.c32
MENU RESOLUTION 1024 768
#разрешение картинки должно соответствовать разрешению графического режима, т.е. в нашем случае быть 1024x768, поддерживаются PNG и JPEG.
MENU BACKGROUND background.png
#русский шрифт
FONT UniCyr_8x16.psf

#цвета элементов меню
menu color border 0 #00000000 #00000000 none
menu color unsel 0 #90ffffff #00000000 none
menu color sel 0 #ff60CA00 #00000000  std
menu color tabmsg 0 #00000000 #00000000 none
Цвета задаются в формате #AARRGGBB, т.е. в шестнадцатеричном виде прозрачность, красный, зеленый и синий каналы. Например #00000000 – полностью прозрачный, а #ffffffff – непрозрачный белый. Первое значение – цвет переднего плана, второе – фон. Последний параметр – тень, может принимать значения none, std, all и rev.

В syslinux используются любые консольные шрифты в формате psf. Например, их можно взять в linux в папке consolefonts. Так же подойдет courier из windows. Я использовал шрифт UniCyr из пакета Console tools cyrillic

Самое главное в syslinux.cfg добавить пункт меню для запуска ubuntu.
LABEL Ubuntu
LINUX /vmlinuz
INITRD /initrd.lz
APPEND boot=casper iso-scan/filename=/ubuntu-14.04-desktop-i386.iso locale=ru_RU.UTF-8 quiet splash --
Теперь все, создание вспомогательной загрузочной флешки закончено. В принципе можно остановиться и на этом варианте с syslinux.

На втором этапе, запускаем ubuntu с помощью вспомогательной флешки и вставляем нашу будущую мультизагрузочную флешку. Открываем терминал, по умолчанию его нет на панели, для этого кликаем на иконке поиска и пишем ter, он появится. 

Структура флешки

На этом этапе мы разобьем флешку на 4 первичных раздела. Это максимальное число для таблицы MBR, если нужно большее число разделов, то используйте GPT таблицу. Но windows будет загружаться только на компьютерах с UEFI. Поэтому MBR предпочтительней для совместимости со старым железом. Я использовал флешку объемом 64GB, поэтому не был сильно ограничен в пространстве.
  1. Первый будем использовать как место для хранения данных, а так же с него будем устанавливать дистрибутивы windows и др., которые обязательно требуют первого раздела. Сделаем его максимально большим.  
  2. Второй для загрузчика GRUB 2 и разных программ и образов, которые будем запускать прямо с диска. Поэтому сделайте его нужного размера, например 10GB. 
  3. Третий отдадим для хранения данных live-системы Ubuntu, это так называемый casper-rw, около 5GB. 
  4. И последний будет для установочного дистрибутива FreeBSD, около 1GB, сюда мы  извлечем образ установочного диска memstick.img.  
К слову сказать максимально может быть только 4 основных раздела, если вам нужно больше, то придется создавать расширенные.

Обратите внимание, что установщик windows может запускаться только c первого primary раздела!
 
Для работы с разделами воспользуемся утилитой fdisk, в качестве параметра указываем нашу флешку.
sudo fdisk /dev/sdc
Что бы узнать какое имя у вашей флешки, выполните команду sudo fdisk –l,  в моем случае это sdc.

Далее находясь внутри утилиты
1) Командой “o”создадим чистую таблицу разделов MBR.
2) Командой “n”добавим первый primary раздел. Его можно сделать самым большим, здесь будут хранится разные файлы и дистрибутив Windows. У меня флешка на 64GB, поэтому я выделил +50G.
3) Затем создаем еще один первичный раздел, здесь будут лежать некоторые образы linux, в частности ubuntu, программы acronic, так же по желанию eset sysrescuer, drweb livecd и др. Мне хватит +3G.
4) И третий первичный раздел под все оставшееся пространство, около 5G для хранения всех изменений Ubuntu.
5) В конце сохраним все изменения командой “w”.

Теперь отформатируем разделы. Первый нам все таки придется сделать в fat32, поскольку с него будет ставится дистрибутив Windows, а с exfat он не дружит. Второй тоже в fat32, третий в ext4, а четвертый вообще не будем форматировать, на него потом поблочно запишем образ freebsd.
sudo mkfs.vfat -n transcend /dev/sdc1
sudo mkfs.vfat -n linux /dev/sdc2

sudo mke2fs -t ext4 /dev/sdc3 -O ^has_journal -L casper-rw 
Параметр -n задает имя тома, для mke2fs это -L. Удобно их назначить сразу, т.к. при автоматическом монтировании они сразу будут иметь понятные имена, а не цифры volum-id. Но том в exfat все равно придется переформатировать в виндовс, форматирование в ubuntu она его не принимает.

А метки можно добавить и позднее. Для файловых систем ext это делается командой
sudo e2label /dev/sdc3 casper-rw
для vfat:
sudo mlabel -i /dev/sdc1 ::win
Мы выбрали для casper-rw файловую систему ext4, поскольку она будет работать пошустрее. Еще обратите внимание, что мы создали  ext4 с опцией  -O ^has_journal  она отключает журнал и тем самым уменьшается количество циклов перезаписи. Это крайне важно для флеш памяти. 
Проверить, что этой опции нет на разделе можно командой
sudo dumpe2fs /dev/sdc3 | more
Casper-rw так же может быть и в виде отдельного файла и лежать в корне любого раздела. Ubuntu сама найдет его и подключит. Это не обязательно и сугубо по желанию, либо отдельный раздел, как мы создали ранее, либо файл. С разделом работать должно побыстрее. Что бы создать такой файл пишем
dd if=/dev/zero of=casper-rw bs=1M count=3000
И создаем внутри него файловую систему
sudo mkfs.ext4 casper-rw -O ^has_journal
Размер выбирайте исходя из своих потребностей, сколько места вам нужно под разные пакеты. Только помните, если он будет лежать на fat32, то там есть ограничение не более 4Гб. Поэтому отдельный раздел для casper-rw предпочтительней.

Небольшое отступление.

Как известно на флеш-накопителях целесообразнее использовать файловую систему fat32, нежели ntfs, поскольку она записывает меньше служебной информации и тем самым увеличивает срок ее службы. Но зато есть ограничение на максимальный размер файла не более 4 Гб.  Для этого была придумана exfat, она предназначена специально для флешь памяти, и здесь уменьшено число перезаписей одного сектора. Поэтому если вам нужен большой раздел на флешке, то  exfat будет лучшим вариантом.

Только в ubuntu по умолчанию нет встроенной поддержки этой файловой системы, поскольку она разработана Microsoft. Но ее легко можно добавить.

Сначала добавим репозиторий Universe 
sudo add-apt-repository universe
Обновим кеш всех пакетов
sudo apt-get update 
Установим пакеты exfat-fuse и exfat-utils для поддержки exfat
sudo apt-get install exfat-fuse exfat-utils
Монтирование будет происходить автоматически, когда будете вставлять флешку или вручную
sudo mount -t exfat /dev/sdс1 /mnt

Продолжаем, Теперь смонтируем второй раздел /dev/sdc2 в директорию /mnt и установим загрузчик grub2
sudo mount /dev/sdc2 /mnt
sudo grub-install --no-floppy --root-directory=/mnt /dev/sdc  
На втором разделе мы будем хранить разные образы дистрибутивов windows. И по мере необходимости  для установки извлекать из них файлы в корень на первый раздел. Эту процедуру мы будем делать из ubuntu. Здесь пригодится команда для  монтирования iso-образов
sudo mount -o loop /file.iso /mount_point
Копируем файлы командой cp
cp –r * /media/transcend
Теперь переходим к настройке загрузчика. На втором разделе в директории /boot/grub создадим конфигурационный файл grub.cfg.

Имейте в виду, что это не обычный файл настроек, а настоящий shell-подобный скрипт с функциями, условиями и переменными. Такой подход позволяет создавать даже динамическое меню! Каждая строка здесь это отдельная команда, они выполняются по порядку, символ # в начале строки – комментарий.  

Чтобы узнать какие разрешения поддерживаются вашим оборудованием в консоли grub наберите
vbeinfo
Мы запускаем grub2 в графическом режиме, для этого в grub.cfg напишем 
#модуль для bios
insmod vbe
#загружаем все шрифты из темы.
loadfont /boot/grub/themes/5/*.pf2
#графический режим
set gfxmode=auto
#подгружаем граф. терминал
insmod gfxterm
# запускаем граф. терминал
terminal_output gfxterm
#поддержка png и jpg изображений
insmod png
insmod jpeg
#устанавливаем фоновую картинку
#background_image /grub/backgrounds/1.png
# подключаем файл темы
set theme=/boot/grub/themes/5/theme.txt

Мы будем использовать тему, чтобы убрать рамку и заголовок меню в grub2. В папку themes/5 нужно положить фоновую картинку и создать текстовый файл theme.txt
title-text: ""
desktop-image: "fone.jpg"
+ boot_menu {
left = 10%
top = 10%
width = 80%
height = 80%


item_color = "#FFFFFF"
item_height = 16
item_spacing = 2
selected_item_color = "#0000FF"

}
+ label{
 left = 50%-300
 top = 95%
 width = 600
 height = 30
 text = "@KEYMAP_SHORT@"
 color = "white"
 align = "center"
 }
Можно использовать и свои шрифты. Только сначала их нужно конвертировать в формат pf2, для этого в linux есть утилита grub-mkfont.

Делается это так
grub-mkfont font.ttf -s size -o font.pf2 -v
Опция –v покажет полное имя шрифта, которое нужно указать в файле темы.
+ boot_menu {
...
item_font = "Kabelc Regular 16"
selected_item_font ="Kabelc Regular 16" 
...
Шрифты положить в папку с темой.

Еще у Grub2 есть замечательная особенность, он умеет загружать linux целиком из образа. Но поддерживает далеко не все дистрибутивы и уж тем более не поддерживает образы windows.

Добавим в grub.cfg пункт меню для запуска Ubuntu в persistent режиме, т.е. с возможностью сохранения измнений.
menuentry "Ubuntu LiveUSB" {
loopback loop /iso/ubuntu-14.04-desktop-i386.iso
linux (loop)/casper/vmlinuz file=/cdrom/preseed/ubuntu.seed persistent boot=casper iso-scan/filename=/iso/ubuntu-14.04-desktop-i386.iso locale=ru_RU.UTF-8 quiet splash --
initrd (loop)/casper/initrd.lz
}
Для запуска в режиме liveCD без сохранения изменений достаточно написать
menuentry "Ubuntu LiveCD" {
loopback loop /iso/ubuntu-14.04-desktop-i386.iso
linux (loop)/casper/vmlinuz boot=casper iso-scan/filename=/iso/ubuntu-14.04-desktop-i386.iso locale=ru_RU.UTF-8 noeject noprompt –
initrd (loop)/casper/initrd.lz
}
Для syslinux.cfg запуск ubuntu в persistent режиме будет выглядеть следующим образом.
LABEL Ubuntu persistent
LINUX /boot/vmlinuz
INITRD /boot/initrd.lz
APPEND file=/cdrom/preseed/ubuntu.seed persistent boot=casper iso-scan/filename=/boot/ubuntu-14.04-desktop-i386.iso locale=ru_RU.UTF-8 quiet splash –
Но перед тем как его запустить так же предварительно надо создать casper-rw. Для этого можете сначала загрузиться в режиме livecd прямо с этой же флешки. Она монтируется в дирикторию isodevice.

Я придерживаюсь аскетичного мнения, что для решения большинства задач можно обойтись одним live дистрибутивом, например Ubuntu. Здесь есть все необходимое. Можно поставить разные антивирусы для проверки windows-разделов, например, clamav, avast или даже comodo, удобный gparted для работы с разделами, встроенная дисковая утилита palimpsest, утилита testdisk для восстановления данных, ну и конечно fdisk, dd и многое другое. 

Поэтому после того как загрузите Ubuntu, настройте все под себя и поставьте необходимые пакеты.   
Первым делом установите обновления
sudo apt-get update
sudo apt-get upgrade
Если понадобится найти какой-нибудь пакет по маске, то воспользуйтесь командой
sudo apt-cache search mask
Процесс обновления может занять около часа. Если вы получите следующие ошибки "failed to symbolic-link boot/initrd.img" или "dpkg: error processing package linux-image-extra", то нужно выполнить
sudo rm /initrd.img
sudo rm /usr/sbin/update-initramfs
sudo dpkg-divert --rename --remove /usr/sbin/update-initramfs
sudo apt-get install --reinstall linux-image-3.2.0-24-generic
поставьте clamav
sudo apt-get install clamav
обновите его базы
sudo freshclam
И можете сканировать
sudo clamscan -г –i –move=/tmp /folder
Чтобы установить comodo, скачайте установочный deb-пакет с оффициалльного сайта и действуйте через центр приложений.
Установим testdisk и запустим
sudo apt-get install testdisk
sudo testdisk

Теперь добавим пункт меню для установки Windows с флешки. Не забывайте, что все файлы, извлеченные с установочного диска, должны находиться на первом разделе флешки.
menuentry 'Install Windows'{
set root='hd0,msdos1'
insmod ntldr
ntldr /bootmgr
}
В процессе установки windows вы можете получить такое сообщение “Программе установки Windows не удалось настроить Windows для работы с оборудованием этого компьютера". Не пугайтесь, в это случае нужно нажать Shift+F10 и в появившейся командной строке выполнить oobe\msoobe.exe,  установка продолжится дальше. 

Для подстраховки, чтобы установка windows шла гладко с самого начала нужно после копирования файлов, перед первой перезагрузкой вынуть флешку и дать загрузиться стандартному загрузчику ntldr и тогда никаких ошибок не должно быть!

А вот установку Windows XP будем выполнять из DOS-а с помощью команды winnt.exe, это проще и удобней, нежели использовать firadisk и grub4dos. Здесь тоже нужно скопировать все файлы с установочного диска на первый раздел флешки. Затем загрузиться в DOS при помощи же нашей флешки, выбрав пункт FreeDOS и там перейти в каталог i386. Что бы указать куда устанавливать WinXP нужно задать параметр /t[:диск].

Например,
cd i386
winnt.exe /t:d 
Установка пойдет на диск d, который предварительно следует отформатировать в fat32.
Полный список команд вы всегда можете получить по ключу /?

Аналогичным образом добавим пункт установка FreeBSD. Для этого мы извлечем установочный диск на 4 раздел нашей флешки. Делать это будем из ubuntu.
dd if=FreeBSD-10.0-RELEASE-amd64-memstick.img of=/dev/hda0s4 bs=10240 conv=sync
И в grub.cfg добавим
menuentry "Install FreeBSD" {
set root=(hd0,4)
kfreebsd /boot/loader
}

Еще eсть один интересный нюанс. Когда вы вставите нашу флешку с несколькими разделами, то windows увидит только первый. Это такое ограничение для сменных носителей. И чтобы получить доступ к другим разделам есть хорошая программа bootice. Она может измененять MBR и на лету присваивает метку нужному разделу. Делается это буквально в два клика. Заходите в Parts Manage выделяете нужный раздел и нажимаете set accessible.

Только обязательно после того как поработаете верните все назад, иначе не сможете загружаться!

Давайте еще добавим на флешку две очень полезные утилиты Acronis Disk Director и Acronis True Image Home.  Здесь нам тоже понадобится вспомогательная флешка. Сначала мы скачаем их настольные версии, например с rutracker, установим и запустим мастер создания загрузочных носителей. Установливать будем раздельно, сначала выберем только Disk Director. Когда мастер завершит работу скопируем все файлы с вспомогательной флешки в какую-нибудь папку на нашу мультизагрузочную флешку, наример в dd, это займет около 50 Мб. И повторим операцию для True Image, только скопируем все файлы в другую папку, например в ti, это займет еще 200 Мб.

Их можете скачать у меня Acronis True Image 2015 v18.0 Build 6525 (146 Мб), Acronis Disk Director 12.0.3223 (146 Мб), Acronis Universal Restore 2015 v11.5 Build 38938 (223 Мб). 

Пропишем соответствующие пункты меню в grub.cfg
menuentry "Acronis True Image 2015 v18.0 Build 6525" {
set root=hd0,2
linux /acronis/ATI2015/dat9.dat vga=791 quiet force_modules=usbhid
initrd /acronis/ATI2015/dat8.dat
}

menuentry "Acronis Disk Director 12.0.3223" {
set root=hd0,2
linux /acronis/ADD12/dat7.dat vga=791 quiet
initrd /acronis/ADD12/dat6.dat
}

menuentry "Acronis Universal Restore 2015 v11.5 Build 38938" {
set root=hd0,2
linux /acronis/AUR2015/2.krn vga=791 quiet
initrd /acronis/AUR2015/2.fs
}
Если в Acronis True Image у вас не работают USB клавиатура и мышь, то в звгрузку ядра нужно добавить  такой параметр.
force_modules=usbhid
Меню запуска Clonezilla. Это отличный инструмент для клонирования дисков, с возможностью сохранять образы на сетевых ресурсах. Поскольку Clonezilla live основана на Debian live, то ее можно гузить прямо из iso-образа.
menuentry "Clonezilla-live-2.3.2-22-i586.iso" {
set isofile="/iso/clonezilla-live-2.3.2-22-i586.iso"
loopback loop $isofile
linux (loop)/live/vmlinuz boot=live live-config nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"\" ocs_live_batch=\"no\" ocs_lang=\"\" vga=788 ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile
initrd (loop)/live/initrd.img
}
На случай если вы вдург забудите вытащить флешку сделаем загрузку из MBR первого раздела первого диска по умолчанию автоматом через 5 сек.
menuentry "MBR First disk" {
set root=(hd1)
chainloader +1
}

GRUB_DEFAULT="MBR First disk"
GRUB_TIMEOUT=”5”
По аналогии можно напрямую грузить ОС с любых разделов, например с первого.
menuentry "First partition first disk" {
set root=(hd1,1)

chainloader (hd1,1)+1
}
Здесь hd1 – первый жесткий диск, поскольку hd0 – флешка с которой загрузились. Нумерация разделов начинается с 1.

Часто бывает нужно загрузить DOS. Для этого берем подходящий образ загрузочной дискеты и копируем его на флешку, например в папку /boot. Образ с freedos можно взять здесь, его создание описывалось в соседней статье.  Еще понадобится memdisk из пакета syslinux, его тоже надо положить в /boot. 
Добавим пункт меню
menuentry "FreeDOS " {
set root='(hd0,2)'
linux16 /boot/memdisk floppy
initrd16 /boot/FDBOOT.IMG
}
Для syslinux.cfg это будет выглядеть так
LABEL FreeDOS
kernel memdisk
append initrd=/boot/fdboot.img floppy
В нашу мультизагрузочную флешку обязательно следует включить утилиту MHDD для диагностики жестких дисков. Скачиваем iso-образ с офф. сайта, внутри него лежит img-образ дискеты, копируем его на флешку в папку /boot. И добавляем в меню.
menuentry "MHDD " {
set root='(hd0,2)'
linux16 /boot/memdisk floppy
initrd16 /boot/Bootable_1.44M.img
Все вышеупомянутые команды можно выполнять прямо в консоли загрузчика.  Для этого в меню нажмите клавишу “c” и видим приглашение grub>. Чтобы выйти из консоли наберите exit или нажмите ESC. Первым делом задаим постраничный вывод pager=1. Команда ls –l выдает информацио о доступных дисках. А если ей задать в качестве параметра определенную папку ls -lh /boot то увидите ее содержимое. Команда cat покажет содержимое текстового файла. Ну и традиционно help выводит список всех доступных комманд.
На этом все, поздравляю вы создали собственную мультизагрузочную флешку, которая выручить в трудный момент!

Готовый файл настроек grub.cfg можете взять тут.



01 мая 2014

The Horde

В данной статье речь пойдет о проблеме запуска старых досовских игр на современных компьютерах, а так же будут затронуты вопросы программной эмуляции процессоров

The Horde - это старая, но очень славная компьютерная игра, которая сильно увлекла меня в детстве.  Тогда у меня был Pentiun 100 и он считался очень серьезным компьютером.  Его уже давно нет, а вот CD-диск с игрой до сих пор где-то лежит и периодически попадается мне на глаза, напоминая о веселом детстве.
Эта игра вышла еще аж в 1994 году, но сюжет и игровой процесс были крайне необычными и опережающими свое время. Сейчас ее можно классифицировать как смесь экшена третьего лица и стратегии реального времени. Наверно этим она привлекла мое детское внимание и запомнилась больше всех остальных.
Задача главного героя по имения Чанси охранять королевкие угодия от красных монстров, называющих себя ордой, отсюда и название the horde. Для этого у него есть длинный меч, подаренный королем, которым он очень забавно махает. Монстры совсем не страшные, а добрые и смешные, весело прыгают по полям и поедают местных жителей вместе с их домами. Озвучка при этом просто шедевр и заслуживает особого внимания. Помимо охраны деревень герою необходимо платить налоги, ведь если он не сможет расплатиться, то его посадят в тюрьму и игра будет закончена. Деньги на уплату налогов игрок получает от жителей и их коров, поэтому он заинтересован в том, чтобы спасти как можно больше домов и обзавестись большим табуном коров. Еще он умеет строить укрепительные сооружения, рвы, заборы, сажать и выкапывать деревья и еще некоторые действия. Во общем весьма развивающая, добрая игра, о которой у меня остались самые теплые воспоминания.

В ней даже использовались вставки живого видео с участием Кирка Кэмерона и Майкла Грегори. А музыка к игре была удостоена  награды «Premiere Award for Best Musical Score»  в 1994 году. Так что культовая вещичка!
 
Но вот поиграть в нее сейчас оказывается не такая тривиальная задачка как раньше. Эта игра, как и многие другие того периода, запускалась из под DOS. Но чтобы полноценно играть в ее на современных компьютерах, одного только запуска DOS с дискеты уже не достаточно. Для игры нужен 32-битный совместимый процессор, современный 64-битный уже не подойдет. К примеру, на Pentium 4 еще запустится, а на Pentium D или тем более на Intel i5 уже нет. Кроме этого есть еще одна проблема, для DOS нет драйверов, поддерживающих современные звуковые карты. DOS знает только SoundBlaster и подобные, которые были распространены в то время. А если играть в нее без звука, вы очень много потеряете! Поэтому загрузка DOS на реальном PC нам не подходит.

Выходов из ситуации несколько. 
1) Если у вас 32-битный процессор, то можно воспользоваться любой виртуальной машиной, например, WMware или VirtualBox. Здесь используется такая особенность, что при виртуализации иная архитектура не эмулируется и гостевой CPU имеет такой же набор инструкций как реальный хост-процессор.  За счет этого достигается большая производительность. А вот звук как раз будет эмулироваться старой звуковой картой, такой как SB16. Поэтому смело берем образ загрузочной дискеты и запускаем DOS, где предварительно должны быть установлены драйвер звуковой платы и драйвер CD-ROM'а (Подробно создание загрузочной дискеты описывается в отдельной статье) Запускаем игру и наслаждаемся.

2) Но есть более универсальный способ - использовать программные эмуляторы, такие как bochs, qemu или dosbox. Они полностью эмулируют работу большинства процессоров, начиная от 386 до последних x86-64, с поддержкой всех инструкций. Эмулируют всю периферию, память, устройства ввода-вывода, такие как жесткие диски,  cd-rom'ы, аудио, видео и сетевые карты, мышки и др. Могут даже эмулировать симметричные мультипроцессорные системы SMP. Иными словами, эмулируется весь PC целиком. Поэтому не важно какая у вас платформа, вы можете программно сэмулировать любой процессор и все его окружение. Такое  полное соответствие реальному оборудованию крайне важно для тестирования софта, ведь позволяет провести испытания сразу на всех архитектурах, имея только один PC.

Отдельного внимания заслуживает qemu, он может работать в двух режимах: полной эмуляции и  эмуляции пользовательского режима с виртуализацией. Второй поддерживается только в Linux, BSD и Mac OS. Еще дополнительно существует ускоритель KVM, это модуль ядра для поддержки аппаратной виртуализации Intel VT или AMD-V. Но под windows это не работает. Об этих особенностях подробно написано в пользовательской документации qemu, которая присутствует в дистрибутиве в файле qemu-doc.html.

К сожалению, когда речь идет об эмуляции, ее скорость оставляет желать лучшего. Все эмуляторы крайне медлительны. Поскольку эта задача требует больших вычислительных ресурсов. Например, современный Intel Core i7 3.4Ghz может справится с bochs-эмуляцией процессора x86 производительностью только от 85 до 95 MIPS, а Intel Core 2 Duo 2.6Ghz с производительностью от 38 до 43 MIPS. Для справки Pentium 1 (100 MHz) имеет 188 MIPS, 486 (66 MHz) - 54 MIPS, а 386 (33 MHz) - 9.9 MIPS.  

Мой Intel Core i5 2500K смог справится с производительностью около 54 MIPS. Но и этого было не достаточно для  игры the horde, видеоряд подтормаживал, звук проигрывался прерывисто, а поведение мышки запаздывало. В процессе экспериментов я менял значение IPS эмулируемого процессора, пытаясь выяснить какую производетльность требует игра и что из себя может выжать мой хост-процессор. Иногда появлялась только заставка, потом гасла и все зависало.
А вот для плеера mpxplay этой производительности оказалось достаточно, он успевал декодировать mp3 музыку и воспроизводить ее без задержек.

Первым моим подопытным был bochs. Я взял его на официальной странице  sourceforge, там есть исходники и версия для Windows. По умолчанию она скомпилирована с поддержкой cpu-level=6, что соответствует процессорам Pentium 4 и выше. Если вам нужна эмуляция 386, 486 или Pentium, то нужно скомпилировать программу из исходных текстов самостоятельно с соответствующими значениями 3, 4 или 5. Еще есть много других параметров, с полным перечнем можно ознакомится в Руководстве пользователя Bochs в разделе Compiling Bochs.

Вкратце опишу процесс компиляции bochs под Windows, возможно кому то понадобится. С сайта нужно скачать исходники адаптированные для visual studio, они помечены как -msvc-src. Затем извлечь архив и найти файл конфигурации .conf.win32-vcpp. В нем произвести нужные изменения, что-то удалить или добавить, например,  включить поддержку 386 процессора --enable-cpu-level=3 или поддержку реального cd-rom'а --enable-cdrom. После этого нужно запустить скрипт конфигурации. Самое быстрое решение это воспользоваться любой доступной UNIX-платформой, где вы можете запустить shell-скрипт. Если у вас такой возможности нет, то придется ставить Cygwin или MinGW/MSYS. Далее запускаем скрипт
sh .conf.win32-vcpp
После этого вы получите VC++ make-файлы. Теперь осталось открыть проект в студии, файл называется bochs.sln, находится в папке vs2008 и произвести компиляцию в release режиме. 
Я использовал бесплатную версию Microsoft Visual C++ 2008 Express. При компиляции модуля iodev_network у меня возникла одна ошибка. Определение класса bx_netmod_ctl_stub_c было спрятано за #if.. #endif, убрав это условное включение, все скомпилировалось на ура. Еще при компиляции не забудьте отключить антивирусы или добавить исключения.

При запуске bochs берет настройки из файла bochsrc.bxrc, его можно создать , нажав в Bochs Start Menu кнопку Save. А затем менять значения уже в этом файле.


Играться стоит с параметрами cpu: ips=60000000, это значит будет эмулироваться процессор производительностью 60 MIPS, sb16: dmatimer=1000000 здесь задается количество микросекунд в секунде DMA цикла, в нашем случае 1:1.  Этот параметр напрямую зависит от ips, в мануале написано, что хорошее значение 750000. Но если звук подтормаживает, уменьшаем это значение.

Как ни странно, но в qemu игра даже смогла запуститься.
qemu-system-i386
-boot a -fda C:\555\FDBOOT1.IMG
-hda C:\555\hd.img
-cdrom \\.\e:
-soundhw sb16,adlib
-vga std
-cpu pentium
-m 128
Эта команда запуска должна быть одной строкой. Здесь я ее разбил в столбик для удобства чтения . Вводить ее нужно в cmd из каталога qemu. Пробовал разные параметры cpu, vga и др., но каждый раз появлялся черный экран и все зависало. Mpxplay тоже воспроизводил музыку с большими задержками. Так что по моим наблюдениям qemu в windows оказался медленнее bochs или я где то не до конца его настроил. Полный список команд есть в документации в рзделе 3.3 Invocation.

Получается, что ни один из вышеупомянутых эмуляторов не справился с нашей задачей. Остается последний вариант  dosbox. Он специально создавался для запуска старых DOS программ и игр. Основан на исходниках Bochs, но в отличие от него, здесь сразу эмулируется работа компьютера на котором запущена DOS, отсюда и название dosbox. Засчет этого уменьшается число операций эмуляции, возрастает скорость работы и становится возможным играть в старые игры на приемлемой скорости. Еще если на вашем компьюиере x86-совместимый процессор, то в dosbox'е будет работать виртуализация или динамическая трансляция инструкций, если нет - полная эмуляция x86 архитектуры.

Здесь вам даже не надо иметь образа загрузочной дискеты DOS, поскольку сразу эмулируются DOS API функции IO.SYS, MSDOS.SYS, COMMAND.COM, а так же MSCDEX, HIMEM, XMS и EMS. Еще есть эмуляция аппаратного оборудования, например, видеокарт S3 Trio 64, звука Sound Blaster и даже сетевая эмуляция.

Но мне хотелось иметь более аутентичное DOS окружение, которое проверено работает на реальном железе, ну и для чистоты эксперимента сравнить скорость эмуляции с bochs и qemu.
Поэтому мы будем ставить DOS на Dosbox и уже оттуда запускать игру.

Для начала скачаем Windows версию Dosbox с официального сайта. Установим и  перейдем в папку, куда она установилась. Там находим файл конфигурации dosbox.conf.  Он имеет очень подробное описание всех параметров, поэтому специального мануала не потребуется. 
Нас интересует секция [autoexec], здесь мы пропишем монтирование образа жесткого диска и загрузку с образа загрузочной дискеты (создание которой описывается в другой статье).  
[autoexec]
imgmount 2 "C:\c.img" -size 512,63,16,1024 -t hdd -fs none
boot "C:\FDBOOT.IMG"

Здесь сначала задается номер устройства (2 - мастер, 3 - слэйв), после слова size указывается размер кластера, число секторов, головок и цилиндров. Потом тип образа (floppy, iso, hdd) и тип файловой системы (iso, fat и none).  

Но сперва образ диска нужно создать. Для этого используем утилиту bximage из дистрибутива bochs.
После создания диска выводится CHS информация, которая нужна для imgmoun. Как оказалось не следует создавать диск объемом больше 504Mb, поскольку в этом случае число цилиндров при CHS адресации будет больше 1024, а это выходит за рамки режима доступа к дискам в MS DOS и будет отображаться только часть от него. Но выход есть, нужно просто использовать число головок 255 и соответственно пересчитать число цилиндров исходя из нужного размера диска.

После этого нужно загрузить DOS и как обычно утилитой fdisk создать первичный раздел и отформатировать диск format с:

По хорошему нам нужно подключить  cd-rom с игрой. Но лучше создать образ CD-диска и производить все манипуляции с ним. Диск у нас не простой, а мультисессионный, поэтому обычными средствами создать iso-образ не получится. Мультисессионные диски умеет без проблем создавать nero в формате *.nrg. А потом его можно легко конвертировать в iso. Для этого подойдет программка nrg2iso или если у вас есть доступ к unix системе, то командой
dd bs=1k if=image.nrg of=image.iso skip=300
Как оказалось формат nrg отличается от iso только наличием блока 300 Кб  из нулей, поэтому его безболезненно можно удалить.

И так образ диска с игрой мы создали. А если у кого нет, но очень хочется, то можно найти его на rutracker.org или сразу взять сконвертированный iso здесь. Только вот к сожалению в dosbox нет IDE эмуляции cd-rom'ов. Поэтому подключить образ CD-диска командой imgmount, так чтобы его увидела гостевая DOS не получится. Для обхода этого ограничения мы запишем наш образ CD-диска на образ жесткого диска c.img, который мы создали с помощью bximage. А уже в Dos'е смотируем iso-образ с игрой как cd-rom утилитой SHSUCDHD. Это так сказать виртуальный cd-rom под DOS. Для этого в autoexec.bat добавим следующие строчки:
SHSUCDHD /f:c:\horde.iso
shsucdx /d:shsu-cdh
Для препарирования img-образов  лучше всего  использовать программу WinImage.

Вот и все, теперь осталось запустить Dosbox и смотреть как загрузится DOS. После этого нужно перейди на диск D: и запустить установку игры
install c:
На диске C появится новая папка HORDE, а в ней исполняемый файл horde.exe, который и запустит игру.
Ни звук, ни видео, ни игровой процесс не тормозят, все работает быстро! Поэтому можно сделать вывод, что эмуляция x86 архитектуры для запуска DOS-приложений у dosbox самая быстрая.

Еще внесем изменения в конфигурационный файл dosbox для правильной масштабируемости и отрисовки игры в полноэкранном режиме. Переключение в него происходит по нажатию Cttrl+Enter.

[dosbox]
machine=vesa_nolfb
[render]
aspect=true
scaler=advmame2x

Ну и в заключении для удобства пользования создадим конфиг для простого запуска игры средствами dosbox. У него есть еще одна полезная особенность, которую мы будем использовать. Это эмуляция файловой системы, т.е. можно подключить любую папку как диск.
Создадим в установочной папке DOSBox папку Games и скопируем туда образ CD-диска игры horde.iso.
Cделаем эту папку корнем гостевого диска С.
mount c: "C:\Program Files (x86)\DOSBox-0.74\Games"
Смонтируем iso-образ игры как диск D.
imgmount d "C:\Program Files (x86)\DOSBox-0.74\Games\horde.iso" -t iso -fs iso 
Добавим эти строчки в раздел [autoexec] и запустим dosbox. Первый раз нужно запустить установщик игры:
d:
install c
После того как в папке Games появится папка Horde с файлом horde.exe в раздел [autoexec]  можно добавить  запуск самой игры
c:\horde\horde

Теперь все что надо сделать это создать ярлык для запуска dosbox с параметрами
-noconsole -conf "C:\Program Files (x86)\DOSBox-0.74\dosbox.conf"
 
Желаю вам приятной игры! А тем кто видит ее в первый раз, советую попробовать, вы будете приятно удивлены игрой 1994 года!