如果按照LFS Book使用gurb的做法做,LFS的grub会覆盖原来系统的grub,有可能失去对原来系统的引导。
这方法应该对Gentoo有效,没做过,不太清楚。
笔者本来是Windows7+ubuntu11.04系统,grub内容如下:
/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 ###
if [ -s $prefix/grubenv ]; then
set have_grubenv=true
load_env
fi
set default="0"
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 recordfail {
set recordfail=1
if [ -n "${have_grubenv}" ]; then if [ -z "${boot_once}" ]; then save_env recordfail; fi; fi
}
function load_video {
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
}
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root 17984c85-e681-4de0-adab-bed448e4eae0
if loadfont /usr/share/grub/unicode.pf2 ; then
set gfxmode=auto
load_video
insmod gfxterm
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root 17984c85-e681-4de0-adab-bed448e4eae0
set locale_dir=($root)/boot/grub/locale
set lang=zh_CN
insmod gettext
fi
terminal_output gfxterm
if [ "${recordfail}" = 1 ]; then
set timeout=-1
else
set timeout=10
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
if background_color 44,0,30; then
clear
fi
### END /etc/grub.d/05_debian_theme ###
### BEGIN /etc/grub.d/10_linux ###
if [ ${recordfail} != 1 ]; then
if [ -e ${prefix}/gfxblacklist.txt ]; then
if hwmatch ${prefix}/gfxblacklist.txt 3; then
if [ ${match} = 0 ]; then
set linux_gfx_mode=keep
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=text
fi
else
set linux_gfx_mode=keep
fi
else
set linux_gfx_mode=text
fi
export linux_gfx_mode
if [ "$linux_gfx_mode" != "text" ]; then load_video; fi
menuentry 'Ubuntu,Linux 3.0.0-16-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
set gfxpayload=$linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root 17984c85-e681-4de0-adab-bed448e4eae0
linux /boot/vmlinuz-3.0.0-16-generic root=UUID=17984c85-e681-4de0-adab-bed448e4eae0 ro quiet splash vt.handoff=7
initrd /boot/initrd.img-3.0.0-16-generic
}
menuentry 'Ubuntu,Linux 3.0.0-16-generic (恢复模式)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root 17984c85-e681-4de0-adab-bed448e4eae0
echo '载入 Linux 3.0.0-16-generic ...'
linux /boot/vmlinuz-3.0.0-16-generic root=UUID=17984c85-e681-4de0-adab-bed448e4eae0 ro recovery nomodeset
echo '载入初始化内存盘...'
initrd /boot/initrd.img-3.0.0-16-generic
}
submenu "Previous Linux versions" {
menuentry 'Ubuntu,Linux 3.0.0-12-generic' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
set gfxpayload=$linux_gfx_mode
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root 17984c85-e681-4de0-adab-bed448e4eae0
linux /boot/vmlinuz-3.0.0-12-generic root=UUID=17984c85-e681-4de0-adab-bed448e4eae0 ro quiet splash vt.handoff=7
initrd /boot/initrd.img-3.0.0-12-generic
}
menuentry 'Ubuntu,Linux 3.0.0-12-generic (恢复模式)' --class ubuntu --class gnu-linux --class gnu --class os {
recordfail
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root 17984c85-e681-4de0-adab-bed448e4eae0
echo '载入 Linux 3.0.0-12-generic ...'
linux /boot/vmlinuz-3.0.0-12-generic root=UUID=17984c85-e681-4de0-adab-bed448e4eae0 ro recovery nomodeset
echo '载入初始化内存盘...'
initrd /boot/initrd.img-3.0.0-12-generic
}
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root 17984c85-e681-4de0-adab-bed448e4eae0
linux16 /boot/memtest86+.bin
}
menuentry "Memory test (memtest86+, serial console 115200)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos9)'
search --no-floppy --fs-uuid --set=root 17984c85-e681-4de0-adab-bed448e4eae0
linux16 /boot/memtest86+.bin console=ttyS0,115200n8
}
### END /etc/grub.d/20_memtest86+ ###
### BEGIN /etc/grub.d/30_os-prober ###
menuentry "Windows 7 (loader) (on /dev/sda1)" --class windows --class os {
insmod part_msdos
insmod ntfs
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root F22A8D3E2A8D00B9
chainloader +1
}
### 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 $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
电脑启动后会读取grub.cfg文件并显示grub菜单,注意,一个menuentry就是一个菜单项,一个submenu就是一个包含子菜单的菜单项,它们的内容都被“{}”括起来的内容,修改grub文件时,切记不能乱嵌套"{}",切记不能交叉嵌套。
请完整看接下来的一段话,并理解它:
我们的任务是,根据LFS book的步骤,在LFS系统(chroot后)中生成/boot/grub/grub.cfg,只做生成grub的操作而不更新主引导记录(更新的话就覆盖了原来的grub)。然后把新生成的grub.cfg中的LFS启动项添加到宿主系统grub.cfg文件中。
按照LFS book中第八章《使用Grub配置启动过程》的步骤做如下操作(假设你已经做完前面所有的工作,包括安装grub)
注意:这是在chroot环境下的操作:
1、讲grub文件安装到/boot/grub:
grub-install --grub-setup=/bin/true /dev/sda
2、生成/boot/grub/grub.cfg
grub-mkconfig -o /boot/grub/grub.cfg
测试grub你可以自己做也可以不做,到这里停住,不能执行更新主引导记录的操作。
打开一个新的终端,并用gedit打开刚生成的grub.cfg文件。
sudo gedit /mnt/lfs/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 ###
if [ -s $prefix/grubenv ]; then
load_env
fi
set default="0"
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 {
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
}
set timeout=5
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/10_linux ###
menuentry 'GNU/Linux, with Linux 3.2.6-lfs-7.1' --class gnu-linux --class gnu --class os {
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos6)'
search --no-floppy --fs-uuid --set=root d05c4b59-a4b3-4466-9ed4-4f13fd84d8f1
echo 'Loading Linux 3.2.6-lfs-7.1 ...'
linux /boot/vmlinuz-3.2.6-lfs-7.1 root=/dev/sda6 ro
}
menuentry 'GNU/Linux, with Linux 3.2.6-lfs-7.1 (recovery mode)' --class gnu-linux --class gnu --class os {
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos6)'
search --no-floppy --fs-uuid --set=root d05c4b59-a4b3-4466-9ed4-4f13fd84d8f1
echo 'Loading Linux 3.2.6-lfs-7.1 ...'
linux /boot/vmlinuz-3.2.6-lfs-7.1 root=/dev/sda6 ro single
}
### 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 $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom ###
其他不管,找到并复制两个(或一个)LFS的menuentry。我的如下:
menuentry 'GNU/Linux, with Linux 3.2.6-lfs-7.1' --class gnu-linux --class gnu --class os {
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos6)'
search --no-floppy --fs-uuid --set=root d05c4b59-a4b3-4466-9ed4-4f13fd84d8f1
echo 'Loading Linux 3.2.6-lfs-7.1 ...'
linux /boot/vmlinuz-3.2.6-lfs-7.1 root=/dev/sda6 ro
}
menuentry 'GNU/Linux, with Linux 3.2.6-lfs-7.1 (recovery mode)' --class gnu-linux --class gnu --class os {
load_video
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos6)'
search --no-floppy --fs-uuid --set=root d05c4b59-a4b3-4466-9ed4-4f13fd84d8f1
echo 'Loading Linux 3.2.6-lfs-7.1 ...'
linux /boot/vmlinuz-3.2.6-lfs-7.1 root=/dev/sda6 ro single
}
复制menuentry后,关闭gedit窗口。
打开宿主系统grub文件:
sudo gedit /boot/grub/grub.cfg
把刚复制的内容粘帖到你想要的位置,注意不要乱嵌套。
保存。
OK。正确的话,重启后你原来的grub菜单会多出LFS的启动项。如果引导失败,那很有可能是因为粘帖LFS的menuentry时嵌套到其他系统的menuentry里去了,准备好修复吧。

浙公网安备 33010602011771号