无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 9502|回复: 17
打印 上一主题 下一主题

[已解决] 如何将GRUB2的模块打包到memdisk中

[复制链接]
跳转到指定楼层
#
发表于 2015-2-25 19:03:45 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 ql1307096 于 2015-3-22 21:15 编辑

如何在windows下编译单文件的grub2呢?我参考了神雕和极限驱动两位高人的方法,大体方法如下:

1。cygwin中$ find boot -print|cpio -o -H newc > /memdisk.cpio(执行这一步的之前已经将多余的文件删掉,已减小内核的大小,模块也精简了很多)
2。grub-mkimage.exe -O i386-pc -d i386-pc -o i386-pc-core.img -m memdisk.cpio -v biosdisk newc blocklist fat iso9660 pxe reiserfs memdisk cpio minicmd part_msdos ext2 ntfs loopback gfxmenu gfxterm reboot normal

grub2内置菜单内容:
insmod part_apple
insmod part_bsd
insmod part_gpt
insmod part_msdos
insmod part_sun
insmod part_sunpc
insmod halt
insmod search
insmod configfile

function load_video {
  if [ x$feature_all_video_module = xy ] ; then
    insmod all_video
  else
    insmod efi_gop
    insmod efi_uga
    insmod ieee1275_fb
    insmod vbe
    insmod vga
    insmod video_bochs
    insmod video_cirrus
  fi
}
search --no-floppy --file --set=fontdev /boot/grub/unicode.pf2
if loadfont ($fontdev)/boot/grub/unicode.pf2 ; then
  set gfxmode=auto
  load_video
  insmod font
  insmod gfxterm
  set locale_dir=$prefix/locale
  set lang=zh_CN
  insmod gettext
  terminal_output gfxterm
else
  loadfont $prefix/font.pf2
  set gfxmode=auto
  insmod efi_gop
  insmod efi_uga
  insmod gfxterm
  terminal_output gfxterm
fi
set pager=1
if ! search --no-floppy --file --set=root /boot/grub/grub.cfg ; then
  search --file --set=root /grub.cfg
fi
set winlymenu=($root)
if [ -e $winlymenu/boot/grub/grub.cfg ]; then
configfile $winlymenu/boot/grub/grub.cfg
else
configfile $winlymenu/grub.cfg
fi
menuentry "" {
true
}
menuentry "===Windows base Live Linux Installer===" {
true
}


最后得到的G2LDR大约300多kb,可以启动,但是只显示内置的菜单,我放在硬盘中的菜单不显示,也没字体,哪位高人有更好的方法呢?

点评

http://www.daoxcun.com/ 盗香小说网  发表于 2015-3-1 23:01
www.xbctech.com 校园小说  发表于 2015-2-26 09:56
15#
发表于 2016-3-27 16:57:59 | 只看该作者
不错的。谢谢喽
回复

使用道具 举报

14#
发表于 2016-3-15 16:37:15 | 只看该作者
2012angelkyo 发表于 2016-3-3 17:01
那么,最终启动的grub-efi-64.cfg菜单为
其中if search --no-floppy -f /boot/grub/themes/Vimix/theme.tx ...

厉害……学习了!
回复

使用道具 举报

13#
发表于 2016-3-3 17:01:22 | 只看该作者
本帖最后由 2012angelkyo 于 2016-3-3 17:03 编辑

那么,最终启动的grub-efi-64.cfg菜单为

  1. set timeout="5"
  2. set default="0"

  3. insmod all_video
  4. insmod video_bochs
  5. insmod video_cirrus
  6. insmod efi_gop
  7. insmod efi_uga
  8. insmod font
  9. insmod gfxterm
  10. insmod gfxmenu
  11. insmod gettext
  12. insmod jpeg
  13. insmod png

  14. #加载unicode字体显示中文
  15. font=(memdisk)/boot/grub/fonts/unicode.pf2
  16. if loadfont ${font}; then
  17. set gfxmode=1366x768
  18. set locale_dir=(memdisk)/boot/grub/locale
  19. set lang=zh_CN
  20. fi

  21. #设置分辨率
  22. set gfxmode=auto
  23. terminal_output gfxterm

  24. #设置主题或背景图片
  25. if search --no-floppy -f /boot/grub/themes/Vimix/theme.txt; then
  26.         set theme=/boot/grub/themes/Vimix/theme.txt
  27. else
  28.         background_image /boot/grub/background.jpg
  29.         set color_normal=red/black
  30.         set color_highlight=magenta/black
  31. fi

  32. menuentry "Microsoft Windows 10 企业版" --class windows --class os {
  33.         echo "正在启动 Microsoft Windows 10..."
  34.         insmod part_gpt
  35.         insmod ntfs
  36.         insmod fat   
  37.         insmod chain
  38.         search --no-floppy --set=root -f /EFI/Microsoft/boot/bootmgfw.efi
  39.         chainloader (${root})/EFI/Microsoft/boot/bootmgfw.efi
  40. }
  41.         
  42. menuentry "重启计算机" --class reboot {
  43.         reboot
  44. }
  45. menuentry "关闭计算机" --class shutdown {
  46.         halt
  47. }
复制代码
其中if search --no-floppy -f /boot/grub/themes/Vimix/theme.txt; then
这条语句,又把主题外置了,方便更换。。。

点评

厉害……学习了!  详情 回复 发表于 2016-3-15 16:37
回复

使用道具 举报

12#
发表于 2016-3-3 16:50:07 | 只看该作者
本帖最后由 2012angelkyo 于 2016-3-3 16:55 编辑

举例说明:
假设这是生成EFI的批处理
  1. cd /d %~dp0

  2. xcopy /s /e /y /i x86_64-efi out\boot\grub\x86_64-efi

  3. mkdir out\boot\grub\locale
  4. copy /y locale\zh_CN\grub.mo out\boot\grub\locale\zh_CN.mo
  5. copy /y grub.cfg out\boot\grub\grub.cfg

  6. mkdir out\boot\grub\fonts
  7. copy /y unicode.pf2  out\boot\grub\fonts

  8. cd out
  9. find ./boot -print|cpio -o -H newc > ./memdisk.cpio
  10. cd ..
  11. grub-mkimage.exe -m out\memdisk.cpio -d out\boot\grub\x86_64-efi -c out\grub-bootstrap.cfg -p (memdisk)/boot/grub -O x86_64-efi -o .\out\bootx64.efi -v newc iso9660 part_msdos part_gpt ext2 cpio memdisk blocklist minicmd loopback fat ntfs gfxterm reboot normal gfxmenu gfxterm search

  12. @pause
  13. cd out
  14. rmdir /s /q boot
  15. del /s /q memdisk.cpio
复制代码
grub-bootstarap.cfg内容为
  1. normal (memdisk)/boot/grub/grub.cfg
复制代码


那么(memdisk)/boot/grub/grub.cfg的内容为
search -s -f /boot/grub/****
注意三条search -s -f语句的作用,就是把菜单外置了。。。。
  1. if [ "${grub_platform}" == "efi" ]; then
  2.         if [ "${grub_cpu}" == "x86_64" ]; then
  3.                 if        search -s -f /boot/grub/grub-efi-64.cfg ; then
  4.                         echo "Reading (${root})/boot/grub/grub-efi-64.cfg"
  5.                         configfile /boot/grub/grub-efi-64.cfg
  6.                 else
  7.                         echo "Could not find grub-efi-64.cfg file!"
  8.                 fi
  9.         fi
  10.         
  11.         if [ "${grub_cpu}" == "i386" ]; then
  12.                 if        search -s -f /boot/grub/grub-efi-32.cfg ; then
  13.                         echo "Reading (${root})/boot/grub/grub-efi-32.cfg"
  14.                         configfile /boot/grub/grub-efi-32.cfg
  15.                 else
  16.                         echo "Could not find grub-efi-32.cfg file!"
  17.                 fi
  18.         fi
  19. else
  20.         if [ "${grub_platform}" == "pc" ]; then
  21.                 if [ "${grub_cpu}" == "i386" ]; then
  22.                         if        search -s -f /boot/grub/grub-bios.cfg ; then
  23.                                 echo "Reading (${root})/boot/grub/grub-bios.cfg"
  24.                                 configfile /boot/grub/grub-bios.cfg
  25.                         else
  26.                                 echo "Could not find grub-bios.cfg file!"
  27.                         fi
  28.                 fi
  29.         else
  30.                 echo "unknow platform!"
  31.         fi
  32. fi
复制代码


回复

使用道具 举报

11#
发表于 2015-2-28 12:23:19 | 只看该作者
本帖最后由 2011niumao 于 2015-2-28 12:33 编辑

g2ldr.mbr可以下载一个制作好的就行.不一定自己制作的.

制作g2ldr应该是cat命令(ubuntu).如果是windows 我就不知道了.

不过有点奇怪的是,那个头文件似乎可以选择几个之一. 很奇怪的.

例如 在ubuntu内 /usr/lib/grub/i386-pc里面 有 boot.img g2hdr.bin g2hdr.img g2ldr.img

都可以和制作好的 core.img 合并为 g2ldr .似乎都可以启动.

但注意其大小应该是512吧.不是这个大小的恐怕不行.
回复

使用道具 举报

10#
 楼主| 发表于 2015-2-28 10:10:02 | 只看该作者
加入了gfxterm_background.mod模块后,终于可以正常的显示背景图了。。只是我很奇怪,我是参考神雕大侠的帖子
http://bbs.wuyou.net/forum.php?m ... &extra=page%3D1

保留了他列表里的模块,发现他的模块列表里并没有gfxterm_background.mod这个,但是他的winly可以显示背景图,这是为什么呢?
回复

使用道具 举报

9#
 楼主| 发表于 2015-2-28 10:00:46 | 只看该作者
ql1307096 发表于 2015-2-27 21:25
试了一下,这样编译出来的g2ldr可以启动,用lsmod显示所有的模块都加载了。但是不能显示背景图,加载了pn ...

测试了好多次,最后发现没有加载gfxterm_background.mod这个模块,再试试看看
回复

使用道具 举报

8#
 楼主| 发表于 2015-2-27 21:25:49 | 只看该作者
2011niumao 发表于 2015-2-27 15:33
查阅了论坛的帖子.好像是这个命令: 意思是单独一个文件,似乎不再需要mod目录了.
可能会增减一些模块.

试了一下,这样编译出来的g2ldr可以启动,用lsmod显示所有的模块都加载了。但是不能显示背景图,加载了png模块,也指向了正确的文件,就是不能显示背景图,只是个黑底白字的菜单,中文倒是可以正常显示

点评

测试了好多次,最后发现没有加载gfxterm_background.mod这个模块,再试试看看  详情 回复 发表于 2015-2-28 10:00
回复

使用道具 举报

7#
 楼主| 发表于 2015-2-27 20:26:54 | 只看该作者
2011niumao 发表于 2015-2-27 15:25
g2ldr.mbr我是从grldr.mbr使用winhex把grldr更改为g2ldr得到的.可以使用0.46a 或者 0.45c .
后来发现ubu ...

我也是用你这个方法,修改grldr.mbr的字串,但是无法引导。,我用grub-mkimage生成core.img、然后用copy命令合并,生成的g2ldr可以用grub4dos的kernel启动,但是无法通过bootmgr启动,
回复

使用道具 举报

6#
发表于 2015-2-27 15:33:37 | 只看该作者
ql1307096 发表于 2015-2-27 10:31
感谢niumao的解答!我的内嵌grub.cfg中的确没有定义 $prefix这些变量的路径,失误了,我再试试看,,

查阅了论坛的帖子.好像是这个命令: 意思是单独一个文件,似乎不再需要mod目录了.
  1. grub-mkimage -o core.img --prefix="(hd0,1)/grub2"  -O i386-pc  all_video  biosdisk  boot  btrfs  cat  chain  configfile  echo  exfat  ext2  fat  font  freedos  fshelp  gettext  gfxmenu  gfxterm  gptsync  halt  help  hfs  hfsplus  iso9660  jfs  jpeg  legacycfg  linux16  linux  loopback  lsacpi  lsapm  lsmmap  ls  lspci  lvm  memdisk  memrw  minicmd  msdospart  multiboot2  multiboot  normal  ntfscomp  ntfs  ntldr  part_acorn  part_amiga  part_apple  part_bsd  part_dvh  part_gpt  part_msdos  part_plan  part_sun  part_sunpc  parttool  password  pci  play  png  pxechain  pxe  read  reboot  reiserfs  romfs  scsi  search_fs_file  search_fs_uuid  search_label  search  sendkey  serial  sfs  sleep  tar  terminal  terminfo  testload  test  time  true  udf  ufs1  ufs2  usb_keyboard  usb  vbe  vga  vga_text  video_bochs  video_cirrus  video_fb  videoinfo  video  videotest  zfs xfs bsd -c embed.cfg
复制代码
可能会增减一些模块.

点评

试了一下,这样编译出来的g2ldr可以启动,用lsmod显示所有的模块都加载了。但是不能显示背景图,加载了png模块,也指向了正确的文件,就是不能显示背景图,只是个黑底白字的菜单,中文倒是可以正常显示  详情 回复 发表于 2015-2-27 21:25
回复

使用道具 举报

5#
发表于 2015-2-27 15:25:36 | 只看该作者
ql1307096 发表于 2015-2-27 10:31
感谢niumao的解答!我的内嵌grub.cfg中的确没有定义 $prefix这些变量的路径,失误了,我再试试看,,

g2ldr.mbr我是从grldr.mbr使用winhex把grldr更改为g2ldr得到的.可以使用0.46a 或者 0.45c .
后来发现ubuntu里面grub2本身带有一个g2ldr.mbr.都可以使用.
制作g2ldr的命令就来自论坛.命令来自2011895866818的帖子"grub2教程,grub2模板"

点评

我也是用你这个方法,修改grldr.mbr的字串,但是无法引导。,我用grub-mkimage生成core.img、然后用copy命令合并,生成的g2ldr可以用grub4dos的kernel启动,但是无法通过bootmgr启动,  详情 回复 发表于 2015-2-27 20:26
回复

使用道具 举报

4#
 楼主| 发表于 2015-2-27 10:31:11 | 只看该作者
感谢niumao的解答!我的内嵌grub.cfg中的确没有定义 $prefix这些变量的路径,失误了,我再试试看,,


另外用了你的“小grub通用启动器”,感觉挺好的,你那个g2ldr.mbr是怎么得来的呢?还有你生成的g2ldr文件有325kb,是否也已经整合了模块?

点评

查阅了论坛的帖子.好像是这个命令: 意思是单独一个文件,似乎不再需要mod目录了. 可能会增减一些模块.  详情 回复 发表于 2015-2-27 15:33
g2ldr.mbr我是从grldr.mbr使用winhex把grldr更改为g2ldr得到的.可以使用0.46a 或者 0.45c . 后来发现ubuntu里面grub2本身带有一个g2ldr.mbr.都可以使用. 制作g2ldr的命令就来自论坛.命令来自2011895866818的帖子"g  详情 回复 发表于 2015-2-27 15:25
回复

使用道具 举报

3#
发表于 2015-2-26 14:51:49 | 只看该作者
这里的内嵌grub,cfg中  $root $fontdev $prefix都没有初始化和定义吧?是不是这个缘故???
回复

使用道具 举报

2#
发表于 2015-2-26 14:49:46 | 只看该作者
我使用的一个内嵌的grub.cfg.供参考
#############################################################
###嵌入在g2ldr内部的配置文件内容
###prefix=(hd0,1)/grub2  这是默认前缀.即grub模块所在路径.
###prefix=(${rootgrubdev})/grub2 这是修改后的前缀,必须使用绝对路径;避开root关键词.
##set rootgrubdev=(hd0,msdos1)
##search --no-floppy -f --set=rootgrubdev /grub2/grubpc.cfg
##set prefix=(${rootgrubdev})/grub2
##set  root=(${rootgrubdev})
###指向新的配置文件
###configfile /grub2/grubpc.cfg
##########################################################
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-26 04:57

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表