双启动 - 安装的 arch 和 windows 条目在 grub 上消失

双启动 - 安装的 arch 和 windows 条目在 grub 上消失

我已经在分区上安装了 Arch,并按照 wiki 的说明安装了 grup

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

现在我只有ArchlinuxWindows 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\BootUEFI 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 年前的问题。)

相关内容