ql1307096 发表于 2015-2-25 19:03:45

如何将GRUB2的模块打包到memdisk中

本帖最后由 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,可以启动,但是只显示内置的菜单,我放在硬盘中的菜单不显示,也没字体,哪位高人有更好的方法呢?

2011niumao 发表于 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
##setroot=(${rootgrubdev})
###指向新的配置文件
###configfile /grub2/grubpc.cfg
##########################################################

2011niumao 发表于 2015-2-26 14:51:49

这里的内嵌grub,cfg中$root $fontdev $prefix都没有初始化和定义吧?是不是这个缘故???

ql1307096 发表于 2015-2-27 10:31:11

感谢niumao的解答!我的内嵌grub.cfg中的确没有定义 $prefix这些变量的路径,失误了,我再试试看,,


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

2011niumao 发表于 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模板"

2011niumao 发表于 2015-2-27 15:33:37

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




查阅了论坛的帖子.好像是这个命令: 意思是单独一个文件,似乎不再需要mod目录了.
grub-mkimage -o core.img --prefix="(hd0,1)/grub2"-O i386-pcall_videobiosdiskbootbtrfscatchainconfigfileechoexfatext2fatfontfreedosfshelpgettextgfxmenugfxtermgptsynchalthelphfshfsplusiso9660jfsjpeglegacycfglinux16linuxloopbacklsacpilsapmlsmmaplslspcilvmmemdiskmemrwminicmdmsdospartmultiboot2multibootnormalntfscompntfsntldrpart_acornpart_amigapart_applepart_bsdpart_dvhpart_gptpart_msdospart_planpart_sunpart_sunpcparttoolpasswordpciplaypngpxechainpxereadrebootreiserfsromfsscsisearch_fs_filesearch_fs_uuidsearch_labelsearchsendkeyserialsfssleeptarterminalterminfotestloadtesttimetrueudfufs1ufs2usb_keyboardusbvbevgavga_textvideo_bochsvideo_cirrusvideo_fbvideoinfovideovideotestzfs xfs bsd -c embed.cfg可能会增减一些模块.

ql1307096 发表于 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启动,

ql1307096 发表于 2015-2-27 21:25:49

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

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

ql1307096 发表于 2015-2-28 10:00:46

ql1307096 发表于 2015-2-27 21:25
试了一下,这样编译出来的g2ldr可以启动,用lsmod显示所有的模块都加载了。但是不能显示背景图,加载了pn ...

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

ql1307096 发表于 2015-2-28 10:10:02

加入了gfxterm_background.mod模块后,终于可以正常的显示背景图了。。只是我很奇怪,我是参考神雕大侠的帖子
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=308011&extra=page%3D1

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

2011niumao 发表于 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吧.不是这个大小的恐怕不行.

2012angelkyo 发表于 2016-3-3 16:50:07

本帖最后由 2012angelkyo 于 2016-3-3 16:55 编辑

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

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

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

mkdir out\boot\grub\fonts
copy /y unicode.pf2out\boot\grub\fonts

cd out
find ./boot -print|cpio -o -H newc > ./memdisk.cpio
cd ..
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

@pause
cd out
rmdir /s /q boot
del /s /q memdisk.cpiogrub-bootstarap.cfg内容为
normal (memdisk)/boot/grub/grub.cfg

那么(memdisk)/boot/grub/grub.cfg的内容为
search -s -f /boot/grub/****
注意三条search -s -f语句的作用,就是把菜单外置了。。。。
if [ "${grub_platform}" == "efi" ]; then
      if [ "${grub_cpu}" == "x86_64" ]; then
                if      search -s -f /boot/grub/grub-efi-64.cfg ; then
                        echo "Reading (${root})/boot/grub/grub-efi-64.cfg"
                        configfile /boot/grub/grub-efi-64.cfg
                else
                        echo "Could not find grub-efi-64.cfg file!"
                fi
      fi
      
      if [ "${grub_cpu}" == "i386" ]; then
                if      search -s -f /boot/grub/grub-efi-32.cfg ; then
                        echo "Reading (${root})/boot/grub/grub-efi-32.cfg"
                        configfile /boot/grub/grub-efi-32.cfg
                else
                        echo "Could not find grub-efi-32.cfg file!"
                fi
      fi
else
      if [ "${grub_platform}" == "pc" ]; then
                if [ "${grub_cpu}" == "i386" ]; then
                        if      search -s -f /boot/grub/grub-bios.cfg ; then
                              echo "Reading (${root})/boot/grub/grub-bios.cfg"
                              configfile /boot/grub/grub-bios.cfg
                        else
                              echo "Could not find grub-bios.cfg file!"
                        fi
                fi
      else
                echo "unknow platform!"
      fi
fi

2012angelkyo 发表于 2016-3-3 17:01:22

本帖最后由 2012angelkyo 于 2016-3-3 17:03 编辑

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

set timeout="5"
set default="0"

insmod all_video
insmod video_bochs
insmod video_cirrus
insmod efi_gop
insmod efi_uga
insmod font
insmod gfxterm
insmod gfxmenu
insmod gettext
insmod jpeg
insmod png

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

#设置分辨率
set gfxmode=auto
terminal_output gfxterm

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

menuentry "Microsoft Windows 10 企业版" --class windows --class os {
      echo "正在启动 Microsoft Windows 10..."
      insmod part_gpt
      insmod ntfs
      insmod fat   
      insmod chain
      search --no-floppy --set=root -f /EFI/Microsoft/boot/bootmgfw.efi
      chainloader (${root})/EFI/Microsoft/boot/bootmgfw.efi
}
      
menuentry "重启计算机" --class reboot {
      reboot
}
menuentry "关闭计算机" --class shutdown {
      halt
}其中if search --no-floppy -f /boot/grub/themes/Vimix/theme.txt; then
这条语句,又把主题外置了,方便更换。。。

devilma 发表于 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 ...

厉害……学习了!

yujiay445 发表于 2016-3-27 16:57:59

不错的。谢谢喽
页: [1]
查看完整版本: 如何将GRUB2的模块打包到memdisk中