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分区

这里的blkid输出从Linux认为磁盘是/ dev / sdg …

 /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/上的 boot-info。

我知道它可以工作,因为它之前有效…


更新:

我从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将硬盘驱动器顺序从启动到启动混合,实际上实现启动是一个掷骰子…… <¬(

让我知道这个是否奏效:

 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 } 

嗯,这对我有用,可能不适合其他人。

我安装了三个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安装

/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中发现的唯一缺陷。 试一试,看看它是否能找到操作系统。