Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
soc:2009:pravin:journal:pxekniferomomatic [2009/06/04 09:14] less1 |
soc:2009:pravin:journal:pxekniferomomatic [2009/06/04 14:47] (current) less1 |
||
---|---|---|---|
Line 5: | Line 5: | ||
provide pxe images/rom/nic with gpxe script embedded. This script will connect to pxeknife server to get boot loader. | provide pxe images/rom/nic with gpxe script embedded. This script will connect to pxeknife server to get boot loader. | ||
+ | |||
===== Implementation ===== | ===== Implementation ===== | ||
+ | Actual working implementation is described [[PxeKnifeRomOMaticHTTP|here]] | ||
In file rom-o-matic/build.php the image is compiled by following command | In file rom-o-matic/build.php the image is compiled by following command | ||
Line 15: | Line 17: | ||
I have modified it to compile with embedded image by modifying above code with | I have modified it to compile with embedded image by modifying above code with | ||
<code> | <code> | ||
- | make -C '$dir' EMBEDDED_IMAGE=./pxeDHCP.gpxe '$target' | + | make -C '$dir' EMBEDDED_IMAGE=./pxeDHCP.gpxe,./pxeSTATIC.gpxe '$target' |
</code> | </code> | ||
Line 23: | Line 25: | ||
echo "Hi, We will be using PXEKnife from URL http://www.alien.doesntexist.org/pxeknife" | echo "Hi, We will be using PXEKnife from URL http://www.alien.doesntexist.org/pxeknife" | ||
echo "It is assumed that you have dhcp networking" | echo "It is assumed that you have dhcp networking" | ||
+ | imgload pxeSTATIC.gpxe | ||
+ | imgstat | ||
+ | ifopen net0 | ||
+ | echo "Hit Control+C to cancel DHCP" | ||
+ | echo "You may want to do this if you want to use static-IP" | ||
+ | echo "Otherwise, it will try DHCP, and then anyway go to static-IP" | ||
+ | sleep 4 | ||
dhcp net0 | dhcp net0 | ||
- | set 209:string /pxeknife.cfg/default | + | set 209:string pxelinux.cfg/default |
set 210:string http://www.alien.doesntexist.org/pxeknife/ | set 210:string http://www.alien.doesntexist.org/pxeknife/ | ||
echo "Here we go" | echo "Here we go" | ||
chain http://www.alien.doesntexist.org/pxeknife/pxelinux.0 | chain http://www.alien.doesntexist.org/pxeknife/pxelinux.0 | ||
+ | echo "PxeKnife booting cancelled, using local disk instead.." | ||
</code> | </code> | ||
+ | and //./pxeSTATIC.gpxe// contains following script. | ||
+ | <code> | ||
+ | #!gpxe | ||
+ | echo "As you dont have DHCP, you need to give details about network configuration" | ||
+ | echo "Soon, you will be presented with interface to provide details about network configuration" | ||
+ | echo "Please provide, IP address, Netmask, Gateway and Router" | ||
+ | ifopen net0 | ||
+ | set net0/ip 10.0.2.15 | ||
+ | set net0/netmask 255.255.255.0 | ||
+ | set net0/gateway 10.0.2.2 | ||
+ | set net0/dns 10.0.2.3 | ||
+ | sleep 3 | ||
+ | config | ||
+ | set 209:string pxelinux.cfg/default | ||
+ | set 210:string http://www.alien.doesntexist.org/pxeknife/ | ||
+ | echo "Here we go" | ||
+ | chain http://www.alien.doesntexist.org/pxeknife/pxelinux.0 | ||
+ | echo "PxeKnife booting cancelled, using local disk instead.." | ||
+ | </code> | ||
+ | |||
+ | |||
The code is hosted at url [[http://www.alien.doesntexist.org/pxeknife/PHP/gpxe_generation/]] | The code is hosted at url [[http://www.alien.doesntexist.org/pxeknife/PHP/gpxe_generation/]] | ||
- | ===== Problems ===== | + | ===== Problems (solved) ===== |
When I boot using qemu with following command | When I boot using qemu with following command | ||
Line 57: | Line 88: | ||
Problem was that, qemu does not support all network drivers, and you need to tell qemu which device driver to emulate. | Problem was that, qemu does not support all network drivers, and you need to tell qemu which device driver to emulate. | ||
Following qemu command is working for rtl8139 | Following qemu command is working for rtl8139 | ||
+ | <code> | ||
+ | qemu -fda gpxe-git-rtl8139.dsk -net nic,model=rtl8139 -net user | ||
+ | </code> | ||
===== For static IP ===== | ===== For static IP ===== | ||
Line 62: | Line 96: | ||
When DHCP fails, static will pick up and continue execution. | When DHCP fails, static will pick up and continue execution. | ||
- | ==== Problem ==== | + | ==== Problem (solved) ==== |
Second script is not getting executed. | Second script is not getting executed. | ||
+ | I had to load the second script from first script using imgload | ||
+ | <code> | ||
+ | imgload pxeSTATIC.gpxe | ||
+ | </code> | ||
+ | Other than that, | ||
+ | I had to comment out the break statement in //core/main.c// inside function //main()// | ||
+ | there is a loop which iterate over each image. but there was a break, which had to be removed. | ||
+ | <code> | ||
+ | if ( have_images() ) { | ||
+ | for_each_image ( image ) { | ||
+ | image_exec ( image ); | ||
+ | /* break; */ /* commented so that second script will be executed -- pravin */ | ||
+ | } | ||
+ | } else { | ||
+ | </code> | ||
+ | Other change is done in //image/script.c// file inside function //script_exec()// where at end, it re-registers the script. | ||
+ | The second executable does not get executed when this line is there, so, I commented it out. | ||
+ | I am not sure what exactly is the problem, but my guess is that, \\ | ||
+ | re_register puts the script on top of the list, but older mapping where second script was loaded in memory gets messed up somehow. | ||
+ | <code> | ||
+ | rc = 0; | ||
+ | done: | ||
+ | /* Re-register image and return */ | ||
+ | register_image ( image ); /* commented so that next one will be executed -- pravin */ | ||
+ | return rc; | ||
+ | } | ||
+ | |||
+ | </code> | ||