User Tools

Site Tools



Updated for Ubuntu Natty Narwhal 11.04

This page details the actions that I followed to create a network bootable copy of Ubuntu that was suitable for using in an internet cafe. The instructions show how to set up the server to serve a copy of the CD over NFS, along with the required network boot options, so that any client on the network can use Live Ubuntu just by network booting.

The instructions are written as a reminder for me on how to do it, but hopefully they are clear enough for anyone else to use. Feel free to update them to make it clearer!

Set up server for NFS booting

I make the assumption that the server runs Debian, but any server should do the job with the right packages.

Install required packages

  • apt-get install tftpd-hpa
  • apt-get install syslinux
  • apt-get install nfs-kernel-server

Set up export images

  • mkdir -p /srv/ubuntu/casper
  • Copy filesystem.squashfs file from casper directory on Ubuntu live CD into /srv/ubuntu/casper/ (this will be customised later)
  • Edit /etc/exports and add
  • cp /usr/lib/syslinux/pxelinux.0 /srv/tftp
  • mkdir /srv/tftp/pxelinux.cfg
  • Create the file /srv/tftp/pxelinux.cfg/default:
DEFAULT netboot

LABEL netboot
KERNEL vmlinuz
APPEND noapic initrd=initrd.lz lang=uk nfsroot= netboot=nfs root=/dev/nfs boot=casper
  • Copy initrd.lz and vmlinuz from casper directory on Ubuntu CD into /srv/tftp/
  • Restart the NFS server /etc/init.d/nfs-kernel-server restart
  • Start the TFTP server /etc/init.d/tftpd-hpa start

Explicitly specify port numbers (optional)

If you want to close all the ports on your server, but open up the required ones for NFS, then you will need to fix the port numbers that NFS uses. To do this, do the following:

  • Edit /etc/default/nfs-common and add
STATDOPTS="--port 32765 --outgoing-port 32766"
  • Edit /etc/default/nfs-kernel-server and add
  • Edit /etc/default/quota and add
  • Create /etc/modprobe.d/local.conf with the contents
options lockd nlm_udpport=32768 nlm_tcpport=32768
  • Update /etc/services (not strictly necessary, but helps):
# NFS ports as per the NFS-HOWTO
# Listing here does not mean they will bind to these ports. 
rpc.nfsd        2049/tcp                        # RPC nfsd
rpc.nfsd        2049/udp                        # RPC nfsd
rpc.statd-bc    32765/tcp                       # RPC statd broadcast
rpc.statd-bc    32765/udp                       # RPC statd broadcast
rpc.statd       32766/tcp                       # RPC statd listen
rpc.statd       32766/udp                       # RPC statd listen
rpc.mountd      32767/tcp                       # RPC mountd
rpc.mountd      32767/udp                       # RPC mountd
rcp.lockd       32768/tcp                       # RPC lockd/nlockmgr
rcp.lockd       32768/udp                       # RPC lockd/nlockmgr
rpc.quotad      32769/tcp                       # RPC quotad
rpc.quotad      32769/udp                       # RPC quotad

Set up DHCP server

This is fully detailed in the other section on the site about a Setting up a captive portal from scratch using Debian, so it's best to check that for full details, but essentially you need the following lines in your /etc/dhcp3/dhcpd.conf file:

option root-path "";
  filename "pxelinux.0";

Customising Ubuntu

This section is optional but recommended. If you already have a customised Ubuntu image, or are happy with the default one provided, then skip to the next step.

I won't provide full details here for extraction - please see the reference at the bottom of the page.

Customise as required

I assume that the squash filesystem has already been extracted and chrooted into.

Add/remove packages

Now use apt-get to add/remove packages as required. I did the following:

  • Install joe text editor

apt-get install joe

  • Edit /etc/apt/sources.list to include universe and multiverse repositories (scroll to the end of the file and uncomment the repositories.)
  • Update package lists:

apt-get update

  • Install Lynx (needed for me to reset user's agreement of T&C)

apt-get install lynx

  • Install non-freee packages (flash, java, etc)

apt-get install ubuntu-restricted-extras

Set up pre and post Gnome scripts

The following two scripts are set to run before Gnome starts and after Gnome has started. They call scripts on the NFS file store to copy in further customisations for the user. The reason for this is because once the squashfs image has been mastered it is difficult to alter small settings. These 2 scripts allow alterations to be carried out on the scripts in the NFS file store easily in the future.

  • Pre-gnome

This script looks for the /cdrom directory (which is the NFS mount point) and runs any scripts in /cdrom/custom/pre-gnome. This means that on the NFS share, files can be put in /srv/ubuntu/custom and copied using scripts in /srv/ubuntu/custom/pre-gnome

  • /etc/init/pre-gnome.conf
# pre-gnome - run any commands from the nfs share during boot

description     "copy files before gnome starts"
start on starting mountall

    . /etc/default/rcS

        if [ -x /cdrom/custom/pre-gnome ]; then
                for file in `ls /cdrom/custom/pre-gnome`; do
                        if [ "${file}" != "${file%""~""}" ]; then
                        /cdrom/custom/pre-gnome/$file /cdrom/custom/

end script
  • Create the post gnome script /usr/bin/post-gnome

. /lib/lsb/init-functions

if [ -x /cdrom/custom/post-gnome ]; then
        log_begin_msg "Running post-gnome scripts (/cdrom/custom)"
        for file in `ls /cdrom/custom/post-gnome`; do
                if [ "${file}" != "${file%""~""}" ]; then
                /cdrom/custom/post-gnome/$file /cdrom/custom/
  • Make it executable

chmod +x /usr/bin/post-gnome

  • Enable it by creating /etc/xdg/autostart/post-gnome.desktop
[Desktop Entry]
Name=Remote Configure Script
Comment=Copies over any files after Gnome has started
GenericName=Post Gnome Copy
  • Add firefox script (/usr/bin/ to automatically wipe out history and restart firefox when closed. The lynx dump logs onto our server to force it to disable the client temporarily and thus re-present the user with T&C.

while [ 1 ]
    # check that firefox is not already running
    if ps aux|grep 'firefox-bin'|grep -v 'grep' > /dev/null
        echo nothing > /dev/null
        # disable client from browsing web, forcing them to sign syops
        lynx -dump http://earth.wardroom/disable.php > /dev/null
        /usr/bin/firefox $1
        rm -fr /home/ubuntu/.mozilla/firefox/
    sleep 2
  • Make it executable:

chmod +x /usr/bin/

  • Make it autostart:

Create /etc/xdg/autostart/

[Desktop Entry]
Name=Firefox restart shell
Comment=Browse the World Wide Web
GenericName=Web Browser

Other customisation

  • Delete /usr/share/applications/ubiquity-gtkui.desktop to disable install icon on desktop
  • Delete /etc/xdg/autostart/update-notifier.desktop
  • Delete /etc/xdg/autostart/nm-applet.desktop
  • Delete /etc/skel/examples.desktop
  • Run apt-get upgrade
  • Edit /etc/default/keyboard for correct keyboard layout:


Customise /etc/skel

/etc/skel contains the skeleton layout of the to-be-created ubuntu user. Add and remove files as required. (I just removed the Examples link)

Recreate image

  • See reference for full details

rm /var/lib/dbus/machine-id
rm /sbin/initctl
dpkg-divert --rename --remove /sbin/initctl
rm /etc/resolv.conf
umount /proc || umount -lf /proc
umount /sys
umount /dev/pts

Exit from chroot

sudo umount edit/dev || sudo umount -lf edit/dev
rm filesystem.squashfs
sudo mksquashfs edit filesystem.squashfs

Set up scripts and files on server (optional - only required using customisation above)

Create directories /srv/ubuntu/custom/pre-gnome and /srv/ununtu/custom/post-gnome on the server and insert scripts as follows. The directories and the contents referenced in the scripts should also be created as required with custom settings in. To get the required settings, I ran a Live copy of Ubuntu, made my changes, and then copied the appropriate changed files to the server.

  • /srv/ubuntu/custom/pre-gnome/copy

cp -a $1/home/.gconf /home/ubuntu/.gconf
chown -R ubuntu.ubuntu /home/ubuntu/.gconf
cp -a $1/home/.mozilla /home/ubuntu/.mozilla
chown -R ubuntu /home/ubuntu/.mozilla
cp -a $1/home/.local /home/ubuntu/.local
chown -R ubuntu /home/ubuntu/.local
cp -a $1/home/.config /home/ubuntu/.config
chown -R ubuntu /home/ubuntu/.config

cp $1/printers.conf /etc/cups
cp $1/LaserJet-4050.ppd /etc/cups/ppd
/etc/init.d/cupsys force-reload

cp $1/ubuntumenu.png /opt

# A complete hack. ESD (for sounds) seems to make an error
# come up about gnome-settings-daemon
rm /usr/bin/esd
  • /srv/ubuntu/custom/pre-gnome/timezone
rm /etc/localtime
ln -s /usr/share/zoneinfo/Europe/London /etc/localtime
  • Script to set the time automatically. Create /srv/ubuntu/custom/pre-gnome/ntp
ntpdate -u
  • /srv/ubuntu/custom/pre-gnome/gdm (Script to set default window manager to gnome)
echo "DefaultSession=gnome-classic" >> /etc/gdm/custom.conf
  • Make them executable

chmod +x /srv/ubuntu/custom/pre-gnome/ntp
chmod +x /srv/ubuntu/custom/pre-gnome/timezone
chmod +x /srv/ubuntu/custom/pre-gnome/gdm

  • /srv/ubuntu/custom/pre-gnome/copy

# This script runs on start up of gnome, to put hacks in that I couldn't get working

# A real hack to get the panel configured as required
# I couldn't get the default settings to work from /etc/gconf, so this
# script copies them in once gnome has started, and then restarts the panel.

sleep 4
rm -fr ~/.gconf
cp -a /cdrom/custom/home/.gconf .
gconftool-2 --shutdown
killall gnome-panel

Make the 2 scripts above executable (chmod +x copy)

The above example copy in the settings from /opt/ubuntu/custom/home. An example set of scripts that can be placed there are contained at To use:

cd /srv/ubuntu/custom
tar -zxvf home.tar.gz

Adding a printer

  • To add a network printer, boot up into the live network copy of Ubuntu and install a printer to create the required cups files.
  • Copy the following files from the local client into /srv/ubuntu/custom on the server:
    • /etc/cups/printers.conf
    • /etc/cups/pppd/printer-name.ppd
  • Create a script in /srv/ubuntu/custom/pre-gnome (called printer) to copy the files on boot:
cp $1/printers.conf /etc/cups
cp $1/LaserJet-4050.ppd /etc/cups/ppd
/etc/init.d/cupsys force-reload
  • Make the script executable:

chmod +x /srv/ubuntu/custom/pre-gnome/printer


cubuntu.txt · Last modified: 2018/12/06 20:28 by abeverley