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可以显示背景图,这是为什么呢?
页: [1] 2
查看完整版本: 如何将GRUB2的模块打包到memdisk中