Mr_黄志光

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

如果按照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里去了,准备好修复吧。


 



 





posted on 2012-03-25 14:55  Mr_黄志光  阅读(1338)  评论(0)    收藏  举报