用宿主系统grub引导LFS

来源:互联网 发布:淘宝店铺导航条 css 编辑:程序博客网 时间:2024/05/22 11:51

http://www.cnblogs.com/nrobot/archive/2012/03/25/2416614.html


如果按照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_envfiset 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=truefifunction 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_msdosinsmod ext2set root='(hd0,msdos9)'search --no-floppy --fs-uuid --set=root 17984c85-e681-4de0-adab-bed448e4eae0if 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 gettextfiterminal_output gfxtermif [ "${recordfail}" = 1 ]; then  set timeout=-1else  set timeout=10fi### END /etc/grub.d/00_header ###### BEGIN /etc/grub.d/05_debian_theme ###set menu_color_normal=white/blackset menu_color_highlight=black/light-grayif background_color 44,0,30; then  clearfi### 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  fielse  set linux_gfx_mode=textfiexport linux_gfx_modeif [ "$linux_gfx_mode" != "text" ]; then load_video; fimenuentry '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_envfiset 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=truefifunction 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里去了,准备好修复吧。
0 0
原创粉丝点击