Ubuntu PXE Install
Contents
Howto
Installing Ubuntu or Debian via PXE network boot is the way to go if you have no cd-r at hand, or if you have no cdrom drive on the machine to be installed.
Install services
You need the following packages:
- tftpd-hpa
- dhcp3-server
- netkit-inetd
sudo apt-get install tftpd-hpa dhcp3-server netkit-inetd
Note: On Gutsy (7.10) and Debian Etch netkit-inetd is a "virtual package". Either inetutils-inetd or openbsd-inetd must be chosen. On one system, openbsd-inetd is already installed - the default now?
Prepare your tftp server
Start your tftpd server via inetd after adding the following line in /etc/inetd.conf:
tftp dgram udp wait root /usr/sbin/in.tftpd /usr/sbin/in.tftpd -s /var/lib/tftpboot
sudo update-inetd --enable BOOT
Don't forget to create the tftp directory /var/lib/tftpboot (if it hasn't already been created)
On Ubuntu 6.06 Server and Feisty Fawn 7.04 (or if /etc/inetd.conf doesn't exist) you might edit /etc/default/tftpd-hpa:
RUN_DAEMON="yes" OPTIONS="-l -s /var/lib/tftpboot"
Prepare your dhcp-server
On what network interfaces should the DHCP server (dhcpd) serve DHCP requests? Answer this question by editing the line in /etc/default/dhcp3-server file. Separate multiple interfaces with spaces, e.g. "eth0 eth1". Eg:
INTERFACES="eth1 eth2"
If you have a working dhcp server add the following lines to your group in /etc/dhcpd.conf file (or, from Etch and Feisty upward, the /etc/dhcp3/dhcpd.conf file), substituting IP and MAC address as needed. Beware not to forget the semicolons (";") at the end of lines.
host pxeinstall { # ie. "hardware ethernet 00:0A:E4:2E:A6:42;" hardware ethernet [MAC address of PXE client networkcard, without brackets]; # this is the unused IP address we will assign temporarily to the PXE client fixed-address 10.0.0.16; # Not needed if the tftp server is on the same host as the DHCP server. ie. "next-server 10.0.0.2;". next-server [ip-address of the server serving tftp]; # path of the bootloader file, relative to tftpd's root filename "pxelinux.0"; }
You need to assign the client an IP address in the same subnet as the address of the server running tftpd. For example, if your server's address is 192.168.2.13, you should assign your client an IP address that begins with 192.168.2.x, NOT 192.168.0.x .
The "next-server" stanza tells the PXE boot client where to look for the boot image and associated data. It is required in newer editions of tftpd-hpa, if not on the same machine as the DHCP server.
Then start your dhcp server:
/etc/init.d/dhcp3-server start
And verify it runs (if not, you've a problem in the dhcpd config file):
ps ax | grep dhcpd
Prepare netboot files
Get and install the files
All the files you need are on the install media, or you can get them from internet:
- For Ubuntu Dapper 6.06, Edgy 6.10, Feisty 7.04, Gutsy 7.10, Hardy 8.04.
- For Debian : Sarge 3.1, Etch 4.0, Lenny 4.1.
Download and put the netboot directory content at the root of the tftpd's served /var/lib/tftpboot/ directory:
cd /var/lib/tftpboot/ lftp -c "open http://archive.ubuntu.com/ubuntu/dists/hardy/main/installer-i386/current/images/netboot/; mirror" # then untar the pxeboot.tar.gz (this step is NOT needed anymore, as of Feisty) tar xfz pxeboot.tar.gz
If Ubuntu is in your cdrom drive:
mount /media/cdrom cp -a /media/cdrom/install/netboot/* /var/lib/tftpboot/
pxe bootloader config
In the pxelinux.cfg/ directory, make a symlink named after the pxe boot client's mac address (without the colons), and pointing to the "default" config file:
# ie. if our client mac address is 00:0A:E4:2E:A6:42, we'll do: ln -s /var/lib/tftpboot/pxelinux.cfg/default /var/lib/tftpboot/pxelinux.cfg/000AE42EA642
For very old distros versions, you may need to edit or patch pxelinux.cfg/default . This modification is NOT needed anymore (at least from Feisty or Etch and up).
--- default.org 2004-10-31 15:32:32.000000000 +0100 +++ default 2004-10-31 00:14:52.000000000 +0200 @@ -13,17 +13,11 @@ F0 debian-installer/boot-screens/f10.txt label linux - kernel debian-installer/linux - append vga=normal initrd=debian-installer/initrd.gz ramdisk_size=11057 root=/dev/rd/0 devfs=mount,dall rw -- + kernel vmlinuz + append vga=normal initrd=initrd.gz ramdisk_size=11057 root=/dev/rd/0 devfs=mount,dall rw -- label expert - kernel debian-installer/linux - append DEBCONF_PRIORITY=low vga=normal initrd=debian-installer/initrd.gz ramdisk_size=11057 root=/dev/rd/0 devfs=mount,dall rw -- -label custom - kernel debian-installer/linux - append ubuntu/install-type=custom vga=normal initrd=debian-installer/initrd.gz ramdisk_size=11057 root=/dev/rd/0 devfs=mount,dall rw -- -label custom-expert - kernel debian-installer/linux - append ubuntu/install-type=custom DEBCONF_PRIORITY=low vga=normal initrd=debian-installer/initrd.gz ramdisk_size=11057 root=/dev/rd/0 devfs=mount,dall rw -- + kernel vmlinuz + append DEBCONF_PRIORITY=low vga=normal initrd=initrd.gz ramdisk_size=11057 root=/dev/rd/0 devfs=mount,dall rw -- prompt 1 timeout 0
Directory layout
Should look like this, more or less (depending on the Ubuntu or Debian installer version used):
/var/lib/tftpboot/ /var/lib/tftpboot/pxelinux.0 /var/lib/tftpboot/initrd.gz /var/lib/tftpboot/mini.iso /var/lib/tftpboot/debian-installer /var/lib/tftpboot/debian-installer/linux /var/lib/tftpboot/debian-installer/initrd.gz /var/lib/tftpboot/debian-installer/boot-screens /var/lib/tftpboot/debian-installer/boot-screens/splash.rle /var/lib/tftpboot/debian-installer/boot-screens/f1.txt /var/lib/tftpboot/debian-installer/boot-screens/f2.txt /var/lib/tftpboot/debian-installer/boot-screens/f3.txt /var/lib/tftpboot/debian-installer/boot-screens/f4.txt /var/lib/tftpboot/debian-installer/boot-screens/f5.txt /var/lib/tftpboot/debian-installer/boot-screens/f6.txt /var/lib/tftpboot/debian-installer/boot-screens/f7.txt /var/lib/tftpboot/debian-installer/boot-screens/f8.txt /var/lib/tftpboot/debian-installer/boot-screens/f9.txt /var/lib/tftpboot/debian-installer/boot-screens/syslinux.txt /var/lib/tftpboot/debian-installer/boot-screens/f10.txt /var/lib/tftpboot/initrd.list /var/lib/tftpboot/vmlinuz /var/lib/tftpboot/pxelinux.cfg /var/lib/tftpboot/pxelinux.cfg/default /var/lib/tftpboot/pxelinux.cfg/000AE42EA642
In more detail we need to provide:
- a bootloader, which name (or path relative to tftpd's served directory, here /var/lib/tftpboot) is mentioned in the dhcpd.conf file (pxelinux.0)
- a configuration file for the bootloader (default for all clients, or mac specific)
- a kernel with an initrd file (vmlinuz,initrd.gz)
- an image of the base system (mini.iso)
Start the PXE client
Just boot up the computer that will use DHCP and then PXE to get the images, if something isn't working you can use a sniffer on your install server to check, and look at log files for daemons misconfigurations.
tethereal -R bootp tethereal port tftp sudo tcpdump -s 1600 -neeevvvX 'proto (\udp or \tcp) and port (67 or 68 or 69)' tail /var/log/daemon.log
Optional: setup an archive mirror
With the previous setup, Ubuntu or Debian will download install packages straight over the internet. If you prefer to run your network installs over a private network and use your own Ubuntu or Debian mirror you can do the following:
sudo apt-get install apt-mirror
Then write an /etc/apt/mirror.list configuration file, eg.:
Example for Ubuntu dapper:
set base_path /var/spool/apt-mirror/ deb http://gb.archive.ubuntu.com/ubuntu/ dapper main restricted deb http://gb.archive.ubuntu.com/ubuntu/ dapper main/debian-installer deb http://gb.archive.ubuntu.com/ubuntu/ dapper main restricted/debian-installer
Example for Debian Etch:
set base_path /var/spool/apt-mirror/ deb http://ftp.us.debian.org/debian etch main contrib non-free deb http://security.debian.org/debian-security etch/updates main contrib non-free deb http://ftp.us.debian.org/debian etch main/debian-installer
Then:
mkdir -p /var/spool/apt-mirror/{mirror,var,skel} apt-mirror
This will replicate the mirror to your chosen base path. You will need to create the soft links to the dists and pool directories yourself, eg.:
~$ ls -al /var/spool/apt-mirror/mirror/ total 24 drwxr-xr-x 5 root root 4096 May 18 12:46 . drwxrwxrwx 11 root root 4096 May 18 12:27 .. lrwxrwxrwx 1 root root 34 May 18 12:46 dists -> gb.archive.ubuntu.com/ubuntu/dists drwxr-xr-x 3 root root 4096 May 18 12:46 gb.archive.ubuntu.com lrwxrwxrwx 1 root root 33 May 18 12:46 pool -> gb.archive.ubuntu.com/ubuntu/pool drwxr-xr-x 3 root root 4096 May 18 10:53 skel drwxr-xr-x 2 root root 8192 May 18 13:27 var
- Serve the /var/spool/apt-mirror/ directory out with apache
- When you boot the ubuntu/debian network installer, point it at the IP address and the 'mirror' directory.