os-prober 无法识别 Linux 系统,所以我需要编写自定义 grub2 菜单项作为解决方法,怎么做?

os-prober 无法识别 Linux 系统,所以我需要编写自定义 grub2 菜单项作为解决方法,怎么做?

我想向 grub2 添加自定义菜单,如下所示(如/etc/grub.d/40_custom):

#!/bin/sh
exec tail -n +3 $0
# 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.

menuentry "Arch Linux" {
....some data here.....
}

我需要的是“......这里的一些数据......”

一些困难:

  1. 启动时驱动器顺序从 BIOS 更改例如 有时分区的磁盘是/dev/sda,有时是/dev/sdg。所以我使用分区的 UUID。更新:上次是/dev/sdc

  2. Linux系统使用单独的启动分区,即分区1是分区/boot,分区2是/root分区,扩展分区4是/home分区

当 Linux 认为磁盘是 /dev/sdg 时的 blkid 输出如下...

/dev/sdg1: LABEL="arch_boot" UUID="34a39f15-f1a8-46a3-88e7-00c370c3c6a2" TYPE="ext2" 
/dev/sdg2: LABEL="arch_root" UUID="c670b0cf-a644-48d6-903d-dc3e49395a04" TYPE="ext2" 
/dev/sdg3: UUID="b36c4dc0-f5d7-488e-80fb-4c2e14313de5" TYPE="swap" 
/dev/sdg5: LABEL="arch_home" UUID="327900a5-e8f7-4dc4-be52-2f0dd97e3164" TYPE="ext4" 
/dev/sdg6: LABEL="arch_adjunct" UUID="f65f0ae6-9af2-4767-b223-a199ce96c71a" TYPE="reiserfs" 

这里是 Linux 系统的内容 (在引导修复覆盖 MBR 之前,它保留了 grub 遗留):

⋯@64bitWS:/media$ ls arch_boot
grub  initramfs-linux-fallback.img  initramfs-linux.img  lost+found  vmlinuz-linux
⋯@64bitWS:/media$ ls arch_boot/grub
e2fs_stage1_5  iso9660_stage1_5  minix_stage1_5     stage2           vstafs_stage1_5
fat_stage1_5   jfs_stage1_5      reiserfs_stage1_5  stage2_eltorito  xfs_stage1_5
ffs_stage1_5   menu.lst          stage1             ufs2_stage1_5
⋯@64bitWS:/media$ ls arch_root
aur  boot  etc   lib    lost+found  mnt  proc  run   srv  tmp  var
bin  dev   home  lib64  media       opt  root  sbin  sys  usr

启动信息http://paste.ubuntu.com/1099113/以及http://paste.ubuntu.com/1100049/针对每种不同的启动顺序。

我知道它可以起作用,因为它以前就起作用了......


更新:

我从 10.04 (1.38/lucid) 开始运行 os-prober,它成功了,它找到了所有 Linux 系统,而 12.04 os-prober (1.51) 则不行。所以我运行了 boot-repair (http://paste.ubuntu.com/1101977/),它产生了 Arch Linux grub2 菜单项。它看起来像这样(来自/boot/grub/grub.conf):

menuentry 'Arch Linux' {
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='(hd6,msdos1)'
    search --no-floppy --fs-uuid --set=root 34a39f15-f1a8-46a3-88e7-00c370c3c6a2
    linux   /boot/vmlinuz-linux root=UUID=670b0cf-a644-48d6-903d-dc3e49395a04
    initrd  /boot/initramfs-linux.img
}

与 Cumulus007 提出的答案相同。

不幸的是,这个“新的” grub.cfg 无法启动 Arch Linux,所以还没有答案......


最后更新:看来 10.04 的 grub3 (1.98) 无法使用 UUID 进行启动,而且由于我的硬件 BIOS 在每次启动时混淆了硬盘顺序,因此实际实现启动就像掷骰子一样......<¬(

答案1

让我知道这个是否奏效:

menuentry 'Arch Linux' {
    insmod gzio
    insmod part_msdos
    insmod ext2
    set root='(hd6,msdos1)'
    search --no-floppy --fs-uuid --set=root 34a39f15-f1a8-46a3-88e7-00c370c3c6a2
    linux   /boot/vmlinuz-linux root=UUID=670b0cf-a644-48d6-903d-dc3e49395a04
    initrd  /boot/initramfs-linux.img
}

答案2

嗯,这对我有用,但对其他人来说可能不是一个选择。

我安装了三个 Linux 系统,Ubuntu 10.04 LTS、Xubuntu 12.04 和 Arch Linux(滚动发布)。

12.04 失败,因为它的 os-prober 找不到 Arch Linux

10.04 失败,因为它不能使用 UUID,并且我的硬件 BIOS 混淆了硬盘顺序。

所以我转向 Arch Linux,安装了 grub2 并对其进行了配置。它的 os-prober 可以找到所有已安装的系统,并且可以使用 UUID。

安装https://wiki.archlinux.org/index.php/Grub

答案3

/etc/grub.d/30_os-prober 的第 184 行内容如下:

prepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | sed -e "s/^/\t/")"

这可能会使脚本解析器产生混淆。将其编辑为:

prepare_boot_cache="$(prepare_grub_to_access_device ${LBOOT} | sed -e 's/^/\t/')"

应该会让它看起来更好。这是我在 12.04 版 grub2 的 os-prober 中发现的唯一缺陷。试试看它是否能找到操作系统。

相关内容