Вопрос или проблема
Я установил 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, так как они используют разные механизмы загрузки.
Применение
Чтобы исправить эту ситуацию, необходимо предпринять несколько шагов:
-
Восстановление загрузчика Windows:
- Загрузитесь с установочного носителя Windows.
- Перейдите в восстановление системы и выберите командную строку.
- Выполните следующие команды:
bootrec /fixmbr bootrec /fixboot bootrec /scanos bootrec /rebuildbcd
Эти команды восстановят загрузчик Windows и его конфигурацию на GPT-разделах.
-
Переустановка 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
-
Настройка обнаружения других операционных систем:
- Убедитесь, что
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. Смешение стилей загрузки только усложнит взаимодействие, и могут возникнуть трудности с доступом к общему загрузочному меню для всех ОС. Эти проблемы можно избежать, если с самого начала выбрать правильную стратегию установки и следовать ей.