![双启动 - 安装的 arch 和 windows 条目在 grub 上消失](https://linux22.com/image/104272/%E5%8F%8C%E5%90%AF%E5%8A%A8%20-%20%E5%AE%89%E8%A3%85%E7%9A%84%20arch%20%E5%92%8C%20windows%20%E6%9D%A1%E7%9B%AE%E5%9C%A8%20grub%20%E4%B8%8A%E6%B6%88%E5%A4%B1.png)
我已经在分区上安装了 Arch,并按照 wiki 的说明安装了 grup
grub-install /dev/sda
grub-mkconfig -o /boot/grub/grub.cfg
现在我只有Archlinux
Windows Advanced options
。
这是我的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"
答案1
值得庆幸的是,我自己也经历过这种情况,而且这不是一个严重的问题。在 grub 配置中,将有一个用于不同菜单选项的部分。默认情况下,Windows 选项在每行前面都会有一个#(总共有 4 或 5 行)。我想向您提供更多详细信息,但在我当前的设置中无法做到这一点。
答案2
您有一个 GPT 分区表。 Windows 不支持使用旧版 BIOS 从 GPT 分区的系统磁盘启动。只有这些组合才有效:
- 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 分区完好无损,i386-pc
用于 BIOS 式引导(使用 16 位代码)的 GRUB 版本也将无法链式加载使用现代 64 位代码的 UEFI 引导加载程序。在某些情况下,UEFI 启动管理器rEFInd
可以从 UEFI 模式转换到传统 BIOS 兼容模式,以 BIOS 样式启动操作系统,但这种转换本质上是单向的,并且由于 UEFI 固件实现差异,它并不适用于所有系统。
GRUB版本x86_64-efi
(在引导 GRUB UEFI 样式时使用)在链式加载 Windows UEFI 引导加载程序时没有问题。
当计划在现代 x86_64 系统上设置具有 2 个或更多操作系统替代方案的多重引导时,您应该始终尝试让所有操作系统使用相同的引导样式(所有 BIOS 或所有 UEFI)。 Linuxgrub-mkconfig
通常会运行os-prober
,它通常会找到Windows并自动为其添加启动项当且仅当它使用与已安装的 GRUB 版本相同的引导样式。
混合不同的靴子款式通常会导致额外的复杂性。至少,当从一种操作系统切换到另一种操作系统时,您通常必须使用 BIOS 设置在引导样式之间切换:您将无法轻松地将所有操作系统放在一个方便的引导菜单中。
你绝对不是第一个犯这个错误的人,也不会是最后一个。 (这就是为什么我写这个答案来回答一个近 5 年前的问题。)