Русскоязычное руководство по загрузчику Grub4dos

Команда "MAP"

Команда map используется для эмуляции дисков. Она является одной из более сложных команд, доступных в Grub4dos - Смотрим Здесь, что grub4dos показывает если ввести help map.
Используя команду map можно:

  • Загружать Windows не с первого жёсткого диска
  • Загружать образы жёстких дисков
  • Загружать образы флоппи дискет на безфлоповых компах
  • Создавать виртуальное устройство, доступное из некоторых операционных систем
  • Загружать ISO образы (в экспериментальном порядке)

Есть два типа маппинга, это прямой маппинг и маппинг памяти. Прямой маппинг обычно используется для больших образов/устройств. Если использовать прямой маппинг, то чтобы создать виртуальное устройство из образа диска, файл образа должен быть непрерывным (не фрагментированным). Эти утилиты - contig или wincontig могут дефрагментировать файл образа.
Попытка замапить фрагментированный файл приведёт к результату - Error 60: File for drive emulation must be in one contiguous disk area , при таком сообщении нужно делать маппинг в память или дефрагментировать образ и пробовать снова.

Маппинг памяти, это значит, что устройство/образ переносится в оперативную память, обычно используется для маленьких образов - Например образов флоппи дисков. При маппинге в память образ диска может быть и фрагментированным. Размер имеющейся оперативной памяти, будет определять максимальный размер образа который можно загрузить.

Процесс "map" осуществляется с помощью INT 13 - и эмулируемый диск будет доступен из других ОС которые используют совместный доступ к файлам, Например DOS и Windows 9x. Не будет доступа к дискам образов ОС, которые используют защищённый режим драйверов (Windows NT/2000/XP/Vista, Linux, FreeBSD) как только режим защиты вступит в работу.

В режиме командной строки мы пройдёмся по следующим понятиям:

  • Прямой Маппинг
  • Маппинг памяти
  • Загрузка из .ISO образа
  • Вложеный Маппинг

Прямой Маппинг

Прямой маппинг характеризуется следующими возможностями:

  • Загрузка образов дисков
  • Подмена диска (Например когда надо загрузить Windows не из первого раздела

Загрузка образов дисков

Пример прямого маппинга образа флоппи диска уже приводился ранне в этом руководстве:

title Boot Disk Image
map (hd0,0)/win98.ima (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)
map --floppies=1

Раберём подробно каждую строку этого примера:

  • title Boot Disk Image - Название пункта загрузки. Это можно пропустить, если будем использовать командную строку.
  • map (hd0,0)/win98.ima (fd0) [enter] - Это маппинг файла образа (в данном примере win98.ima, в корне раздела на первом жёстком диске) в виртуальный первый флоппи дисковод (fd0).
  • map --hook [enter] - эта команда осуществляет маппинг немедленно. Когда map --hook выполнена, маппинг будет "Глобальным" - он будет действовать даже в Grub4dos. Это подробно описано в следующем разделе. Если образ флоппи диска не загрузится и вас вернут в командную строку (или в меню), маппинг будет действовать пока команда map --unhook не будет выполнена.
  • chainloader (fd0)+1 [enter] - Это предлогает загрузчику grub4dos последовательно загрузить первый сектор флоппи диска. Когда файл образа будет замаплен как (fd0) и команда map --hook будет выполнена, тогда загрузится образ диска.
  • rootnoverify (fd0) [enter] - Это предлогает загрузчику grub4dos сделать первый замапленый флоппи диск корневым, без попытки его смонтировать. Как обсуждалось раннее, обычно используется "нормальная" команда "root", по крайней мере для образов с стандартными файловыми системами, такими как у флоппи в нашем примере.
  • map --floppies=1 [enter] - Это говорит загрузчику grub4dos, что должен "показываться" только один флоппи (замапированный) - это можно пропустить. Если вы это делаете в командной сторке, то добавляйте команду boot.

Вот что мы видим, когда делаем всё это в командной строке:

grub> map (hd0,0)/win98.ima (fd0)
FAT12 BPB found with 0xEB (jmp) leading the boot sector.

probed C/H/S =80/2/18, probed total sectors = 2880

floppies_orig=0, harddrives_orig=2, floppies_curr=1, harddrives_curr=2

grub> map --hook

grub> chainloader (fd0)+1

grub> rootnoverify (fd0)

grub> map --floppies=1

grub> boot_

Загрузка образа жёсткого диска идёт с использованием некоторых принципов загрузки флоппи диска. Например, загружаем образ жёсткого диска PE.ima из первого логического раздела на втором жёстком диске:

  • map (hd1,4)/PE.ima (hd0) [enter] - мапируем образ диска (в нашем случае PE.img,на первом логическом разделе, второго жёсткого диска) как первый жёсткий диск (hd0).
  • map --hook [enter] - тот же пример, что и с флоппи диском выше.
  • chainloader (hd0)+1 [enter] - Это загружает MBR первого жёсткого диска. Когда файл образа будет замаплен как (hd0) и выполнена команда map --hook, тогда и будет загружена MBR файла образа.
  • rootnoverify (hd0) [enter] - Это сделает первый (замапленый) жёсткий диск корневым, без монтирования. В данной ситуации команда root не может использоваться т.к целый диск не может быть смонтирован. Однако команду root можно использовать когда надо загрузить раздел внутри файла образа, Например, команда последовательной загрузки будет - chainloader (hd0,0)+1, и команда root (hd0,0)+1 будет работать, если тип раздела поддерживается.
  • boot [enter] - Загрузка.

Когда используется прямой маппинг, образ диска должен иметь работоспособную MBR. Образ с несколькими разделами должен мапироваться как (hd) устройство. Если образ диска состоит из одного раздела (без MBR), тогда надо мапить его как флоппи.

Ряд примеров маппинга можно встретить в файле README_GRUB4DOS.txt.

Подмена диска

Например можно исползовать команду map для подмены дисков, когда мы загружаемся с USB устройства (Например флешка или УСБ-жёсткий диск). Когда настройки BIOS выставлены на загрузку с USB, жёсткий диск станет (hd1). DOS и Windows 9x не смогут грузиться с этого жёсткого диска. Windows NT системы теоретически могут грузиться не с первого диска, но пути в boot.ini будут не верны, когда произойдёт загрузка с USB устройства. Если windows установлена на жёсткий диск, она не будет грузиться.

Например мы ставим в компьютер новый жёсткий диск. А старый жёсткий диск с установленной Windows XP - превращаем из первичного (master) во вторичный (slave) (он становится (hd1)). Новый диск становится первичным (master) (hd0) на нём установлена Vista и теперь нет никакой возможности грузить Windows XP со старого диска.

В подобном случае мы можем загрузить систему не с первого раздела путём подмены дисков (Например: поменяем (hd1) на (hd0)).

Рассмотрим тестовый пример, системы с двумя жёсткими дисками

  • (hd0) - FAT, 300MB, Linux установлен на (hd0,0)
  • (hd1) - FAT, 20MB, MS-DOS установлен на (hd1,0)

(hd0,0) содержит файл-метку hd0.tag и (hd1,0) содержит файл-метку hd1.tag. Программа MBR Wizard находится на (hd1,0), чтобы проверить какой диск будет доступен из ДОС после экспериментов с командой map.

Пробуем загрузить ДОС с (hd1) без подмены дисков, командами:

  • root (hd1,0) [enter]
  • chainloader +1 [enter]
  • boot [enter]

В результате получим ошибку,

Invalid system disk
Replace the disk, and then press any key

Возможно "обмануть" систему, заставив её думать, что (hd1) это первый жёсткий диск используя команду map. Чтобы переделать (hd1) в (hd0) и загрузить ядро ДОС io.sys, используем команды:

  • map (hd1) (hd0) [enter]
  • root (hd1,0) [enter]
  • chainloader /io.sys [enter]
  • boot [enter]

ПРИМЕЧАНИЕ - используя вышеуказанный набор команд, замена (hd1) на (hd0) не будет иметь эффекта пока команда boot не выполнена. Хотя устройство (hd1) было замаплено как (hd0), все ссылки на фактические устройства остаются к (hd1) в Grub4dos. Введение команды find /hd0.tag из командной строки, вернёт устройство (hd0,0), введение команды find /hd1.tag из командной строки, вернёт устройство (hd1,0) - смотрим пример ниже:

grub> map (hd1) (hd0)

grub> find /hd0.tag
(hd0,0)

grub> find /hd1.tag
(hd1,0)

grub> root (hd1,0)
Filesystem type is fat, partition type 0xe

grub> chainloader /io.sys
Will boot MS-DOS 7.x from drive=0x81, partition=0x0(hidden sectors=0x3f)

grub> boot_

Обратите внимание на то, что выводит команда chainloader - ...from drive=0x81. После загрузки ДОС выполняем команду mbrwizd.exe /list.
Теперь вы можете увидеть по размеру и типу файловой системы на Фото 1 - перед нами устройство (hd1) отображается как Disk:0 и Disk:1 - а устройство (hd0) не видимо.

Фото 1.

Как говорилось ранее, команда "map" не заработает пока команда boot не выполнена. Однако команда map --hook выполняет любые команды map немедленно.
Это проще всего объяснить на следующем примере:

  • map (hd1) (hd0) [enter]
  • map --hook [enter]
  • root (hd0,0) [enter]
  • chainloader /io.sys [enter]
  • boot [enter]

ПРИМЕЧАНИЕ - использование вышеперечисленного набора команд, заменит (hd1) на (hd0) немедленно, после того как команда map --hook будет выполнена. Ввод команды find /hd0.tag из командной строки будет иметь результат - "File not found" (файл не найден), ввод команды find /hd1.tag из командной строки вернёт устройства (hd0,0) и (hd1,0) - смотрим пример ниже:

grub> map (hd1) (hd0)

grub> map --hook

grub> find /hd0.tag
Error 15: File not found

grub> find /hd1.tag
(hd0,0)
(hd1,0)

grub> root (hd0,0)
Filesystem  type is fat, partition type 0xe

grub> chainloader /io.sys
Will boot MS-DOS 7.x from drive=0x80, partition=0x0(hidden sectors=0x3f)

grub> boot_

Обратите внимание на то, что выводит команда chainloader - ...from drive=0x80. После загрузки ДОС выполняем команду mbrwizd.exe /list. Результат будет таким же как и в предидущем примере, устройство (hd1) отобразится как Disk:0 и Disk:1 - а устройство (hd0) опять не видимо.

Чтобы сделать жёсткие диски видимыми в ДОС-е, ремапим (hd1) как (hd0) и (hd0) как (hd1) с помощью команд:

  • map (hd1) (hd0) [enter]
  • map (hd0) (hd1) [enter]
  • root (hd1,0) [enter]
  • chainloader /io.sys [enter]
  • boot [enter]

ПРИМЕЧАНИЕ - после введения команды map (hd1) (hd0) и map (hd0) (hd1), введение команды find /hd0.tag из командной строки вернёт устройство (hd0). Введение команды find /hd1.tag вернёт устройство (hd1). Когда ДОС будет загружен, оба диска будут доступны, хотя физическое устройство (hd1) будет отображено как Disk: 0, и устройство (hd0) будет Disk: 1 - смотрим Фото 2.

Фото 2.

Следующие команды, с map --hook, тоже можно использовать:

  • map (hd1) (hd0) [enter]
  • map (hd0) (hd1) [enter]
  • map --hook [enter]
  • root (hd0,0) [enter]
  • chainloader /io.sys [enter]
  • boot [enter]

Запомните, что эмулируемые диски доступны только из ОС использующих INT 13.
В примере показанном выше, Windows-подобная система увидит устройство (hd0) как "disk 0" и устройство (hd1) как "disk 1".

Можно так же мапить отдельные разделы как устройство:

  • map (hd1,0)+1 (hd0) [enter]
  • map (hd0) (hd1) [enter]
  • map --hook [enter]
  • chainloader (hd0,0)/io.sys [enter]
  • rootnoverify (hd0) [enter]
  • boot [enter]

Когда маппинг раздела выполнен в следующем синтаксисе (hdm,n)+1 он используется для представления целого раздела (Где m=номер диска, и n=номер раздела), а не только первого сектора.

Пример ответа Grub4dos на команды приведённые выше:

grub> map (hd1,0)+1 (hd0)
FAT16 BPB found with 0xEB (jmp) leading the boot sector.

probed C/H/S =40/16/63, probed total sectors = 40257
Try to locate extended partition (hd1)0+40320 for the virtual (hd0).

probed C/H/S =40/16/63, probed total sectors = 40320

grub> map (hd1) (hd0)

grub> map --hook

grub> chainloader /io.sys
Will boot MS-DOS 7.x from drive=0x80, partition=0x0(hidden sectors=0x3f)

grub> rootnoverify (hd0)

grub> boot_

Отдельные разделы можно замапить как флоппи устройство - это даёт преимущество в том, что жёсткие диски остаются без изменений и будут доступны из загруженных ОС в оригинальном порядке.
Пример:

  • map (hd1,0)+1 (fd0) [enter]
  • map --hook [enter]
  • root (fd0) [enter]
  • chainloader (fd0)+1 [enter]
  • boot [enter]

Отрывок с предупреждением из README_GRUB4DOS.txt:

"Настройки для флоппи и жёстких дисков в BIOS-е остаются неизменными при любом, даже самом настойчивом маппинге. Вы должны вручную привести их к надлежащим значениям с помощью `map --floppies' и/или `map --harddrives=', Например физически нет флоппи диска подключённого к материнской плате. Если так не сделать, ДОС может не загрузиться. Команда`map --status' покажет текущее состояние устройств."

Маппинг памяти

Мапинг памяти используется с комадами как и на примерах выше, и добавился параметр --mem.

Пример - В замен этих команд:

  • map (hd0,0)/win98.ima (fd0) [enter]
  • map --hook [enter]
  • root (fd0) [enter]
  • chainloader (fd0)+1 [enter]
  • boot [enter]

Используем эти:

  • map --mem (hd0,0)/win98.ima (fd0) [enter]
  • map --hook [enter]
  • root (fd0) [enter]
  • chainloader (fd0)+1 [enter]
  • boot [enter]

Когда мы используем маппинг памяти, допускается, что образ диска может быть фрпагментированым. Устройство преносится в оперативную память - Например: map --mem (hd0,0)+1 (fd0) (как говорилось ранее, +1 используется с командой map чтобы обозначить целый диск). Если замапить образа диска без MBR в память, он может быть в качестве (hd) устройства, а MBR будет создан в рамках Grub4dos - основываясь на данных раздела.

Сжатый образ тоже можно использовать при маппинге памяти. Образ должен быть сжат gzip-ом (получится файл с расширением .gz ), это бесплатный "opensource" архиватор. Т.к многие образы дисков не являются "заполнеными", их сжатие, может освободить достаточно много места. Стандартные образы дискет (1440 Кб) обычно оставляют как есть. Сжимать образы рекомендуется т.к это позволяет экономить место и ускорять их запуск.

Пример использования сжатого образа:

  • find --set-root /win98.ima.gz [enter]
  • map --mem /win98.ima.gz (fd0) [enter]
  • map --hook [enter]
  • root (fd0) [enter]
  • chainloader +1 [enter]
  • boot [enter]

gzip можно скачать Здесь. Если будем давить gzip-ом образ флоппи диска bcdl201a.ima 1440Кб, то в сжатом виде он будет весить 10.4Кб.

Grub4dos поддерживает только .gz формат, а ядро memdisk (часть пакета syslinux) поддерживает .zip формат - Например Winimage .imz формат.
Ядро memdisk может быть сжато gzip-ом и загружено с помощью Grub4dos.

Пример использования сжатого memdisk (с помощю gzip) для загрузки образа флоппи диска:

  • find --set-root /memdisk.gz [enter]
  • kernel /memdisk.gz [enter]
  • initrd /win98.ima [enter]
  • boot [enter]

или,

  • find --set-root /memdisk.gz [enter]
  • kernel /memdisk.gz [enter]
  • initrd /win98.ima.gz [enter]
  • boot [enter]

или,

  • find --set-root /memdisk.gz [enter]
  • kernel /memdisk.gz [enter]
  • initrd /win98.ima.zip [enter]
  • boot [enter]

ПРИМЕЧАНИЕ - на вышеприведённых примерах win98.ima должен находиться в том же разделе, что и memdisk.gz.

Загрузка из .ISO образа

Новые версии Grub4dos могут мапить и загружать некоторые CD образы, Однако следует отметить, что эта опция имеет экспериментальный характер.
Некоторые CD-ROM (ISO9660) образы могут мапиться как устройство (hd32), и загружаться используя следующие команды (измените это (device)/path/file.iso под свои путь/имя файла):

  • map (device)/path/file.iso (hd32) [enter]
  • map --hook [enter]
  • root (hd32) [enter]
  • chainloader (hd32) [enter] - это можно заменить командой chainloader () [enter], если корневое устройство назначенно предидущей командой.
  • boot [enter]

Есть несколько типов эмуляции загрузки с CD, включая флоппи эмуляцию - в которой загрузочный сектор CD это образ загрузочной дискеты. Загрузочный сектор нельзя увидеть при просмотре содержимого CD в файловых менеджерах таких как Windows Explorer, может показаться, что диск пуст и нет на нём никаких файлов и образов.

В следующем примере был взят образ CD содержащий в себе загрузочный сктор в виде ДОС-загрузочной дискеты, с различными ДОС программами на диске CD (не в загрузочной области).
Когда мы загружаемся с этого (реального) CD, образ в загрузочном секторе определяется как диск A:, и сам CD-ROM (и программы в его корне) занимают следующую доступную букву диска.
Файл образа CD (hd0,0)/dos.iso будет грузиться используя команды приведённые выше, вот то что покажет Grub4dos в результате этих команд:

grub> map (hd0,0)/dos.iso (hd32)

grub> map --hook

grub> root (hd32)
Filesystem type is iso9660, using the  whole disk

grub> chainloader (hd32)

Load segment: 0x0 System Type: 0x0 Sector Count: 0x1
Load RBA: 0x3E Boot Type: 2 = 1.44M floppy

grub> boot

С виду CD загрузился нормально. Загрузочный сектор CD определился как A:, а CD-ROM определился как E:.
Но к сожалению попытка дострупа к файлам на диске E: (корень CD образа) заканчивается ошибкой.

Файл README_GRUB4DOS.txt гласит:

ПРИМЕЧАНИЕ - Если команда mkisofs –iso-level 4 была использована для создания .iso образа (как это делается в PE билдах), MSCDEX.EXE не должна использоваться - удалите её с SHSUCDX
(Подробности Здесь).

Отредактированные config.sys и autoexec.bat и с добавленным в загрузочный образ файлом eltorito.sys, записали в dos.iso.
Этот переделанный CD загрузился как и ранее с доступным как A: загрузочным образом и с недоступным корнем CD.

Файл README_GRUB4DOS.txt так же предлогоает заменить (hd32) на (0xFF), Пример:

  • map (device)/path/file.iso (0xFF) [enter]
  • map --hook [enter]
  • root (0xFF) [enter]
  • chainloader (0xFF) [enter] - это можно заменить командой chainloader () [enter], если корневое устройство назначенно предидущей командой.
  • boot [enter]

Когда мы мапим .iso содержащий eltorito.sys в загрузочном секторе устройства (0xFF), CD-ROM загружается и теперь обе части, загрузочный образ (А:) и корень CD доступны!

Этот пример показывает какие сложности случаются при эмуляции CD-ROM. Если хотите посмотреть на рабочие примеры, то это можно сделать Здесь

Вложеный Маппинг

Используя последние версии Grub4dos можно замапить образ из другого замапленного образа - Иногда это называют двойной маппинг.
UBCD проект, например, использует загрузочный CD содержащий загрузочный образ дискеты. Используя эмуляцию CDROM, мы можем замапить файл UBCD .iso как (hd32),
затем замапить образ флоппи диска из (hd32) как устройство (fd0), затем загрузиться со свежезамапленного образа флоппи диска.

Например:

  • map --mem (hd0,0)/ubcd34-basic.iso (hd32) [enter]
  • map --hook [enter]
  • map --mem (hd32)/IMAGES/MAXBLAST.IGZ (fd0) [enter]
  • map --hook [enter]
  • root (fd0) [enter]
  • chainloader +1 [enter]
  • boot [enter]

ПРИМЕЧАНИЕ для Grub4dos, автор tinybit - При использования этой формы маппинга, нет ограничения на число вложений. По примеру выше,
можно замапить ещё один образ из последнего замапленного как (fd0).

Пример:

  • map --mem (hd0,0)/ubcd34-basic.iso (hd32) [enter]
  • map --hook [enter]
  • map --mem (hd32)/IMAGES/MAXBLAST.IGZ (fd0) [enter]
  • map --hook [enter]
  • map --mem (fd0)/floppy.img.gz (fd1) [enter]
  • map --hook [enter]
  • root (fd1) [enter]
  • chainloader +1 [enter]
  • boot [enter]