This post is not about doing a PXE-based network installation of Ubuntu. There are already many posts describing how to do this. This post is about setting up an Ubuntu workstation in diskless mode, such as the workstation boots via PXE and the root filesystem is mounted over NFS.
The process consists on the following main steps:
- Setting up the DHCP server
- Setting up the TFTP server and configuring PXE boot
- Setting up the NFS server
- Bootstrapping a Ubuntu installation into the client’s root filesystem
- Booting up the diskless workstation
1. Setting up the DHCP server
PXE-enabled workstations need to get an additional option during the DHCP negotiation that will point them to a TFTP server where the PXE-compatible boot loader code can be downloaded. Configuring dnsmasq
to hand this option to clients is just as easy as adding the following line to /etc/dnsmasq.conf
:
dhcp-boot=pxelinux.0,tftp.lan,10.42.242.13
and restarting the dnsmasq
service.
2. Setting up the TFTP server and configuring PXE boot
Now that DHCP has been configured, the next step is setting up the TFTP server. The TFTP server will be used by PXE-compatible clients to download the PXE boot loader code, and also the Linux kernel and Linux initial RAM disk.
I will use H. P. Anvin’s TFTP server as it’s widely used and works fairly well:
root@tftp.lan:# apt-get install tftpd-hpa
tftpd-hpa
does not integrate automatically with xinetd
so if you want to run the TFTP server under xinetd
, you will have to create the following file, which was ported from the inetd
description that is created automatically in /etc/inetd.conf
when tftpd-hpa
is installed:
service tftp { disable = no id = chargen-dgram socket_type = dgram protocol = udp user = root wait = yes server = /usr/sbin/in.tftpd server_args = -s /var/lib/tftpboot/ }
then restarting the xinetd
service.
Configuring PXE boot is just a matter of copying the PXE boot loader code, a configuration file, the Linux kernel and initial RAM disks under the TFTP root. First, install syslinux
and copy the PXE boot loader code to the TFTP server root:
root@tftp.lan:# apt-get install syslinux root@tftp.lan:# cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftpboot/ root@tftp.lan:# mkdir /var/lib/tftpboot/pxelinux.cfg
The Linux PXE boot loader code, syslinux
, expects that a configuration file describing what kernel, its boot parameters, and the initial RAM disk to use to be stored within a directory named pxelinux.cfg
just under the TFTP server root.
Client-specific config files can be created (based on the client MAC address, for example). We will create a config file that is suitable for any client. This configuration file is called default
and can be created by running the following commands:
root@tftp.lan:# KERNEL_VERSION=2.6.22-14-generic root@tftp.lan:# NFS_IPADDR=$(host nfs.lan | cut -d' ' -f4) root@tftp.lan:# cat > /var/lib/tftpboot/pxelinux.cfg/default << EOF > LABEL linux > KERNEL vmlinuz-${KERNEL_VERSION} > APPEND root=/dev/nfs initrd=initrd.img-${KERNEL_VERSION} nfsroot=${NFS_IPADDR}:/home/nfsroot ip=dhcp rw > EOF
3. Setting up the NFS server
In this step, we will configure the NFS server and export the directory where the client’s root filesystem will be stored.
Let’s start by installing the NFS server packages:
root@nfs.lan:# apt-get install nfs-kernel-server nfs-common
I will use /home/nfsroot
as the root for the client’s root filesystem
root@nfs.lan:# mkdir /home/nfsroot
Next, add the following line to /etc/exports
in order to export the the client’s root filesystem:
/home/nfsroot *,gss/krb5(rw,no_subtree_check,async,no_root_squash)
Then re-export all the filesystems:
root@nfs.lan:# exportfs -avr
4. Bootstrapping a Ubuntu installation into the client’s root filesystem
The following steps will bootstrap the installation of a minimal Ubuntu Hardy Heron GNU/Linux system into the client’s root:
root@nfs.lan:# debootstrap --arch i386 hardy /home/nfsroot http://ch.archive.ubuntu.com/ubuntu/
Only the minimum required packages will be downloaded from the Internet and installed into /home/nfsroot
. The output of the previous command should look like this:
I: Retrieving Release I: Retrieving Packages I: Validating Packages I: Resolving dependencies of required packages... I: Resolving dependencies of base packages... I: Found additional required dependencies: libdb4.6 I: Checking component main on http://ch.archive.ubuntu.com/ubuntu... I: Retrieving adduser I: Validating adduser ... I: Base system installed successfully.
Once the system has been bootstrapped, we need to populate fstab
. At least, /proc
and /
must get mounted, but other filesystems might be referenced in this file too, like additional NFS exports, swap files, and so on. The difference with respect a traditional, disk-based Ubuntu installation, is that the root filesystem gets mounted via NFS by the intial RAM disk, and is referenced by the kernel’s /dev/nfs
block device.
The contents of /home/nfsroot/etc/fstab
should look like this:
# /etc/fstab: static file system information. # # <file system> <mount point> <type> <options> <dump> <pass> proc /proc proc defaults 0 0 /dev/nfs / nfs defaults 0 0
Another difference with a traditional Ubuntu system is that we don’t want the network interfaces be managed by Network Manager. In fact, the main (probably Ethernet) network interface was already configured by the kernel based on PXE’s supplied configuration. Letting Nework Manager reconfigure or manage this network interface might mean losing the connection to the NFS server and, thus, rendering the system unusable.
To stop Network Manager from managing the main network interface, the contents of /home/nfsroot/etc/network/interfaces
must look like this:
# Used by ifup(8) and ifdown(8). See the interfaces(5) manpage or # /usr/share/doc/ifupdown/examples for more information. # The loopback network interface auto lo iface lo inet loopback # The primary network interface, commented out for NFS root iface eth0 inet manual
Finally, we will give the client a generic name. This can be done by storing that generic name into /etc/hostname:
root@nfs.lan:# echo client.lan > /home/nfsroot/etc/hostname
Booting up the diskless workstation
Once everything is set up, the last thing to do is testing that the diskless workstation is able to boot via PXE. The mechanics of booting via PXE depend on the machine. On some machines, it’s just a matter of pressing ESC to get into a menu that allows to override the boot device. On others, the same can be done by pressing F12 during the POST. On most modern systems it’s possible to reconfigure the system to always boot from the network.
If the client is able to boot from PXE successfully, this is what you will briefly see on your screen:
CLIENT MAC ADDR: 00 11 22 33 44 55 66 GUID: 00000000 0000 0000 0000 000000000000 CLIENT IP: 192.168.0.2 MASK: 255.255.255.0 DHCP IP: 192.168.0.1 GATEWAY IP: 192.168.0.1 PXELNUX 3.36 Debian-2007-08-30 Copyright (C) 1994-2007 H. Peter Anvin UNDI data segment at: 00094140 UNDI data segment size: 94B0 UNDI code segment at: 0009D5F0 UNDI code segment size: 20B0 PXE entry point found (we hope) at 9D5F:0106 My IP address seems to be C0A80001 192.168.0.2 ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255.0 TFTP prefix: Tring to load: pxelinux.cfg/00-01-02-03-04-05 Tring to load: pxelinux.cfg/C0A80001 Tring to load: pxelinux.cfg/C0A8000 Tring to load: pxelinux.cfg/C0A800 Tring to load: pxelinux.cfg/C0A80 Tring to load: pxelinux.cfg/C0A8 Tring to load: pxelinux.cfg/C0A Tring to load: pxelinux.cfg/C0 Tring to load: pxelinux.cfg/C Tring to load: pxelinux.cfg/default boot: Loading vmlinuz...
If the system boots up, we will be dropped into a text-mode console where we can log in as root
with no password. Of course, the first thing you should do is creating a password for the root
user, but if you have been able to get to this point, you probably know how to do it 🙂
Once you are logged in as your in your new diskless workstation, you will probably want to add more functionality. For example, installing the OpenSSH server, or the packages for the typical Ubuntu desktop system. Before you do that, we will need to add more Ubuntu repositories to /etc/apt/sources.list
. This is how mine looks like:
deb http://ch.archive.ubuntu.com/ubuntu/ feisty main restricted deb-src http://ch.archive.ubuntu.com/ubuntu/ feisty main restricted deb http://ch.archive.ubuntu.com/ubuntu/ feisty-updates main restricted deb-src http://ch.archive.ubuntu.com/ubuntu/ feisty-updates main restricted deb http://ch.archive.ubuntu.com/ubuntu/ feisty universe deb-src http://ch.archive.ubuntu.com/ubuntu/ feisty universe deb http://ch.archive.ubuntu.com/ubuntu/ feisty multiverse deb-src http://ch.archive.ubuntu.com/ubuntu/ feisty multiverse deb http://ch.archive.ubuntu.com/ubuntu/ feisty-backports main restricted universe multiverse deb-src http://ch.archive.ubuntu.com/ubuntu/ feisty-backports main restricted universe multiverse deb http://security.ubuntu.com/ubuntu feisty-security main restricted deb-src http://security.ubuntu.com/ubuntu feisty-security main restricted deb http://security.ubuntu.com/ubuntu feisty-security universe deb-src http://security.ubuntu.com/ubuntu feisty-security universe deb http://security.ubuntu.com/ubuntu feisty-security multiverse deb-src http://security.ubuntu.com/ubuntu feisty-security multiverse
Finally, I decided to install OpenSSH, OpenNTPD and the typical Ubuntu desktop:
root@client.lan:# apt-get update root@client.lan:# apt-get install openssh-server openntpd ubuntu-desktop
Thanks for this nice guide 🙂
One note, I didnt get it to boot in the final phase (didnt manage to mount nfs volume) until I changed:
/home/nfsroot *,gss/krb5(rw,no_subtree_check,async,no_root_squash)
to
/home/nfsroot/ *,(rw,no_subtree_check,async,no_root_squash)
Pingback: debootstrap under ubuntu at friendlyhobo
First of all these are great directions. I was able to do all of this is a little of 30 minutes without too much grief. My problem is that everything is installed without error (at least none that are reported) but when I boot up the client, it never connects or anything. Any suggestions that I should check as to why the client isn’t taking to the server?
Thanks!
Howdy would you mind letting me know which hosting company you’re utilizing? I’ve loaded your blog in 3 different internet browsers and I must say this blog loads a lot quicker then most. Can you suggest a good internet hosting provider at a honest price? Thanks a lot, I appreciate it!
Have a look into all the crazy feedback posted most appropriate right here, as if they are not honestly hear to what the posting are already stating, I’m sort of upset, i guess the writer hasn’t realistically had the time to review them.
1 way of measuring camaraderie comprises not necessarily from the amount of words which pals could talk about, in how many words and phrases they desire no more mention.