如何将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,可以启动,但是只显示内置的菜单,我放在硬盘中的菜单不显示,也没字体,哪位高人有更好的方法呢? 我使用的一个内嵌的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
##########################################################
这里的内嵌grub,cfg中$root $fontdev $prefix都没有初始化和定义吧?是不是这个缘故??? 感谢niumao的解答!我的内嵌grub.cfg中的确没有定义 $prefix这些变量的路径,失误了,我再试试看,,
另外用了你的“小grub通用启动器”,感觉挺好的,你那个g2ldr.mbr是怎么得来的呢?还有你生成的g2ldr文件有325kb,是否也已经整合了模块? 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模板" 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可能会增减一些模块.
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启动, 2011niumao 发表于 2015-2-27 15:33
查阅了论坛的帖子.好像是这个命令: 意思是单独一个文件,似乎不再需要mod目录了.
可能会增减一些模块.
试了一下,这样编译出来的g2ldr可以启动,用lsmod显示所有的模块都加载了。但是不能显示背景图,加载了png模块,也指向了正确的文件,就是不能显示背景图,只是个黑底白字的菜单,中文倒是可以正常显示 ql1307096 发表于 2015-2-27 21:25
试了一下,这样编译出来的g2ldr可以启动,用lsmod显示所有的模块都加载了。但是不能显示背景图,加载了pn ...
测试了好多次,最后发现没有加载gfxterm_background.mod这个模块,再试试看看 加入了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: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: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: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
这条语句,又把主题外置了,方便更换。。。
2012angelkyo 发表于 2016-3-3 17:01
那么,最终启动的grub-efi-64.cfg菜单为
其中if search --no-floppy -f /boot/grub/themes/Vimix/theme.tx ...
厉害……学习了! 不错的。谢谢喽
页:
[1]