silentcat

Silentcat

Silentcat is a slightly modified Redhat Fedora Core 3 -based minidistribution designed to boot - and provide a "network hard drive" to - a diskless EPIA-M motherboard over the network from another Linux machine.  The £150 device is totally silent, and more than fast enough for high quality mediaplayer duties.
download silentcat-0.2.tar.gz  

Recommended hardware


  • A fanless EPIA-M6000 Motherboard, includes 600MHz CPU & TV-out (~£78+VAT)
  • A fanless powersupply (~£39+VAT)
  • 256MB of DDR DSRAM (~£26+VAT)
  • A network connection to a Linux or Windows box which acts as the server (DHCP, TFTP, NBD and SMB - don't worry its all explained step by step)
  • No flash, HDD - since there is no fan noise or drives the case is optional too

Capabilities & Requirements

server and client
  • Boots from PXE prompt on EPIA-M BIOS, powerup -> POST -> Linux and initrd loaded and booted in 30 seconds
  • Uses standard Fedora Core Kernel RPMs with slightly modified initrd
  • Kernel Network Block Device mounts a "network hard drive" from the server machine as / and runs Fedora from that
  • "network hard drive" on the server contains an ext3 filesystem with a Fedora Core 3 install on it, that can include any Fedora Core 3 stuff like KDE, etc
  • Supports 5.1 AC3 sound, widescreen video
  • Really NO storage device needed on the EPIA end, no HDD or flash... all done over the network.  "Network Hard Drive" is as fast or faster (depending on server cache) than a local HDD.
  • Requires a Windows or Linux server providing DHCP, TFTP, NBD and Samba (or a Windows Share).
  • No NFS! 

Detailed description of the network booting process

Step 1: BIOS Network Boot

The EPIA BIOS can be configured to request an IP address from a DHCP server.  Along with the IP address and other network settings, the DHCP server is configured to tell the EPIA to download a particular bootloader file from a particular TFTP server (often the same server is running all the needed services, DHCP, TFTP and NBD).  In this case the DHCP server is configured to tell the EPIA to fetch a file called pxelinux.0 from the TFTP server

Step 2: PXELINUX

The pxelinux.0 file is fetched from the TFTP server and the EPIA runs it.  Pxelinux.0 is a network-aware bootloader, it goes back to the TFTP server and looks for a file called pxelinux.cfg/01-<your MAC address>.  This is a text file describing the filename of the appropriate Linux kernel on the TFTP server, and the filename of the matching Initrd, which contains a filesystem with /bin, /etc, /lib and so on).   Pxelinux then goes back to the TFTP server and downloads the first the Linux kernel file and then the Initrd file.  (The Initrd file is deliberately kept on a strict diet to minimize startup time; we add some stuff into the Redhat initrd to allow our network boot and NBD capability)

3) Linux


The last act of Pxelinux is to start the downloaded kernel, this begins the booting process.  When the kernel initialization is over, the kernel decompresses the Initrd file and runs a program called init.  This program then runs various scripts and programs that complete the booting action, in the same way as a normal Linux boot.

4) Mounting the Network Block Device filesystem


The Initrd just contains enough programs to start Linux up and get a network connection, the rest of the Linux distro packages and applications are kept in a file on the server and accessed over the Network Block Device kernel subsystem.  This makes the remote file seem to be a mountable partition called /dev/nda on the EPIA.  One of the actions of the Initrd scripts is to connect to the server machine using this method and mount /dev/nda as the root filesystem on the EPIA.  This then appears as a normal ext3 mounted partition on the EPIA, it has been prepared with a bunch of Fedora Core 3 RPMs to contain a usable distro.  There is no limit to the size of the network hard drive except the storage space on your server, but you have to set the size when creating the filesystem.  1GB is plenty for a media server type use, the media files themselves are accessed over a samba share.

5) Running user apps!

The picture shows mplayer running, decoding AC3 in realtime and displaying at 16:9, at around 80% CPU.  The whole setup is completely silent (except for the six-channel sound output directly by the EPIA)  -- Gah! Look out, Frodo!


Initializing the remote filesystem

Initially the remote filesystem is prepared with a minimal set of RPMs from Fedora Core 3 to get you a text-mode login, but with yum and rpm installed.  You can then boot the EPIA over the network and use yum to download further packages for you automatically to provide x.org, KDE and so on.

Step by step install instructions

0)  Download and unpack the silentcat tarball

Unpack the silentcat tarball into /usr/src

cd /usr/src
tar zxf /path/to/silentcat-0.2.tar.gz

1)  Find out your EPIA MAC address

This can be found on a sticker at the back of the EPIA network/USB connector.  If the sticker is missing, you can also find this out by setting the EPIA board for network booting in the BIOS, and it shows the MAC address on the monitor.  Either way it will look like 00:40:xx:xx:xx:xx  make a careful note of it because we will be needing it a lot.  To simplify matters, run the following once you have the MAC, replacing the xx with your MAC numbers (NOTE that the numbers are separated by - here)

export EPIAMAC=00-40-xx-xx-xx-xx

2) Setting up the server services


Make sure you have your DHCP and TFTP servers installed.  For a Fedora server that means installing the following packages:

  • dhcp
  • tftp
  • tftp-server
You should be able to get these by typing on your server

yum install dhcp tftp tftp-server

On Redhat TFTP operates under xinetd.  The scripts assume that your TFTP base directory is /tftpboot, since this is the default for Redhat.  You also need to edit /etc/xinetd.d/tftp to set disable to no; by default the service is disabled.  Then to ensure that xinetd runs after a reboot, and runs now:

chkconfig xinetd on
service xinetd restart

TFTP requires a hole in your server firewall for UDP port 69.  You can do this with (as root)

iptables -I INPUT -p udp --dport 69 -j ACCEPT

also copy this line to /etc/rc.local to ensure it works after the next boot.


A note on security - an external firewall, like a NAT router or a hardware firewall, must protect your server.  Its an unnecessary risk to have people from the Internet being able to touch the NBD or TFTP ports.  Be safe!

The DHCP server is controlled by /etc/dhcpd.conf, which you need to create.  Here is an example of one set up for TFTP booting... cut and paste it, but you will need to change the IP addresses shown in bold to match your network setup.

allow booting;
allow bootp;
server-identifier dhcp.your.fqdn;
default-lease-time 172800;
max-lease-time 604800;
option domain-name "your.fqdn";
ddns-update-style ad-hoc;

subnet 192.168.0.0 netmask 255.255.255.0 {
option broadcast-address 192.168.0.255;
option domain-name-servers 192.168.0.1;
option routers 192.168.0.1;
option subnet-mask 255.255.255.0;


group {
next-server 192.168.0.31;
filename "/pxelinux.0";
host silentcat {
hardware ethernet 01:00:40:63:ca:76:ed;
fixed-address 192.168.0.30;
}
}
}

  • If you are not on 192.168.0.* then you need to edit the subnet, netmask and broadcast-address lines to match your subnet
  • You should change the IP addresses in "option domain-name-servers 192.168.0.1;" to match your ISP nameserver(s), or as in the case shown here, your internal DNS server.
  • "option routers 192.168.0.1;" should be changed to reflect your gateway IP out to the Internet.
  • "next-server 192.168.0.31;" should be changed to your DHCP/TFTP server machine IP address.
  • "hardware ethernet 00:40:63:ca:76:ed;" should be changed to reflect the Ethernet MAC address of your EPIA board. 
  • lastly change the IP in "fixed-address 192.168.0.30;" to the IP address that you want the EPIA board to be allocated on your network.

Now we need to set the dhcp server to run every boot, and set it running now

chkconfig dhcpd on
service dhcpd restart

2a) Running the prepserver script

The rest of the steps have been automated into a script.  The steps carried out by the script are documented below for completeness, but in fact running the prepserver script will jump you to section 12 in one step.  Here is how to do that:

cd /usr/src/silentcat-0.2
./prepserver 00-40-xx-xx-xx-xx

where you replace 00-40-xx-xx-xx-xx with your actual EPIA MAC address.  If the script completed happily, you can now jump over most of the rest of this page to step 12.


Note - these steps have been automated into the prepserver script described above.  This section is for documentation only.  After running prepserver, you can skip to section 12


3) Setting up /tftpboot on the server

/tftpboot is where the files necessary to do the network boot magic are going to live on the server.  We will set up the absolute minimum to get the first steps of the network boot action working, then test what we have done so far by trying a network boot and making sure we get started properly before we fall over.

mkdir /tftpboot
mkdir /tftpboot/silentcat
mkdir /tftpboot/pxelinux.cfg
cp /usr/src/silentcat-0.2/pxelinux.0 /tftpboot

pxelinux.0 is the network-aware bootloader that will be sent out to the EPIA board by TFTP after contact is made with the DHCP server; it knows how to go on to download the Linux kernel and initrd by TFTP.

Next create a text file in /tftpboot/pxelinux.cfg/ named 01-<your EPIA MAC address delimited by ->, for example

vi /tftpboot/pxelinux.cfg/01-$EPIAMAC

use the following template to create the file, replacing the example MAC addresses with your real EPIA one:

default defaultkernel
label defaultkernel
kernel silentcat/vmlinuz-00-40-63-ca-76-ed
append root=/dev/ram0 initrd=silentcat/initrd-00-40-63-ca-76-ed.gz ramdisk_size=24000 acpi=off

When the EPIA network-boots, the pxelinux.0 bootloader is smart enough to load up this configuration file based on its MAC address.  The MAC address -specific configuration file tells it the exact filename to request to get the right kernel and initrd files to boot that particular board.  In this way you can boot a bunch of different boards from the same network server, each correctly directed to the appropriate kernel and initrd file by these config files.

4) Test your DHCP and TFTP server. 

Even without any further work, your EPIA should be able to start booting, although it should fall over with an error quite quickly because we did not prepare a kernel for it to download yet.  But it should be able to get an IP address from the DHCP server, and be able to download /tftpboot/pxelinux.0 before failing.  Don't go any further until you can see pxelinux is at least starting on your EPIA from over the network.

5) Create the distro filesystem

Type the following:

dd if=/dev/zero of=/tftpboot/silentcat/filesystem-$EPIAMAC bs=1024 count=1000000
mke2fs -j /tftpboot/silentcat/filesystem-$EPIAMAC
tune2fs -c0 /tftpboot/silentcat/filesystem-$EPIAMAC

Just say "yes" to the complaint that it is not a special block device, it's just a normal file and that's fine.  This creates a 1GB file on the server, formats it for ext3, and turns off periodic fsck.  This filesystem file will shortly contain a Fedora Core 3 install for the EPIA but right now it is empty. 

6) Export the distro filesystem using nbd-server

Since we now created our main filesystem, this is a good time to export it over the network.  First we copy the nbd-server app from the silentcat tarball into /usr/bin where we can run it easily

cp /usr/src/silentcat-0.2/nbd*/nbd-server /usr/bin

Then we need to run the server app, which backgrounds/daemonizes itself automatically, and poke a hole in the server firewall (replace the example MAC address with your actual one).

nbd-server 1078 /tftpboot/silentcat/filesystem-00-40-63-ca-76-ed
iptables -I INPUT -p tcp --dport 1078 -j ACCEPT

You should copy those two lines above into /etc/rc.local on your server so they persist after a reboot.  Your NBD server is now set up.

7) Install Fedora Core 3 into the exported filesystem

Next we need to fetch a minimal set of Fedora Core 3 packages and install them into the filesystem we just created.  This is the set of packages that are required:

libattr
module-init-tools
sed
zlib
dev86
gmp
libgcc
ncurses
setup
device-mapper
grep
libselinux
net-tools
glibc-common
hwdata
libtermcap

iproute
lvm2
psmisc
udev
chkconfig
findutils
iputils
MAKEDEV
python
usbutils
coreutils
shadow-utils
e2fsprogs
gzip
libsepol
openssl
sysklogd
elfutils
hotplug
libstdc++
pam
SysVinit
basesystem
elfutils-libelf
gawk
kernel
mingetty
readline
util-linux
cpio
gdbm
krb5-libs
mkinitrd
rpm
wget
cracklib
glib2
tzdata
bzip2-libs
filesystem
less
mktemp
rpm-libs
words
cracklib-dicts
glibc
libacl
rpm-python
yum
db4

pcre
tar
bash
ethtool
info
libxml2
popt
termcap
beecrypt
fedora-release
initscripts
libxml2-python
procps



To make life easier, I provide in the silentcat tarball a "getfiles" script which takes this list of packages (found in packagelist) and downloads them from a Fedora mirror.  To set it going,

cd /usr/src/silentcat-0.2
./getfiles packagelist .
After some time you should have a set of the latest RPMs for the list of packages shown above in the current directory.  What we need to do now is to install these RPMs into the ext3 filesystem file we created earlier - NOT on the server itself.  First we need to mount our ext3 filesystem file somewhere so we can access the contents.  As root...

mkdir /tmp/mnt
mount -o loop /tftpboot/silentcat/filesystem-$EPIAMAC /tmp/mnt
These commands mount our ext3 filesystem file so that it appears at /tmp/mnt.  If you do an ls /tmp/mnt you won't see much in there, just a lost+found directory created by the ext3 format earlier.  The thing is completely empty at the moment.  In fact it is a little too empty, we have to generate a couple of device nodes in there so everything will work smoothly when we come to install the RPMs:
mkdir /tmp/mnt/dev
mknod /tmp/mnt/dev/null c 1 3
mknod /tmp/mnt/dev/nda b 43 0
There is also no /etc/fstab in there, so we must create one.  The first line represents the fact that our root filesystem is coming from /dev/nda, the NBD device, and the second one is necessary to get virtual terminals working, eg, xterm, konsole and so on.
echo "/dev/nda / ext3 defaults 0 0" > /tmp/mnt/etc/fstab
echo "none /dev/pts devpts gid=5,mode=620 0 0" >> /tmp/mnt/etc/fstab

We also need to import the Redhat GPG signatures so RPM can recognize good packages

rpm -r /tmp/mnt --import /usr/src/silentcat-0.2/RPM-GPG-KEY
rpm -r /tmp/mnt --import /usr/src/silentcat-0.2/RPM-GPG-KEY-fedora

So our next move is to install the RPMs we just downloaded into this filesystem, which we do with this:

rpm -r /tmp/mnt -i *.rpm

The -r part is VERY important: this tells RPM not to install to your main filesystem as it normally would, but to install into /tmp/mnt instead.   This is the difference between installing the RPMs on to the server itself and installing them into our filesystem file. This should complete after a minute or two.  Now if you do an ls /tmp/mnt you will see a goodlooking root filesystem in there, with /bin, /lib and so on all generated and populated.  Basically we installed a minimal Fedora Core 3 into the filesystem file.

8) Copy out the kernel and initrd and modify the initrd

You will see the Redhat kernel and initrd installed to /tmp/mnt/boot from when the kernel RPM was installed.  This is of intense interest to us because we need a copy of the kernel and initrd so we can send it over the network at boot-time.  First we will copy the kernel image into /tftpboot/silentcat where it can be accessed by the booting client over TFTP, then we do the same for the initrd:

cp /tmp/mnt/boot/vmlinuz* /tftpboot/silentcat/vmlinuz-$EPIAMAC
cp /tmp/mnt/boot/initrd* /tftpboot/silentcat/initrd-$EPIAMAC.gz

The kernel image is ready to use for network boot and needs no fiddling with.  You'll notice that the initrd is renamed to end with .gz, this is because current Redhat initrds are actually gzip-compressed cpio archives, and unfortunately that is of more than intellectual interest: because we have to mess with the initrd in order to insert the things we need to complete network boot.  Terrifying as the prospect sounds, in fact the mods are fairly lightweight and it is simple to extract and repack the initrd.



cd /tftpboot/silentcat
mkdir unpacked
gunzip initrd-$EPIAMAC.gz
cd unpacked
cpio -i < ../initrd-$EPIAMAC

If you do an ls from inside /tftpboot/silentcat/unpacked you will see the unpacked initrd filesystem spread out before you.  This is a bit of a cut down filesystem deliberately created along very minimalist lines.  The job of the initrd is to get enough of the system up so that it can replace itself with the real root (ie, mounted at / ) filesystem, usually an ext3 filesystem on a local hard drive.  For example, there is no bash interpreter in there, but a specialized and tiny "nash" shell which is superficially bash-like but includes hardly any of the bash features.  The file ./init is a nash script that controls the actions of the initrd, and it is this we will have to mess with in a moment.

But first we need to add some kernel modules to the initrd which we need it to have for our purposes.  The kernel modules we need are mii.ko and via-rhine.ko to get the Ethernet working, and nbd.ko to get the kernel to understand Network Block Device protocol for our remote hard drive.  We can pick these modules out from the ext3 filesystem we prepared earlier with the RPMs (particularly the kernel RPM which provides these modules) and which we still have mounted at /tmp/mnt.

cp /tmp/mnt/lib/modules/*/kernel/drivers/block/nbd.ko /tftpboot/silentcat/unpacked/lib
cp /tmp/mnt/lib/modules/*/kernel/drivers/net/via-rhine.ko /tftpboot/silentcat/unpacked/lib
cp /tmp/mnt/lib/modules/*/kernel/drivers/net/mii.ko /tftpboot/silentcat/unpacked/lib
In addition, we need to add two specialized usermode programs into the initrd.  First is dhcpcd, the DHCP Client Daemon, which we will use to reassign an IP address to eth0 from the DHCP server.  We need to do this because we will be bringing up the Ethernet inside Linux now, which needs the IP setting anew; previously only the pxelinux.0 bootloader had been talking to the DHCP server and got its IP address assigned before Linux was even started.  That is lost now Linux has started, and Linux has no idea what IP address to assign to eth0 until we run dhcpcd to contact the DHCP server again.  The second specialized program is nbd-client, which does the magic to connect our /dev/nda to the remote NBD server's filesystem file to get us our "network hard drive".  We need to copy both of these apps, which have been statically linked (and compiled with i386 arch NOT i686!) from the silentcat archive to /tftpboot/silentcat/unpacked/bin


#!/bin/nash

mount -t proc /proc /proc
setquiet
echo Mounted /proc filesystem
echo Mounting sysfs
mount -t sysfs none /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs none /dev
mknod /dev/console c 5 1
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/nda b 43 0
mkdir /dev/pts
mkdir /dev/shm
echo Starting udev
/sbin/udevstart
echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
echo "Loading mii.ko module"
insmod /lib/mii.ko
echo "Loading via-rhine.ko module"
insmod /lib/via-rhine.ko
echo "Loading nbd.ko module"
insmod /lib/nbd.ko
/bin/dhcpcd
/bin/nbd-client 192.168.0.31 1078 /dev/nda

/sbin/udevstart
echo Creating root device
mkrootdev /dev/root
umount /sys
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/nda /sysroot
mount -t tmpfs --bind /dev /sysroot/dev
echo Switching to new root
switchroot /sysroot
umount /initrd/dev



cp /usr/src/silentcat-0.2/dhcp*/dhcpcd /tftpboot/silentcat/unpacked/bin
cp /usr/src/silentcat-0.2/nbd*/nbd-client /tftpboot/silentcat/unpacked/bin

Alright, we have all our assets in place inside the unpacked initrd, now we need to edit /tftpboot/silentcat/unpacked/init and get it to do some extra tasks to allow network boot.  Here is a copy of my modified init script showing the additions.


The one line you need to modify to match your NBD server IP is /bin/nbd-client 192.168.0.31 1078 /dev/nda, change this to match your NBD server that is exporting the filesystem file.  Don't miss the last change,
mount -o defaults --ro -t ext3 /dev/nda /sysroot
which is easy to overlook.

9) Repack and recompress the initrd

The changes to the initrd completed, the last step is to regenerate the cpio archive and zip it back up

cd /tftpboot/silentcat/unpacked
find . | cpio --quiet -c -o > ../initrd-$EPIAMAC
cd ..
gzip -9 ./initrd-$EPIAMAC

This regenerates ./initrd-$EPIAMAC.gz

10) Final touches to the exported filesystem

/etc/resolv.conf is not set up, that is, DNS will not work.  You need to replace 192.168.0.1 below with your or your ISP's DNS server IP address

echo "nameserver 192.168.0.1" > /tmp/mnt/etc/resolv.conf

Lastly, adding the DAG yum repository will be helpful when we populate the system with more packages like mplayer.

echo "[Dag]" >/tmp/mnt/etc/yum.repos.d/dag.repo
echo "baseurl=http://apt.sw.be/fedora/3/en/$basearch/dag" >>/tmp/mnt/etc/yum.repos.d/dag.repo
echo "enabled=1" >>/tmp/mnt/etc/yum.repos.d/dag.repo
echo "gpgcheck=0" >>/tmp/mnt/etc/yum.repos.d/dag.repo

11) Unmount the exported filesystem

We are done fiddling with the exported filesystem on the server.  It's important that a filesystem is not mounted multiple times simultaneously, so now we need to unmount it from /tmp/mnt because we are about to try to boot from it

umount /tmp/mnt


12)  Network Boot time!

Okay, now you should be able to network boot your EPIA board into a runlevel 3 login prompt.  Just login as root, no password is needed.  Once you are logged in, you can set the root password using passwd.

13) Using Yum to add more packages

Now that you are up on the EPIA with a minimal set of packages, you can use yum from the EPIA to download and install the package set needed to make a nice media player.  The following are recommended


# hard to edit things without an editor!
yum install vim-minimal
# allows remote login over ssh
yum install openssh-server
chkconfig sshd on
service sshd start
# allows connection to samba servers
yum install samba
# required to get X working (generates /etc/X11/xorg.conf)
yum install system-config-display
# installs X and Konqueror
yum install kdebase
# configure X
system-config-display
# start X
telinit 5
yum install alsa-utils
# set audio levels
alsamixer
alsactl store
yum install mplayer

To boot into a graphical login, you need to edit /etc/inittab and change the line

id:3:initdefault:

to

id:5:initdefault:


Getting Auto-on from the EPIA

By default the EPIA sits there after powerup waiting for the power button to be pressed before it will do anything.  You can change this behaviour to automatic startup on powerup simply by adding a 22uF capacitor between pins 6 (+ side of the cap) and 8 (- side of the cap) of the "Front Panel" connector on the EPIA.  This behaviour is a lot more "appliance like" and allows the EPIA to be available whenever the TV is powered, for example.  We also use the ext3 journalling to allow uncontrolled poweroffs without any problems.




FAQ

Is YALD (Yet Another Linux Distro) needed for this?

It's not really another distro, it is a light modification to Fedora Core to allow Network Booting over NBD.

Isn't the "network hard drive" slow?

No, its real fast.  I can't tell the difference between a local HDD and the network one, except for the silence.  In some cases its actually noticeably faster, since the "network hard drive" NBD server has a lot more memory for cache than the EPIA, and the EPIA IDE interfaces are not that great.

Do I have to shutdown, or can I just turn the thing off?

In my experience, the ext3 formatted "network hard drive" is fully able to manage having the power just turned off without a controlled shutdown, that's what we have been doing for months without trouble.  At the next boot it may have to replay a couple of journal entries which takes a couple of seconds, but we have seen no problems from this.

What are the security implications of running this?

The main source of potential danger is that you will be running dhcpd, tftpd and nbd-server on your server machine.  Many people are already running dhcpd locally for normal DHCP duties.  I suggest that you use iptables on your server machine to limit the accessability of these services to local IP addresses.  If you keep your server up to date with security updates are are otherwise secure, it should not present any problems.

For the client machine, there is nothing really stopping a local attacker with access to the local network spoofing your EPIA MAC and IP and contaminating the "network hard drive" used by the EPIA.  So you should not store really valuable secrets on the "network hard drive".  However, if the attacker has control of a machine on your local network already, suffient to change its MAC address and IP, you have worse problems that anything silentcat can cause.

For remote attacks the EPIA, the silentcat distro is really aggressively firewalled, everything is dropped by default from before the network interface is active in Linux.  Only the connection to the specific NBD server machine on the specific port is allowed.

How does the EPIA know what to load at boot-time?

The sequence is this:

EPIA ETHERNET BROADCAST: Hey!  Any DHCP servers out there? My MAC address is 00-40-63-xx-xx-xx... what should I use as my IP?


DHCP Server at 192.168.0.50 Right, I heard about you from my /etc/dhcpd.conf, you're meant to be 192.168.0.199
EPIA 192.168.0.199:  Alright, thanks -- does it say I should TFTP-download anything too?


DHCP Server at 192.168.0.50 Yeah, pxelinux.0, and you need to use 192.168.0.50 to get it
EPIA 192.168.0.199: Thanks - okay.... Hey! TFTP server at 192.168.0.50, Can I get pxelinux.0 please?


TFTP Server at 192.168.0.50:  Here you go, sending my /tftpboot/pxelinux.0
EPIA 192.168.0.199: Okay, running that... alright, TFTP server at 192.168.0.50, now I need a file called pxelinux.cfg/01-<my MAC ads>?


TFTP Server at 192.168.0.50 Here you go, sending /tftpboot/pxelinux.cfg/01-<your MAC address>
EPIA 192.168.0.199: Lets see.... that config file is telling me to get a kernel silentcat/vmlinuz.... and an initrdfile called silentcat/initrd-tv.gz you got them?


TFTP Server at 192.168.0.50 Here you go, sending /tftpboot/silentcat/vmlinuz and /tftpboot/silentcat/initrd-tv.gz
EPIA 192.168.0.199: (boots kernel and runs stuff in initrd) - Whoa, I feel much better now - hey this initrd has a script in it telling me to connect to an NBD "network hard drive" at 192.168.0.50 port 1077... you there?


NBD Server at 192.168.0.50 Yep, you're connected, I've been told to serve /tftpboot/silentcat/filesystem-xx-xx-xx-xx-xx-xx on that port
EPIA 192.168.0.199: (mounts the remote filesystem over NBD and starts booting up X, KDE and so on that is in there)  Okay, one more thing, the /etc/fstab in this network hard drive is telling me to mount a Samba share from //192.168.0.50/media?
 

Samba SERVER at 192.168.0.50
Here you go
EPIA 192.168.0.199: (completes boot and starts playing movies)  Thanks guys!



  • PXE in the EPIA BIOS uses DHCP (the information is in /etc/dhcpd.conf on the DHCP server) to find the right TFTP server to get pxelinux.0 from, given the EPIA MAC address
  • pxelinux.0 looks in that TFTP server's ./pxelinux.cfg/<MAC address> to find the right kernel and initrd
  • pxelinux.0 fetches the right kernel and initrd from the TFTP server into the EPIA's memory, and boots that kernel with the initrd as the initial root filesystem.  This gets us most of the way through the boot process.

Contact me at silentcat@warmcat.com if you have any questions or comments