Двойная загрузка – Установлен Arch, и запись Windows исчезла из GRUB

Вопрос или проблема

Я установил Arch на раздел и установил grub, как указано в вики.

grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg

Теперь я вижу только Archlinux и Advanced options, а Windows нет.

Вот вывод моей команды parted -l:

Model: ATA Hitachi HTS54757 (scsi)
Disk /dev/sda: 750GB
Sector size (logical/physical): 512B/4096B
Partition Table: gpt
Disk Flags: 

Number  Start   End     Size    File system     Name  Flags
 1      1049kB  135MB   134MB                         bios_grub
 2      135MB   269MB   134MB                   Mi    msftres
 3      269MB   86.2GB  85.9GB  ntfs            Ba    msftdata
 4      86.2GB  129GB   43.2GB  ext4            misc
 6      129GB   236GB   107GB   ntfs                  msftdata
 7      236GB   343GB   107GB   ntfs                  msftdata
 5      343GB   394GB   50.8GB  ext4
 8      394GB   403GB   9000MB  linux-swap(v1)
 9      403GB   507GB   103GB   ext4

И lsblk -f :

NAME   FSTYPE LABEL         UUID                                 MOUNTPOINT
sda                                                              
|-sda1                                                           
|-sda2                                                           
|-sda3 ntfs   Windows       02F00D3CF00D3785                     /media/Windows
|-sda4 ext4                 25bc874b-1a89-4ff9-a01e-ca39e28155d9 
|-sda5 ext4                 342ebed5-9592-4246-bdc2-4cd5c5ee92d5 /
|-sda6 ntfs   Programming   01CE50F6C84EAFE0                     /media/Programming
|-sda7 ntfs   Entertainment 01CE50F6CC660CE0                     /media/Entertainment
|-sda8 swap                 374052bf-9a06-4c34-a1dc-616967b6fe4f [SWAP]
`-sda9 ext4   misc2         15b7261e-39a6-4668-9f22-a7c3096a6af5 /media/misc2
sr0 

Содержимое моего /boot/grub/grub.cfg:

#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#

### BEGIN /etc/grub.d/00_header ###
insmod part_gpt
insmod part_msdos
if [ -s $prefix/grubenv ]; then
  load_env
fi
if [ "${next_entry}" ] ; then
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
else
   set default="0"
fi

if [ x"${feature_menuentry_id}" = xy ]; then
  menuentry_id_option="--id"
else
  menuentry_id_option=""
fi

export menuentry_id_option

if [ "${prev_saved_entry}" ]; then
  set saved_entry="${prev_saved_entry}"
  save_env saved_entry
  set prev_saved_entry=
  save_env prev_saved_entry
  set boot_once=true
fi

function savedefault {
  if [ -z "${boot_once}" ]; then
    saved_entry="${chosen}"
    save_env saved_entry
  fi
}

function load_video {
  if [ x$feature_all_video_module = xy ]; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}

if [ x$feature_default_font_path = xy ] ; then
   font=unicode
else
insmod part_gpt
insmod ext2
set root="hd0,gpt5"
if [ x$feature_platform_search_hint = xy ]; then
  search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  342ebed5-9592-4246-bdc2-4cd5c5ee92d5
else
  search --no-floppy --fs-uuid --set=root 342ebed5-9592-4246-bdc2-4cd5c5ee92d5
fi
    font="/usr/share/grub/unicode.pf2"
fi

if loadfont $font ; then
  set gfxmode=auto
  load_video
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=en_US
  insmod gettext
fi
terminal_input console
terminal_output gfxterm
if [ x$feature_timeout_style = xy ] ; then
  set timeout_style=menu
  set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
  set timeout=5
fi
### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/10_linux ###
menuentry 'Arch Linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-342ebed5-9592-4246-bdc2-4cd5c5ee92d5' {
    load_video
    set gfxpayload=keep
    insmod gzio
    insmod part_gpt
    insmod ext2
    set root="hd0,gpt5"
    if [ x$feature_platform_search_hint = xy ]; then
      search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  342ebed5-9592-4246-bdc2-4cd5c5ee92d5
    else
      search --no-floppy --fs-uuid --set=root 342ebed5-9592-4246-bdc2-4cd5c5ee92d5
    fi
    echo    'Loading Linux linux ...'
    linux   /boot/vmlinuz-linux root=UUID=342ebed5-9592-4246-bdc2-4cd5c5ee92d5 rw  quiet
    echo    'Loading initial ramdisk ...'
    initrd  /boot/intel-ucode.img /boot/initramfs-linux.img
}
submenu 'Advanced options for Arch Linux' $menuentry_id_option 'gnulinux-advanced-342ebed5-9592-4246-bdc2-4cd5c5ee92d5' {
    menuentry 'Arch Linux, with Linux linux' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-advanced-342ebed5-9592-4246-bdc2-4cd5c5ee92d5' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root="hd0,gpt5"
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  342ebed5-9592-4246-bdc2-4cd5c5ee92d5
        else
          search --no-floppy --fs-uuid --set=root 342ebed5-9592-4246-bdc2-4cd5c5ee92d5
        fi
        echo    'Loading Linux linux ...'
        linux   /boot/vmlinuz-linux root=UUID=342ebed5-9592-4246-bdc2-4cd5c5ee92d5 rw  quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/intel-ucode.img /boot/initramfs-linux.img
    }
    menuentry 'Arch Linux, with Linux linux (fallback initramfs)' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-linux-fallback-342ebed5-9592-4246-bdc2-4cd5c5ee92d5' {
        load_video
        set gfxpayload=keep
        insmod gzio
        insmod part_gpt
        insmod ext2
        set root="hd0,gpt5"
        if [ x$feature_platform_search_hint = xy ]; then
          search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt5 --hint-efi=hd0,gpt5 --hint-baremetal=ahci0,gpt5  342ebed5-9592-4246-bdc2-4cd5c5ee92d5
        else
          search --no-floppy --fs-uuid --set=root 342ebed5-9592-4246-bdc2-4cd5c5ee92d5
        fi
        echo    'Loading Linux linux ...'
        linux   /boot/vmlinuz-linux root=UUID=342ebed5-9592-4246-bdc2-4cd5c5ee92d5 rw  quiet
        echo    'Loading initial ramdisk ...'
        initrd  /boot/intel-ucode.img /boot/initramfs-linux-fallback.img
    }
}

### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###

### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###

### BEGIN /etc/grub.d/41_custom ###
if [ -f  ${config_directory}/custom.cfg ]; then
  source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f  $prefix/custom.cfg ]; then
  source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###

Содержимое файла /etc/default/grub:

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="Arch"
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

# Preload both GPT and MBR modules so that they are not missed
GRUB_PRELOAD_MODULES="part_gpt part_msdos"

# Uncomment to enable Hidden Menu, and optionally hide the timeout count
#GRUB_HIDDEN_TIMEOUT=5
#GRUB_HIDDEN_TIMEOUT_QUIET=true

# Uncomment to use basic console
GRUB_TERMINAL_INPUT=console

# Uncomment to disable graphical terminal
#GRUB_TERMINAL_OUTPUT=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
GRUB_GFXMODE=auto

# Uncomment to allow the kernel use the same resolution used by grub
GRUB_GFXPAYLOAD_LINUX=keep

# Uncomment if you want GRUB to pass to the Linux kernel the old parameter 
# format "root=/dev/xxx" instead of "root=/dev/disk/by-uuid/xxx" 
#GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
GRUB_DISABLE_RECOVERY=true

# Uncomment and set to the desired menu colors.  Used by normal and wallpaper 
# modes only.  Entries specified as foreground/background.
#GRUB_COLOR_NORMAL="light-blue/black"
#GRUB_COLOR_HIGHLIGHT="light-cyan/blue"

# Uncomment one of them for the gfx desired, a image background or a gfxtheme
#GRUB_BACKGROUND="/path/to/wallpaper"
#GRUB_THEME="/path/to/gfxtheme"

# Uncomment to get a beep at GRUB start
#GRUB_INIT_TUNE="480 440 1"

#GRUB_SAVEDEFAULT="true"

К счастью, я сам столкнулся с этим и это не серьезная проблема. В конфигурации grub будет раздел для различных опций меню. По умолчанию в опциях Windows будет символ # перед каждой строкой (кажется, их всего 4 или 5 строк). Я бы хотел предоставить вам больше деталей, однако не могу сделать это в моей текущей настройке.

У вас GPT таблица разделов. Windows не поддерживает загрузку с системы, размеченной как GPT, используя устаревшее BIOS. Поддерживаются только следующие комбинации:

  • Загрузка в стиле BIOS и разметка MBR
  • Загрузка в стиле UEFI и разметка GPT

Хотя Linux может выполнять загрузку UEFI+MBR и BIOS+GPT, Microsoft явно документирует, что Windows не поддерживает эти комбинации.

Похоже, вы преобразовали существующий UEFI ESP раздел (sda1) в раздел bios_grub, переписав загрузчик Windows UEFI на этом разделе. Каталог \EFI\Microsoft\Boot на UEFI ESP содержит файл с именем BCD, который содержит информацию, уникальную для вашей конкретной установки, и поэтому его нельзя восстановить с помощью стандартных установочных носителей: он должен быть воссоздан. К счастью, инструменты восстановления на установочных носителях Windows могут обычно сделать это довольно безболезненно.

Но даже если бы раздел ESP был нетронутым, версия GRUB i386-pc, используемая для загрузки в стиле BIOS (с использованием 16-битного кода), не смогла бы загрузить загрузчик UEFI, который использует современный 64-битный код. Менеджер загрузки UEFI rEFInd в некоторых случаях может перейти из режима UEFI в режим совместимости с устаревшей BIOS, чтобы загрузить ОС в стиле BIOS, но такой переход по сути односторонний и не работает на всех системах из-за различий в реализации микропрограмм UEFI.

Версия GRUB x86_64-efi (используемая при загрузке GRUB в стиле UEFI) не имеет проблем с загрузкой загрузчика Windows UEFI.

При планировании настройки многозагрузки с 2 или более альтернативными ОС на современных x86_64 системах следует всегда стараться, чтобы все ОС использовали одинаковый стиль загрузки (либо все в BIOS, либо все в UEFI). Linux grub-mkconfig обычно запускает os-prober, который обычно найдет Windows и автоматически добавит запись для ее загрузки только в том случае, если она использует тот же стиль загрузки, что и установленная версия GRUB.

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

Вы определенно не первый, кто допустил эту ошибку, и, конечно, не последний. (Вот почему я написал этот ответ на вопрос почти пятилетней давности.)

Ответ или решение

Когда вы сталкиваетесь с проблемой, когда после установки Arch Linux в качестве второй операционной системы запись Windows исчезает из загрузочного меню GRUB, это может вызвать много проблем и неудобств. Давайте подробно разберём, почему это происходит и как можно решить эту проблему.

Теория

Основная проблема заключается в несовместимости загрузочных систем между Windows и Linux. У вас установлена таблица разделов GPT, и вы пытаетесь загрузить Windows, используя BIOS-стиль, что является неподдерживаемой конфигурацией для Windows. Windows поддерживает загрузку с GPT только в UEFI режиме. Таким образом, у вас должно быть либо BIOS и MBR, либо UEFI и GPT. Linux, в отличие от Windows, может поддерживать различные комбинации, такие как UEFI+MBR и BIOS+GPT, но это не рекомендуется из-за известных ограничений.

Пример

Из предоставленных вами данных, ваш диск содержит:

  • sda1: Раздел для загрузки BIOS (bios_grub).
  • sda3: Раздел с файловой системой NTFS, который предположительно содержит Windows.

Судя по всему, вы изменили существующий UEFI ESP раздел (EFI System Partition) для использования его под BIOS, что привело к перезаписи загрузчика Windows. Также ваш GRUB конфигурируется с использованием grub-install и grub-mkconfig, но не обнаруживает Windows, так как они используют разные механизмы загрузки.

Применение

Чтобы исправить эту ситуацию, необходимо предпринять несколько шагов:

  1. Восстановление загрузчика Windows:

    • Загрузитесь с установочного носителя Windows.
    • Перейдите в восстановление системы и выберите командную строку.
    • Выполните следующие команды:
      bootrec /fixmbr
      bootrec /fixboot
      bootrec /scanos
      bootrec /rebuildbcd

    Эти команды восстановят загрузчик Windows и его конфигурацию на GPT-разделах.

  2. Переустановка GRUB в режиме UEFI:

    • Прежде чем устанавливать GRUB в UEFI режиме, убедитесь, что ваша система действительно загружается в UEFI режиме. Это можно проверить в настройках BIOS/UEFI.
    • Удалите существующую конфигурацию GRUB и переустановите её, используя UEFI:
      grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub
      grub-mkconfig -o /boot/grub/grub.cfg
  3. Настройка обнаружения других операционных систем:

    • Убедитесь, что os-prober установлен. Он необходим для автоматического обнаружения других установленных операционных систем.
    • Отредактируйте файл /etc/default/grub, чтобы включить os-prober:
      GRUB_DISABLE_OS_PROBER=false

    После чего снова сгенерируйте конфиг GRUB:

    grub-mkconfig -o /boot/grub/grub.cfg

Если вы выполните описанные шаги, то каждое из изменений должно повысить шансы на успешное восстановление мультизагрузки между Arch Linux и Windows.

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

Оцените материал
Добавить комментарий

Капча загружается...