Запуск Windows 7 в Linux через Virtualbox с реального раздела жесткого диска

Многие, и я в том числе, держат на своих компьютерах несколько операционных систем. Почему бы и нет? Тем более, когда это необходимо. Особенно, когда некоторые программы работают только в Windows, и ни через Wine, ни за ради бога они не запускаются. Приходится скакать из системы в систему, либо пользоваться виртуальными машинами. В частности, Virtualbox позволяет создать образ VMDK c установленным разделом Windows. Об этом и пойдет речь.

В сети много подробных инструкций, как в Linux через Virtualbox запустить Windows 7, уже установленную на физический диск. Основной принцип заключается в создании образа .vmdk из реального раздела жесткого диска с помощью внутренней команды Virtualbox. Как правило, это выглядит так:

$ VBoxManage internalcommands createrawvmdk -filename /home/$USER/sdb.vmdk -rawdisk /dev/sda

Но для загрузки системы этого недостаточно. Нужна либо копия загрузчика MBR, либо iso-образ загрузчика GRUB, установленных на вашей машине.
Опишу, вкратце, основные способы установки на примере Ubuntu (Gnome).


Естественно, Windows 7 присутствует, Virtualbox уже установлен, и пользователь входит в группу «vboxusers».
Если нет, то:

$ sudo adduser $(whoami) vboxusers

Добавляем пользователя в группу «disk», для того, чтобы запускать vboxmanage без рута и не заморачиваться с правами созданных разделов, командой:

$ sudo adduser $(whoami) disk

Для применения изменений:

$ /usr/bin/gnome-session-save --logout

Реальный раздел с Windows должен быть загрузочным (активным). Для проверки:

$ fdisk -l

Звездочкой будет отмечен загрузочный диск.
Если нет, то используем fdisk, gparted или кому что нравится.
Моя разметка (в дальнейшем буду приводить свои данные):

Устр-во Загр Начало Конец Блоки Id Система
/dev/sda1 1 26 208813+ 83 Linux
/dev/sda2 27 2637 20972857+ 83 Linux
/dev/sda3 * 2638 7859 41945715 7 HPFS/NTFS
/dev/sda4 7860 60801 425247745 f W95 расшир. (LBA)
/dev/sda5 7860 10470 20971520 7 HPFS/NTFS
/dev/sda6 10471 60338 400556032 83 Linux
/dev/sda7 60338 60801 3718144 82 Linux своп / Solaris


Далее первый способ с «поддельным» MBR:

Устанавливаем пакет mbr:

$ sudo apt-get install mbr

Ставим копию mbr в файл. Ваш настоящий mbr никуда не денется:

$ sudo install-mbr --force /home/$USER/.myBootRecord.mbr && sudo chmod +rwx /home/$USER/.myBootRecord.mbr

Создаем VMDK-образ:

$ VBoxManage internalcommands createrawvmdk -filename /home/$USER/VirtualBox/Windows7.vmdk -rawdisk /dev/sda -partitions 3,5 -mbr /home/$USER/.myBootRecord.mbr -relative

Если все правильно, должно выдать "...created successfully"

Создаем виртуальную машину:
Задаем имя, к примеру, Windows7.
Задаем размер памяти, к примеру, 1024 МБ.
Отмечаем «Загрузочный диск», «Использовать существующий жесткий диск» и выбираем созданный файл Windows7.vmdk.
Виртуальная машина создана.

Теперь правим свойства машины:
В разделе «Система» на вкладке «Материнская плата» отмечаем IO APIC. Обязательно ставим галочку на CD/DVD-ROM. Он должен стоять первым в порядке загрузки. Все остальное по желанию.
В разделе «Носители» SATA контроллер должен быть Windows7.vmdk.
Теперь ищем DVD диск, с которого устанавливалась Windows, либо iso-образ установочного DVD. Добавляем в IDE контроллер привод оптических дисков (реальный или образ).
Все остальное — кто на что горазд.

Запускаем машину.
При первом запуске должно выдать: «Press any key to boot from cd or dvd». Восстанавливаем загрузчик Windows. Думаю, все знают, как это делать. После восстановления извлекаем установочный диск. Все. Windows должна запускаться как обычно.
Так вот, в этом способе присутствует очень огромный минус: при обычном запуске Windows, не через виртуальную машину, придется так же восстанавливать загрузчик. И так каждый раз.

Теперь второй способ с GRUB (v. 0.97), записанный в iso-образ (инструкции в сети разнятся, в зависимости от системы):

Создаем директорию:
$ mkdir -p .iso/boot/grub
Копируем файл в созданную директорию:
$ cp /usr/lib/grub/i386-pc/* .iso/boot/grub
Создаем iso-образ с GRUB:
$ genisoimage -R -b boot/grub/stage2_eltorito -no-emul-boot -boot-load-size 4 -boot-info-table -iso-level 2 -input-charset utf-8 -o grub.iso /home/$USER/.iso/
Создаем VMDK-образ:
$ VBoxManage internalcommands createrawvmdk -filename /home/$USER/VirtualBox/Windows7.vmdk -rawdisk /dev/sda -partitions 3,5 -relative

Далее создаем и настраиваем виртуальную машину так же как и в первом способе, за исключением пункта «Носители». Для IDE контроллера выбираем созданный grub.iso.

А теперь третий способ, который, почему то, я нигде в сети не встретил, по крайней мере, относящийся к Virualbox.
Может быть кому-то это покажется элементарным, но все же:
загрузка с помощью GRUB2 (v. 1.97) записанный в iso-образ.

Создаем директорию:

$ mkdir -p ~/.iso/boot/grub

В этой директории любым способом создал файл grub.cfg следующего содержания:
(Раздел menuentry «Windows 7» скопировать со своего grub.cfg, расположенного по адресу /boot/grub/)

insmod part_msdos
set default=0
set timeout=0
menuentry "Windows 7 (loader) (on /dev/sda3)" --class windows --class os {
insmod part_msdos
insmod ntfs
set root='(/dev/sda,msdos3)'
search --no-floppy --fs-uuid --set=root C070671099FC2625
chainloader +1
}


Здесь убрано все лишнее, GRUB проскакивает быстро и незаметно.

Создаем iso-образ с GRUB2:

$ grub-mkrescue --output=/home/$USER/.iso/grub.iso /home/$USER/.iso/

Создаем VMDK-образ:

$ VBoxManage internalcommands createrawvmdk -filename /home/$USER/VirtualBox/Windows7.vmdk -rawdisk /dev/sda -partitions 3,5 -relative

Далее создаем и настраиваем виртуальную машину так же как и во втором способе.
Так же выбираем grub.iso.
Едиственный нюанс: при автоматической установке дополнений гостевой оси, образ этого iso заменится на VBoxGuestAdditions.iso. Поменяйте его обратно.

Еще раз повторюсь, в примерах используются мои настройки. Вносите изменения.

Для справки:
Ноутбук Asus M50VM (Core2Duo T9400 2.53GHz, RAM 4058MB, GeForce 9600M)
OS: основная Linux Mint 11 Katya 2.6.38-12-generic (x86_64), вторая Windows 7 64 bit
Virtualbox 4.1.6
Tags:
virtualbox, linux, windows 7, grub, grub2, dual boot

You can't comment this post because its author is not yet a full member of the community. You will be able to contact the author only after he or she has been invited by someone in the community. Until then, author's username will be hidden by an alias.