我想向 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.....
}
我需要的是“......这里的一些数据......”
一些困难:
启动时驱动器顺序从 BIOS 更改例如 有时分区的磁盘是
/dev/sda
,有时是/dev/sdg
。所以我使用分区的 UUID。更新:上次是/dev/sdc
!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。
答案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 中发现的唯一缺陷。试试看它是否能找到操作系统。