无忧启动论坛

标题: 请求grub4dos的开发者帮忙编译一个带netboot支持的grldr [打印本页]

作者: ekaromay    时间: 2010-12-16 23:22
标题: 请求grub4dos的开发者帮忙编译一个带netboot支持的grldr
因为本人有特殊需求,需要在无pxe bootrom,无硬盘光盘软盘的机器上通过pxe下载文件引导,
但因为无硬盘光盘软盘,所以etherboot,gpxe等代替pxe bootrom的方法都不能用
不过经过我的努力,已经成功引导服务器上的grldr,但无任何可继续引导的介质,引导无法继续了

找了一些资料,发现grub4dos有netboot支持可以实现(nd)设备,可以在grldr上集成一些网卡的启动代码,从而可以通过pxe下载文件继续引导,但netboot支持需要特殊的编译指令,本人找遍网络,无法找到现成的grldr文件,看来只有自行编译了

但我实在不熟悉linux下的程序开发,想自己编译grub4dos却总是失败,实在没有办法了
希望有参与grub4dos的开发者们帮忙编译一个带netboot支持的grldr上传上来,本人网卡为sis900,万分感谢了!
作者: 不点    时间: 2010-12-16 23:42
没人使用的功能,你也敢指望它能可靠工作?随便出一个 bug,就够你折腾到不耐烦了。恕我直言,呵呵。

你不是已经从服务器启动了 grldr 了吗?而 grldr 本身是可以把服务器上的 IMG 加载到内存并仿真为磁盘或者光盘的,这是很初步的功能,这里的人都懂得。我本人当然从来用不上这些功能了,所以,我还只能算是外行。我估计,只有我这个外行才来回你一帖,其他熟悉的人恐怕不愿意答理你了。
作者: ekaromay    时间: 2010-12-17 00:58
其实是这样的,这台机器是无pxe bootrom的啊,但有rpl bootrom,这已经是很古老的引导方式了
我现在可以实现rpl启动到grldr了,但进了命令行,find命令是找不到任何设备的
如果网卡有pxe bootrom,那当然可以有(pd)设备,但现在是什么都没有。。。
所以如果有内置netboot的grldr,那么至少可以用(nd)设备来下载文件继续引导啊
我不需要它是否可靠了,因为这个本来就是我自己用的特殊用途,有bug也无所谓,先试试再说,帮忙编译一下就可以了
我自己编译实在是没办法,系统编译其他的程序没问题,但grub4dos ./configure,./build总是error

我查看过netboot的编译指令,好象是
./configure --enable-diskless --enable-sis900
就可以编译sis900的代码进去了,实在没办法了,帮忙编译一个吧,再次万分感谢了!
不点大哥好象是grub4dos的主要开发者吧,您也编译不了吗?帮帮忙吧,哎!
作者: 不点    时间: 2010-12-17 01:41
抱歉,没有涉及过这类问题。

你可以考虑直接用原始的 GNU GRUB legacy。既然你能启动 grldr,你也应该有办法启动原始的 stage2 文件。

或者你可以考虑类似的软件,例如 grub2,burg,syslinux,等等。

你也可以向 bean 询问一下,看看他有什么主意。bean 目前似乎把精力主要投入到 burg 的开发上了。你可以到 burg 的论坛找他。

[ 本帖最后由 不点 于 2010-12-17 01:45 编辑 ]
作者: ekaromay    时间: 2010-12-17 11:59
其实是我真的没办法,如果可以用别的方法我也不想这么麻烦,因为这台机器我不能拆机箱装别的东西上去,u盘也不支持引导,似乎传统的GNU GRUB没有map --mem仿真磁盘的功能吧,我需要这个功能的,其实这样的引导环境是非常恶劣的,呵呵,"巧妇难为无米之炊"看来就是这样的情况了

我能成功引导grldr是因为我修改了服务端的高级配置,我觉得因为grldr因为本身与ntldr(微软自家产品)有相似之处,而且支持pxe启动(与网络相关的代码有相似),所以很很很勉强能在如此恶劣的情况下引导到这一步,其他别的grub2,burg,syslinux,等等全失败了,我也已经试过了,下一步确实走不下去了,所以如果有了netboot支持,能通过(nd)下载文件继续引导,就胜利了

所以我仍然希望您能帮忙编译一个,我编译实在不成功,我编译时用的代码是grub4dos0.4.4-2009-06-20的标准代码,因为2009-06-20的版本的grldr已经可以实现引导到这一步,没有用最近的测试版代码,因为我怕太新会出现别的问题,但编译时出现这样的错误:

dosstart.S: Assembler messages:
dosstart.S:91: Error: value of 0000000000040231 too large for field of 2 bytes at 0000000000000004
dosstart.S:652: Error: value of 0000000000805960 too large for field of 2 bytes at 00000000000000d9
dosstart.S:4837: Error: value of 00000000008045ef too large for field of 2 bytes at 0000000000003073
dosstart.S:4845: Error: value of 00000000008055ef too large for field of 2 bytes at 000000000000307e
dosstart.S:6764: Error: value of 00000000008045f0 too large for field of 2 bytes at 000000000000408a
dosstart.S:7109: Error: value of 00000000008045ef too large for field of 2 bytes at 0000000000004196
make[3]: *** [dosstart_exec-dosstart.o] Error 1
make[3]: Leaving directory `/media/sda1/grub4dos/grub4dos-temp/stage2'
make[2]: *** [all] Error 2
make[2]: Leaving directory `/media/sda1/grub4dos/grub4dos-temp/stage2'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/media/sda1/grub4dos/grub4dos-temp'
make: *** [all] Error 2
gcc是4.3.3版本的,应该没问题的吧,但就是编译不了啊
作者: roytam1    时间: 2010-12-17 12:01
有軟盤的話就從軟盤啟動plop去啟動USB吧。
作者: pseudo    时间: 2010-12-17 12:23
既然rpl能下载、引导grldr,可否就在grldr上做文章。
试试把其它文件续到grldr后尾,得到大体积grldr,如果它能整个被rpl下载,引导grldr后整个大体积grldr仍在内存的话,就有办法了。
作者: zhaohj    时间: 2010-12-17 12:41
你是需要编译环境吧,看看下面两篇文章:
http://bbs.znpc.net/viewthread.php?tid=3288
http://hi.baidu.com/iamliqi/blog ... afdd2a2cf5342b.html
作者: chenall    时间: 2010-12-17 13:10
即然有办法启动GRLDR,那启动其它的也不是问题吧.
比如启动一个GPXE,PLOP都是可能的.
虽然好久没有用RPL
但是要启动这些东西还是很简单的.在服务器上配置一下就可以了.

然后只要你的服务器支持PXE启动,剩下的问题就解决了.
作者: xiaoy    时间: 2010-12-17 13:19
换个网卡启动代码是很容易的事  RPL -PXE是完全可行的

[ 本帖最后由 xiaoy 于 2010-12-17 13:22 编辑 ]
作者: 不点    时间: 2010-12-17 16:08
chenall, 他的服务器不支持 PXE,我们其实没招了。[纠正]是他的客户机不支持 PXE。

楼主 ekaromay 确实是高手,能在没有 PXE 的情况下进入 grldr。

ekaromay 所需要的,就是让 grub4dos 编译通过而已,这个应该不难。

从上面的出错信息来看,是编译器自身的问题。编译器的适应能力太差。

dosstart.S:91: Error: value of 0000000000040231 too large for field of 2 bytes at 0000000000000004
dosstart.S:652: Error: value of 0000000000805960 too large for field of 2 bytes at 00000000000000d9
dosstart.S:4837: Error: value of 00000000008045ef too large for field of 2 bytes at 0000000000003073
dosstart.S:4845: Error: value of 00000000008055ef too large for field of 2 bytes at 000000000000307e
dosstart.S:6764: Error: value of 00000000008045f0 too large for field of 2 bytes at 000000000000408a
dosstart.S:7109: Error: value of 00000000008045ef too large for field of 2 bytes at 0000000000004196

这个 dosstart.S 是为了编译 grub.exe 的,如果你不需要 grub.exe 而只需要 grldr,则你可以生办法禁止编译 grub.exe,(在 Makefile 上做文章)这样,问题就解决了。

另外,上面显示的这些错误,都是汇编语句的错误,通过适当修改汇编语句,是可以让编译通过的。

我准备修复一下代码,应该能够避免这个错误的。请耐心等待。

---------

可能是你的操作系统的问题。请换用 ubuntu 9.04 来编译。ubuntu 的新版有 bug,无法编译。我目前编译 grub4dos,就是用 ubuntu 9.04。

$ gcc -v
使用内建 specs。
目标:i486-linux-gnu
配置为:../src/configure -v --with-pkgversion='Ubuntu 4.3.3-5ubuntu4' --with-bugurl=file:///usr/share/doc/gcc-4.3/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --enable-shared --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --enable-nls --with-gxx-include-dir=/usr/include/c++/4.3 --program-suffix=-4.3 --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-mpfr --enable-targets=all --with-tune=generic --enable-checking=release --build=i486-linux-gnu --host=i486-linux-gnu --target=i486-linux-gnu
线程模型:posix
gcc 版本 4.3.3 (Ubuntu 4.3.3-5ubuntu4)

暂时请使用 grub4dos 的新版本,chenall 在 googlecode 上发布的(用 google 搜索 chenall 即可找到)。如果有错误,我们改正后也对新版有好处。


或者,你直接用 msys(mingw)在 Windows 下编译,这都证明是成功的了。

编译 grub4dos 所用的 msys 环境从这里下载:

http://nufans.net/grub4dos/Other/

下载 msys.7z 解压就可以使用了。这就不会出现编译失败的问题了。

[ 本帖最后由 不点 于 2010-12-17 16:46 编辑 ]
作者: ekaromay    时间: 2010-12-17 17:43
呵呵,换了个linux平台后,用8楼里说的colinux编译通过了,但编译时./configure后面居然加任何参数,编译出来的文件居然都一样?configure脚本有问题?
作者: 不点    时间: 2010-12-17 18:08
你还是试试最新的 grub4dos 吧。

或者你修改 build 脚本。

我不知道 netboot 里头的东西要如何才能使用。你再研究一下 gnu grub 的文档,看看如何使用 netboot 特性。
作者: ekaromay    时间: 2010-12-17 19:32
看来不能使用最新的grub4dos,反而要用2007年4月以前的代码才能成功编译,幸好还懂点c代码,发现tftp_read函数现在是3个参数,似乎以前的是两个参数,netboot的代码可能在grub4dos正式支持pxe后不知道被谁改成了3个参数,就这样被废弃了,想问下2007年4月左右的grub4dos能用map --mem虚拟磁盘这个功能了吗?哪里有2007年4月以前的代码下载?
作者: roytam1    时间: 2010-12-17 20:00
原帖由 ekaromay 于 2010-12-17 19:32 发表
看来不能使用最新的grub4dos,反而要用2007年4月以前的代码才能成功编译,幸好还懂点c代码,发现tftp_read函数现在是3个参数,似乎以前的是两个参数,netboot的代码可能在grub4dos正式支持pxe后不知道被谁改成了3个参 ...


svn http://svn.gna.org/svn/grub4dos/trunk 中有,Revision 31是07年3月31日的。
另外 http://download.gna.org/grub4dos/old/ 有舊版源碼打包。

[ 本帖最后由 2010roytam1 于 2010-12-17 20:07 编辑 ]
作者: 不点    时间: 2010-12-17 20:27
unsigned long long tftp_read (unsigned long long buf, unsigned long long len, unsigned long write);

最后的这个 write 参数是我添加的。所有的文件系统 read 函数都添加了。为的是能够 write 一个文件。


查看 ChangeLog 可知,2005 年已经实现 --mem :

  1. 2005-02-06 version 0.4.0pre
  2.         Switched to GNU GRUB 0.96
  3.         The --mem option of MAP command was added for memdrive emulation.
复制代码

[ 本帖最后由 不点 于 2010-12-17 20:33 编辑 ]
作者: ekaromay    时间: 2010-12-17 23:50
终于解决了,自行编译成功了,其实主要还是在源码的netboot文件夹下fsys_tftp.c里的tftp_read的参数由两个改回三个后,用./configure --enable-(网卡名)和make就可以编译出来了,幸好代码不太复杂,只需要改一次而已,而且最新的grub4dos也能编译,不用非得要几年前的代码

希望不点能对fsys_tftp.c打个补丁吧,虽然netboot支持没什么人用,其实也挺好用的,比etherboot那些模块要外部引导来说,集成在里面占的空间也少点,也更灵活
作者: 不点    时间: 2010-12-18 02:50
我已经制作了一个补丁 grub4dos_r91.diff 上载到 http://nufans.net/grub4dos/tinybit/ 了,请 chenall 把补丁打上。
作者: chenall    时间: 2010-12-18 17:03
试了一下在最新版上打补丁编译成功,但没办法使用,使用QEMU测试,一使用BOOTP或DHCP命令就直接重启..
作者: 不点    时间: 2010-12-18 17:25
那就需要你把 bug 再找出来吧。估计又是 long 和 long long 互相转化的问题。

也可以让 ekaromay 来排除 bug。
作者: 2012_aozima    时间: 2012-9-24 22:29
谁能给我也发一个?
我用于开发实时系统,方便加载程序。不然得想load个文件过来很困难。
机器的PXE貌似不能用,但网卡是好的(8139)。
编译GRUB 0.97在GCC4下面configure不过,说是需要GCC3。
但在ubuntu下安装gcc3工作不正常。
于是找了张LFS的光盘进去编译,但开始网络功能后也编译不过。
先偷个懒,谁能发我个编译好的能用的?




欢迎光临 无忧启动论坛 (http://bbs.wuyou.net/) Powered by Discuz! X3.3