Multi-boot установка Win2k/XP/2k3 в VHD образ, без перезаписи GRUB2

Введение

Операционные системы семейства Windows, в частности их инсталляторы, широко известны своим "дружественным" отношением к другим ОС, установленным на вашем компьютере. Совместное проживание Windows и *nix систем осложняется тем, что первая считает MBR своей собственностью, и её инсталлятор не задумываясь пишет в неё свой загрузочный сектор. Кроме того, творение редмодовцев требует для себя первичный раздел на hdd, а Win7/8 ещё и около 100 Мб в начале диска, для создания раздела с загрузчиком. Все ухищрения по установке всё равно сводятся к необходимости после инсталяции восстанавливать загрузочную запись того же grub, для возможности загрузки других ОС.

Не знаю кому как, а мне всё это дело не нравилось с самого начала. Поэтому решение вопроса использования Linux и Windows на одном компьютере по началу почти всегда сопровождалось потерей данных на диске, а позже, после преобретения некоторого опыта, стало просто неприятным занятием, которого хотелось избежать. Именно по этой причине около года назад я отказался от дуалбута в пользу Linux как основной системы, и виртуальной Windows для использования вордов/экселей и прочего софта, без которого в реалиях современного документооборота и организации научной работы, как не крути, не обойтись.

Однако в моей деятельности существует ряд задач, которые нерешаемы без использования Windows в реальном аппаратном окружении. Это прежде всего моделирующие программы, в частности "Универсальный механизм", который работает в вайне, но довольно таки криво. И поиграть в игры - тоже хочется :). А потрошить HDD для установки винды, рискуя при обрыве питания получить венегрет из единиц и нулей на прилично забитом данными терабайтном винтчестере - ой как неохота.

Оказалось что решение есть. Довольно простое и эффективное.

1. VHD-контейнеры, или как это реализует Microsoft

VHD - формат образа жесткого диска, используемый виртуальной машиной Virtual PC и гипервизором Hyper-V. Довольно распространен, в виду чего открытый VirtualBox поддерживает данный формат в полном объеме. Это же касается и QEMU, в состав которого входят утилиты для преобразования других образов в VHD.

В Windows 7 Ultimate (насчет висты я не в курсе) имеет в своем составе утилиты для создания дисков формата VHD и управления ими, а интсталятор win7 позволяет установить на такой диск семерку и настроить загрузчик для запуска установленной ОС на реальном железе. Гугление по этому поводу дает достаточно информации, вполне адекватная документация есть и на сайте Microsoft. При этом мы получаем полноценную систему, установленную в файл образа.

Но линуксоиды не были бы линуксоидами, если бы не придумали способа реализовать подобное своими силами. Имеется сайт http://reboot.pro, где освещены данные вопросы, имеется несколько разрозненных и уклончивых инструкций на разных it-форумах. Среди наших форумчан есть люди, реализовавшие такую возможность на практике.

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

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

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

  • Утилита для управления разделами HDD, например gparted
  • Менеджер виртуальных машин VirtualBox
  • Установленная на ВМ ОС Windows (XP/7)
  • Загрузчик grub4dos
  • Драйвер WinVBlock
  • Утилита wincontig от Марка Русиновича для дефрагментации образов - берем тут

2. Готовим почву: размещение образа и настройка загрузчика

Для размещения образов необходим раздел жесткого диска (или отдельный диск) с файловой системой, которую будет понимать Windows. Выбор тут невелик - NTFS, так как FAT32 не поддерживает файлов более 4 Гб, а наши образы будут существенно больше. Раздел можно создать в gparted и там же и отформатировать, например у меня сделано вот так - воспользовался местом, резервированном для вероятной установки другой системы и экспериментов.



Теперь этот раздел необходимо пробросить в виртуальную машину. Это нужно для того, чтобы выполнять операции над файлами из нативной виндозной среды, в частности может потребоваться дефрагментация образов, о чем будет чуть ниже. Для этого создаем файл-ссылку на физический жесткий диск/раздел диска средствами VirtualBox


VBoxManage internalcommands createrawvmdk -filename ~/<Путь к файлу>/ntfs_hdd.vdmk -rawdisk /dev/<раздел>

Полученный виртуальный диск подключаем в виртуалбоксе к машине с установленной виндой (лучше с win7), допустим вот так



Таким образом, почву мы подготовили.

Что касается загрузчика, то для нашей задачи необходим grub4dos - этот загрузчик умеет работать с образами hdd, в том числе и VHD-формата. Качаем его отсюда. Необходимо брать последнюю версию, так как у подобраной на гитхабе версии 0.4.4 обнаружилась проблема с определением геометрии диска - для любого образа он выдавал 1024 цилиндра, вне зависимости от размера оного. Автором использован 0.4.6a.

Можно установить загрузчик как основной, но у большинства пользователей арча используется grub2, поэтому имеет смысл использовать его для загрузки по цепочке. Просто копируем содержимое архива с grub4dos, например в /boot/grub4dos/. Создаем файл

/etc/grub.d/40-custom

menuentry "Grub4dos" {
  linux16 /boot/grub4dos/grub.exe --config-file=/boot/grub4dos/my_menu.lst
  boot
}
где my_menu.lst - кастомное меню, где мы пропишем все наши винды. Перегенерируем конфиг груба

# grub-mkconfig -o /boot/grub/grub.cfg
и в меню grub2 появится пункт, запускающий grub4dos.

Предупреждение: grub4dos очевидно не понимает разметки GPT, так что сказанное выше, как и вся статья, справедливы для тех, кто использует старую разметку.

3. Создание VHD-образа

Тут возможны варианты. Быстрый - создать образ диска средствами VirtualBox. Образ должен быть фиксированного размера в формате VHD. Кроме того, и это самое принципиальное, образ не должен быть фрагментирован! В противном случае, при попытке маппинга, g4d выдаст ошибку

Error 60: File for drive emulation must be in one contiguous disk area
Это значит, что образ фрагментирован и для его маппинга потребуется дефрагментация.

Образы, созданные VirtualBox практически всегда фрагментированы, во всяком случае мне показалось, что степень из фрагментации некая случайная величина. Так что мимо дефрагментации не пройти. Ещё можно произвести утилитой wincontig из виртуальной машины с виндой, к которой подключен раздел где мы храним образы.

Второй путь - создать VHD из ВМ c win7 через "Управление дисками". Результат не будет фрагментированным, однако на создание образа уйдет время, пропорциональное размеру образа.

Необходимо так же учитывать, что для успешной дефрагментации надо располагать достаточным объемом раздела, где будут лежать образы, иначе дефрагментатор пошлет нас подальше сообщением "недостаточно свободных кластеров для дефрагментации".

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

Предупреждение: Ни в коем разе не устанавливаем дополнения гостевой ОС! Эта система всё равно будет работать на Вашем реальном железе, так что они и без надобности, и лишний повод для BSOD нам не нужен.

4. Настройка загрузчика grub4dos

В файле my_menu.lst пишем следующее (пример соотвествует моей конфигурации разделов на винте)


# Имя пункта меню
title Windows XP

# Прямой маппинг образа - связываем образ
# (winxp.vhd в директории vhd четвертого раздела первого диска)
# с именем первого диска в системе
map (hd0,3)/vhd/winxp.vhd (hd0)
# Выполняем маппинг непосредственно сейчас
map --hook
# Задаем корневой раздел для поиска загрузчика
root (hd0,0)
# Грузим в память загрузчик winNT
chainloader /ntldr

Этот код стартует загрузку винды из образа. Однако выполнив его без соотвествующей подготовки загружаемой ОС мы обязательно получим BSOD с кодом 0x7B - ошибка ввода/вывода связанная с обращением к дисковой подсистеме. Попросту говоря загрузчик и ядро не увидят образа диска и расположенных на нем файлов.

5. Установка драйвера WinVBlock

При загрузке совсем старых, версий винды ветки win9x никаких дополнительных действий не требуется - эти частитчно 16-разрядные системы обращаются к диску на начальном этапе загрузки используя прерывание BIOS 13h. 32-битные ОС семейства NT используют драйвера защищенного режима. Тоже самое касается и современного ядра Linux и FreeBSD. Поэтому для обеспечения загрузки из VHD-образа необходимо наличие в загружаемой системе соотвествующего драйвера, позволяющего ОС обращатся к образу как к блочному устройству.

Таковой драйвер имеется в win7 (vhdmp.sys) и такой проблемы нет (зато есть другие, пока не решенные мной проблемы...). Для рассматриваемых нами систем подобный драйвер написан человеком с ником Sha0, исходники расположены тут. Однако собрать их у меня не вышло, так что я выцарапал готовые сборки из пакета VHD_XP_Setup, и выкладываю вот тут. Внутри архива имеется интсрукция по установке, она довольно проста.

Устанавливаем данный драйвер в систему на образе. И остался последний штрих

6. Подготовка к запуску на реальном железе

Мы помним, что наша система инсталирована в ВМ, а поэтому некоторые устройства определены на этапе установки и система подсунула для них соотвествующие драйвера. При запуске на Вашем реальном компьютере с вероятностью в 99% снова получится BSOD 0x7b. Это связано с тем, что VirtualBox эмулирует контролер IDE следующим образом

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

Решается просто - выбираем "Обновить драйвер", говорим, что не надо искать а мы сами укажем нужный драйвер и выберем "Стандартный двухканальный контролер IDE". После этой процедуры система будет "бсодить" уже при запуске в VirtualBox, а вот на реальной машине - заведется )

Теперь можно перезагрузить машину и выбором пунктов в меню Grub2 и Grub4dos загрузить нашу систему. После загрузки система яростно начнет определять реальные железки, может быть проблема с USB-шиной, так что надо запастись хотя бы мышью с интерфейсом PS/2. Оталось достать порядком заброшенные диски, шедшие в комплекте с железками и установить необходимые драйвера в системе.

Выводы

Описанные действия - это довольно простой и элегантный вариант установки ОС Windows параллелено с Linux без затрагивания разделов hdd и загрузочной записи. В общем это то, чего не хватало лично мне.

Эксперимент дал положительный результат с системами WinXP SP3 и Win2k3 Server SP2 Enterprise. 64-разрядная экспи хоть и не "бсодила", но задумчиво бегала ползунком на заставке без шевеления HDD и так и не стартовала...

Благодарности

Отдельное спасибо форумчанину с ником denchik за предоставленные для экспериментов образы и конфиги загрузчика )
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org

Операционные системы семейства Windows, в частности их инсталляторы, широко известны своим "дружественным" отношением к другим ОС, установленным на вашем компьютере. Совместное проживание Windows и *nix систем осложняется тем, что первая считает MBR своей собственностью, и её инсталлятор не задумываясь пишет в неё свой загрузочный сектор. Кроме того, творение редмодовцев требует для себя первичный раздел на hdd, а Win7/8 ещё и около 100 Мб в начале диска, для создания раздела с загрузчиком. Все ухищрения по установке всё равно сводятся к необходимости после инсталяции восстанавливать загрузочную запись того же grub, для возможности загрузки других ОС.

Ничего не имею против, но что то вы усложняете)) Я не встречал такого загрузчика который бы не считал mbr своей собственностью (разве что grub2 иногда ругается на 47 сектор или типа того). 100мб раздел требуется походу если разбивать винчестер средствами инсталятора, иначе он и не нужен)) даже если раздел с windows не в начале. Ну mbr затирается по любому это да, но гораздо проще его востановить (на мой взгляд) чем использовать ваш способ.

Таки да, единственный косяк который у меня вылезал это флаг boot раздела, но всё решаемо))
Ошибки в тексте-неповторимый стиль автора©
ind.indeviral
100мб раздел требуется походу если разбивать винчестер средствами инсталятора
Да, если ставить в готовый раздел ntfs, то bootmgr и винда ставятся в этот раздел без создания скрытого раздела.

Мне показалось удобной установка винды в виртуальной машине, настройка загрузки простой правкой конфига загрузчика, возможность последующего перемещения в другое место и т.д.
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
Надуманная проблема. Нужен софт под Windows - ставим Windows. Всё, что есть в Linux, можно запустить в ней же. Без виртуализации.
elsonador
Надуманная проблема
Не согласен. Есть технология - загрузка системы с VHD-диска, её можно использовать. Статья предлагает метод реализации подобного.

Надуманным является то, что при наличии достаточно универсального загрузчика - Grub и спецификации Multiboot, разработчики ОС до сих пор не пришли к единому стандарту по загрузке систем.

Собственна ссылка на статью про семерку
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
maisvendoo, есть след. проблема. Когда я устанавливал арч, забыл про винду. Погуглив пришел к следующему:
1. отрезаю от текущего загр. раздела(200мб) 100мб.
2 . форматирую созд. раздел в фат, ставлю флаг "загрузочный"
3. ставлю винду
4. захожу с лифСД в арч, выполняю grub-install /dev/sda.
5. славлю флаг загрузки на раздел с груб.
Все ли правильно?
paranoik
Все ли правильно?
Навскидку, вроде всё верно
paranoik
форматирую созд. раздел в фат
а зачем в FAT? Можно же и в нтфс. Правда, поправочка, нтфс полученный с помощью gparted неприспособлен для установки винды, установщик семерки на него матерится, так что форматировать лучше из установщика винды с помощью diskpart
Да пребудет с нами Сила...!
CPU Intel Core i9 10900-KF/RAM DDR4 128 Gb/NVidia GForce GTX 1080 Ti Turbo 11Gb/SSD M2 512 Gb/HDD Seagate SATA3 2 Tb/HDD Toshiba 3Tb/HDD Toshiba 6Tb
http://rusrailsim.org
maisvendoo
Кроме того, творение редмодовцев требует для себя первичный раздел на hdd, а Win7/8 ещё и около 100 Мб в начале диска, для создания раздела с загрузчиком.
Это неправда. Любая NT-винда без проблем грузится откуда угодно. В частности, с логического диска - лишь бы там были нужные для загрузки файлы и менеджер загрузки запустил загрузчик винды. А это умеет и grub, и hgub4dos. А если кому-то приспичит использовать что-то совсем простое, вроде lilo или vpart, то даже в этом случае достаточно передать управление бутсектору раздела винды, если поле HiddenSectors содержит адрес раздела (если раздел форматировали виндой, то это уже обеспечено).
maisvendoo
Все ухищрения по установке всё равно сводятся к необходимости после инсталяции восстанавливать загрузочную запись того же grub, для возможности загрузки других ОС.
Это настолько просто, что другие решения рассматривать как-то даже не интересно.
maisvendoo
Необходимо так же учитывать, что для успешной дефрагментации надо располагать достаточным объемом раздела, где будут лежать образы, иначе дефрагментатор пошлет нас подальше сообщением "недостаточно свободных кластеров для дефрагментации".

Решил поиграться, уперся в то что при создании vhd более ~10gb он уже не дефрагментируется, может быть дело в чём то другом, а не вместе на разделе?

p.s. описочка .vmdk
Ошибки в тексте-неповторимый стиль автора©
 
Зарегистрироваться или войдите чтобы оставить сообщение.