Загружаем Windows из GRUB
После переноса виртуальной машины с Windows XP 1) из Virtualbox в Proxmox при загрузке возникла ошибка:
Disk Error
Press any key to restart
Проблема была явно с загрузчиком 2), а поскольку быстро устранить её не удалось (bootrec /fixmbr
и /fixboot
не помогли и вот почему), то это стало отличным поводом вовсе заменить загрузчик курильщика Windows на GRUB. Способ действует не только для Windows XP, но и для современных ОС Windows. Как показала практика, GRUB гораздо более «живуч» при изменениях аппаратной конфигурации компьютера, переносе системы на другое оборудование или миграции виртуальных машин. 3)
В конфигурации GRUB есть недокументированная команда ntldr
4) для передачи процесса загрузки в Windows-загрузчик NTLDR (для Windows XP) или BootMGR (для более поздних версий Windows). Именно ей можно воспользоваться, чтобы заменить штатный загрузчик.
Windows XP
Действия по шагам для загрузчика NTLDR (Windows NT 5.2): 5)
- загрузить Live-дистрибутив Linux с GRUB (например, Rescatux)
- примонтировать раздел с Windows XP
mount /dev/sda1 /mnt
- установить GRUB:
grub-install --boot-directory=/mnt /dev/sda
- создать файл конфигурации GRUB в его каталоге
- /mnt/grub/grub.cfg
set default="Windows XP" set timeout=5 menuentry "Windows XP" --class windows --class os { insmod part_msdos insmod ntfs insmod ntldr set root='(hd0,msdos1)' search --no-floppy --set=root --label MULTIKEY search --no-floppy --set=root --fs-uuid 2C08-8FE5 ntldr ($root)/ntldr }
- отмонтировать раздел
umount /mnt && sync
- перезагрузить виртуальную машину
reboot
7, 8, 2008, 2012
Всё то же самое для BootMGR 6) (Windows NT 6.x), только загрузка другого файла: 7)
- /mnt/grub/grub.cfg
set default="Windows 7" set timeout=5 menuentry "Windows 7" --class windows --class os { insmod part_msdos insmod ntfs insmod ntldr set root='(hd0,msdos1)' ntldr ($root)/bootmgr }
Загрузчик Windows
Загрузить любую версию Windows используя её собственный исправный загрузчик (расположенный в PBR) можно через chainloader
:
- /boot/grub/grub.cfg
menuentry "Start Windows" --class windows --class os { set root='(hd0,1)' search --no-floppy --set=root --label CAVALWIN chainloader '+1' }
Такой способ бывает полезен при «мультизагрузке» 8) нескольких ОС с одного диска.
Veracrypt
Если в системе два физических диска, на первом установлен GRUB, а на втором ОС Windows со своим родным загрузчиком, то бывает полезно передать загрузку полностью на второй диск. Такое бывает необходимо, например, для загрузки с зашифрованного с помощью Veracrypt диска (бывший Truecrypt), так как загрузчик Veracrypt не поддерживает «обычную» мультизагрузку.
Чтобы этот способ сработал, BIOS компьютера должен пытаться передать загрузку следующему диску при неудачной попытке на первом. Если BIOS позволяет явно задать порядок загрузки дисков, то нужно указать первым диск с GRUB, вторым с Windows.
Но в большинстве BIOS можно указать только порядок загрузки «устройств», например: первый Hard Disk, второй CD-ROM, третья сетевая карта. В таком случае нужно указать порядок дисков в разделе Hard Disks. Чтобы передать загрузку второму диску достаточно сделать «выход» из GRUB и BIOS сам перейдёт к загрузке со второго диска:
- /boot/grub/grub.cfg
menuentry "Windows Veracrypt" { # Boot from next disk exit }