Инструменты пользователя

Инструменты сайта


blog:2021:0527_grub_windows_xp

Загружаем 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
}
1)
с эмулятором MultiKey
2)
если быть точнее, то проблема с кодом загружающим NTLDR - он зависит от геометрии диска, вернее от того, как BIOS представляет эту «геометрию», поэтому этот код такой хрупкий и при малейшей смене оборудования ломается
3)
подробнее об устройстве GRUB https://www.pixelbeat.org/docs/disk
5)
подробнее о процессе загрузки XP https://neosmart.net/wiki/windows-xp-boot-process
8)
подробнее о мультизагрузке http://www.multibooters.co.uk/multiboot.html
blog/2021/0527_grub_windows_xp.txt · Последнее изменение: 2022-02-19 18:16 — 127.0.0.1