Difference between pages "Icecream" and "Pxe"

From Linuxintro
(Difference between pages)
imported>WikiSysop
 
imported>ThorstenStaerk
 
Line 1: Line 1:
Icecream is a software suite that allows you to build up a compile cluster. The goal is to speed up compiling by distributing the jobs over several computers. To do that, you need one compile-driver (the scheduler) and one or more slaves (daemons).
+
'''PXE''' stands for '''P'''reboot E'''x'''ecution '''E'''nvironment. It is used to boot a computer using booting information from over the network.
  
= Install it =
+
= Overview =
To install icecream on SUSE, enter into a konsole:
+
The typical PXE boot looks like this:
yast -i icecream icecream-monitor
+
# Computer ''A'' starts. Its [http://en.wikipedia.org/wiki/BIOS BIOS] is set to do a PXE boot, so booting from the [[network]].
Make sure your firewall is stopped:
+
# Computer ''A'' acquires an IP address from [[dhcp]] server ''B''.
rcSuSEfirewall2 stop
+
# Computer ''A'' downloads its booting files ([[initrd]] and kernel) via [[tftp]] from ''B''.
Icecream brings an own gcc executable with it, and you have to use this for a distributed compile. So, change your PATH variable so icecream's gcc is found before gnu's gcc:
+
# Computer ''A'' executes the kernel just as if it had from its local [[hard disk]].
export PATH=/opt/icecream/bin:$PATH
 
and make this change persistent:
 
echo "export PATH=/opt/icecream/bin:$PATH" >> /etc/profile
 
  
= Run it =
+
= How to start =
On every slave, start the daemon:
+
In this example we use SUSE Linux 12.1.
export PATH=/opt/icecream/bin:$PATH
 
iceccd -d
 
On your driver, start the scheduler:
 
export PATH=/opt/icecream/bin:$PATH
 
scheduler -d
 
  
= What happens =
+
== DHCP ==
The daemon opens a socket on port 10245 and waits for requests to compile. You can check this with the following commands:
+
To allow your computers to boot from the network, they first need an IP address. So, [[set up a dhcp-server]]. Make sure /etc/dhcpd.conf contains the following lines:
 +
allow booting;
 +
allow bootp;
 +
authoritative; # I am the one and only here
 +
Make sure your "subnet" section contains the following lines:
 +
next-server ''192.168.0.5'';
 +
filename "pxelinux.0";
 +
Make sure you have restarted your dhcpd:
 +
/etc/init.d/dhcpd restart
  
Show what ports are used by iceccd
+
== TFTP ==
  duffman:/opt/icecream/bin # lsof -i | grep iceccd
+
After your computers have received their IP address, they start asking for their booting file from the TFTP-server, in this case ''192.168.0.5''. So, make sure they can get it.
  iceccd    13193      root    8u IPv4 119567      0t0 TCP *:10245 (LISTEN)
+
* [[Install]] tftp and syslinux:
  [...]
+
  # yast -i tftp syslinux
Show that port 10245 is really open
+
* copy syslinux' pxelinux.0 to /srv/tftpboot/:
  duffman:/opt/icecream/bin # nmap -p10245 localhost
+
# rpm -ql syslinux | grep pxelinux.0
  [...]
+
/usr/share/syslinux/gpxelinux.0
  PORT      STATE SERVICE
+
/usr/share/syslinux/pxelinux.0
  10245/tcp open unknown
+
# cp /usr/share/syslinux/pxelinux.0 /srv/tftpboot/
  [...]
+
* Activate the tftp server. To do this, change /etc/xinetd.d/tftp. Replace
Kill your icecream daemon
+
  disable = yes
  duffman:/opt/icecream/bin # killall iceccd
+
with
Show the port is no longer open
+
  disable = no
  duffman:/opt/icecream/bin # nmap -p10245 localhost
+
Then restart xinetd which hosts tftpd:
  [...]
+
  /etc/init.d/xinetd restart
  PORT      STATE SERVICE
+
* Test it:
  10245/tcp closed unknown
+
  tftp ''192.168.0.5'' -c get pxelinux.0
  [...]
+
Test your configuration now by booting a connected computer from PXE. You should get an error message saying that the configuration file pxelinux.cfg/default has not been found.
 +
 
 +
== pxelinux.cfg/default ==
 +
Create a /srv/tftpboot/pxelinux.cfg/default like this:
 +
default linux
 +
timeout 0
 +
prompt 1
 +
display display.msg
 +
 +
  label linux
 +
  kernel vmlinuz
 +
  append initrd=initrd
 +
 
 +
* Now you must supply kernel (vmlinuz) and initrd into the tftp folder:
 +
cp /boot/vmlinuz /srv/tftpboot
 +
cp /boot/initrd /srv/initrd
 +
 
 +
== Change initial ramdisk ==
 +
If you now want to change the initrd to actually do something, you can do it like this:
 +
cd /srv/tftpboot
 +
mkdir tmp
 +
cd tmp
 +
  cp ../initrd ./initrd.gz
 +
gunzip initrd.gz
 +
mkdir tmp2
 +
  cd tmp2
 +
  [[cpio]] -id < ../initrd
 +
Do the needed changes now in this folder. Then pack the initrd again:
 +
  [[find]] . | cpio --create --format='newc' > ../newinitrd
 +
  cd ..
 +
[[gzip]] newinitrd
 +
Your new [[initrd]] is now called newinitrd.gz.
 +
 
 +
== Basic setup ==
 +
The goal here is to be able to boot a Linux shell from PXE.
 +
 
 +
For this I took the initrd and kernel from the SUSE 12.1 install DVD and modified the initrd. I replaced /init on the initrd by /bin/bash. Then I copied busybox to /bin. Then I booted from PXE. Then I mounted /proc:
 +
mount -t proc proc /proc
 +
 
 +
== RIP ==
 +
cd /srv
 +
  wget http://www.tux.org/pub/people/kent-robotti/looplinux/rip/RIPLinuX-13.7.PXE.zip
 +
unzip RIPLinux-11.3-non-X.PXE.zip
 +
 
 +
== Ubuntu 10.04 ==
 +
The links are valid as of 2012-12-14.
 +
sudo su -
 +
apt-get install tftpd-hpa
 +
  wget http://ftp.debian.org/debian/dists/wheezy/main/installer-i386/current/images/netboot/netboot.tar.gz
 +
  [[tar]] xvzf netboot.tar.gz
 +
sed -i 's/BOOT=local/BOOT=nfs/'  /etc/initramfs-tools/initramfs.conf
 +
  mkinitramfs -o /boot/initrd-netboot.img
 +
  cp /boot/vmlinuz-2.6.32-33-generic /var/lib/tftpboot/
 +
  cp /boot/initrd-netboot.img /var/lib/tftpboot/
 +
  apt-get install dhcp3-server
 +
cat >dhcpd.conf <<EOF
 +
option domain-name "mydomain.org";
 +
option domain-name-servers 8.8.8.8;
 +
option routers 192.168.178.1;
 +
allow booting;
 +
allow bootp;
 +
authoritative; # I am the one and only here
 +
 +
ddns-update-style none;
 +
default-lease-time 14400;
 +
subnet 192.168.178.0 netmask 255.255.255.0 {
 +
  range 192.168.178.10 192.168.178.20;
 +
  default-lease-time 14400;
 +
  max-lease-time 172800;
 +
  next-server 192.168.178.11;
 +
  filename "pxelinux.0";
 +
}
 +
EOF
 +
/etc/init.d/dhcp3-server start
  
 
= See also =
 
= See also =
* http://en.opensuse.org/Icecream
+
* [[nFs]]
 +
* [http://en.wikipedia.org/wiki/Preboot_Execution_Environment Wikipedia on PXE]
 +
* http://www.digitalpeer.com/id/linuxnfs
 +
* http://www.jukie.net/bart/blog/nfsroot-on-debian
 +
* https://wiki.xkyle.com/Building_A_PXE_Server#Rip
 +
* http://www.pixelchaos.net/2009/02/15/diskless-booting-with-pxe-and-nfs/
 +
 
 +
[[Category:Networking]]
 +
[[Category:Boot]]
 +
[[Category:Guides]]

Revision as of 09:45, 14 December 2012

PXE stands for Preboot Execution Environment. It is used to boot a computer using booting information from over the network.

Overview

The typical PXE boot looks like this:

  1. Computer A starts. Its BIOS is set to do a PXE boot, so booting from the network.
  2. Computer A acquires an IP address from dhcp server B.
  3. Computer A downloads its booting files (initrd and kernel) via tftp from B.
  4. Computer A executes the kernel just as if it had from its local hard disk.

How to start

In this example we use SUSE Linux 12.1.

DHCP

To allow your computers to boot from the network, they first need an IP address. So, set up a dhcp-server. Make sure /etc/dhcpd.conf contains the following lines:

allow booting;
allow bootp;
authoritative; # I am the one and only here

Make sure your "subnet" section contains the following lines:

next-server 192.168.0.5;
filename "pxelinux.0";

Make sure you have restarted your dhcpd:

/etc/init.d/dhcpd restart

TFTP

After your computers have received their IP address, they start asking for their booting file from the TFTP-server, in this case 192.168.0.5. So, make sure they can get it.

# yast -i tftp syslinux
  • copy syslinux' pxelinux.0 to /srv/tftpboot/:
# rpm -ql syslinux | grep pxelinux.0
/usr/share/syslinux/gpxelinux.0
/usr/share/syslinux/pxelinux.0
# cp /usr/share/syslinux/pxelinux.0 /srv/tftpboot/
  • Activate the tftp server. To do this, change /etc/xinetd.d/tftp. Replace
disable = yes

with

disable = no

Then restart xinetd which hosts tftpd:

/etc/init.d/xinetd restart
  • Test it:
tftp 192.168.0.5 -c get pxelinux.0

Test your configuration now by booting a connected computer from PXE. You should get an error message saying that the configuration file pxelinux.cfg/default has not been found.

pxelinux.cfg/default

Create a /srv/tftpboot/pxelinux.cfg/default like this:

default linux
timeout 0
prompt 1
display display.msg

label linux
  kernel vmlinuz
  append initrd=initrd
  • Now you must supply kernel (vmlinuz) and initrd into the tftp folder:
cp /boot/vmlinuz /srv/tftpboot
cp /boot/initrd /srv/initrd

Change initial ramdisk

If you now want to change the initrd to actually do something, you can do it like this:

cd /srv/tftpboot
mkdir tmp
cd tmp
cp ../initrd ./initrd.gz
gunzip initrd.gz
mkdir tmp2
cd tmp2
cpio -id < ../initrd

Do the needed changes now in this folder. Then pack the initrd again:

find . | cpio --create --format='newc' > ../newinitrd
cd ..
gzip newinitrd

Your new initrd is now called newinitrd.gz.

Basic setup

The goal here is to be able to boot a Linux shell from PXE.

For this I took the initrd and kernel from the SUSE 12.1 install DVD and modified the initrd. I replaced /init on the initrd by /bin/bash. Then I copied busybox to /bin. Then I booted from PXE. Then I mounted /proc:

mount -t proc proc /proc

RIP

cd /srv
wget http://www.tux.org/pub/people/kent-robotti/looplinux/rip/RIPLinuX-13.7.PXE.zip
unzip RIPLinux-11.3-non-X.PXE.zip

Ubuntu 10.04

The links are valid as of 2012-12-14.

sudo su -
apt-get install tftpd-hpa
wget http://ftp.debian.org/debian/dists/wheezy/main/installer-i386/current/images/netboot/netboot.tar.gz
tar xvzf netboot.tar.gz
sed -i 's/BOOT=local/BOOT=nfs/'  /etc/initramfs-tools/initramfs.conf
mkinitramfs -o /boot/initrd-netboot.img
cp /boot/vmlinuz-2.6.32-33-generic /var/lib/tftpboot/
cp /boot/initrd-netboot.img /var/lib/tftpboot/
apt-get install dhcp3-server
cat >dhcpd.conf <<EOF
option domain-name "mydomain.org";
option domain-name-servers 8.8.8.8;
option routers 192.168.178.1;
allow booting;
allow bootp;
authoritative; # I am the one and only here 

ddns-update-style none;
default-lease-time 14400;
subnet 192.168.178.0 netmask 255.255.255.0 {
  range 192.168.178.10 192.168.178.20;
  default-lease-time 14400;
  max-lease-time 172800;
  next-server 192.168.178.11;
  filename "pxelinux.0";
}
EOF
/etc/init.d/dhcp3-server start

See also