Diskless Linux Kiosks (Fat Client)

by Jamie Zawinski
Dec 2000 - Sep 2006

This document describes how I went about turning a set of cheap ~200MHz diskless PCs into internet kiosks. This is how the kiosks at DNA Lounge worked from late 2000 through 2006. Prior to that, I had experimented (somewhat unsuccessfully) with using laptops as kiosks. After that, I went to a "thin client" approach, instead of the "fat client" approach described here.

For an explanation of what my goals were, and why things no longer work as described here, go back.


The plan here, in the "fat client" world, was to have the machines run all their applications locally, but have no local disks: everything would be mounted via NFS from a remote file server. Users would auto-login as a "guest" user on the client machine, which would run X11, a web browser, a basic GNOME desktop, etc.

As much would be mounted shared and read-only as possible; and when the machine rebooted, everything would reset to a default state.

The hardware we settled on was:

We found that the monitors held up great, but the ThinkNICs were a little too heat-sensitive. We ended up cutting holes into the cases and attaching an additional fan to each, which helped. Sadly, their onboard video tended to have a bad failure mode: if the machine had ever overheated, then from then on, the video signal would be ``staticky'', looking like a bad cable. Apparently heat makes something in the video subsystem fry this way. But most of them had overheated at least once before we attached the fans, so most have noisy video now.

We haven't had to replace the keyboards or trackballs as often as you'd think, though one does tend to need cleaning or minor repair (de-gunking, or replacing a key or two) every couple of weeks. Getting indestructible, battle-hardened keyboards would not have been worth the cost. It took some time to find trackballs whose balls could not be removed without tools, but we did. (That was important, or the balls would have gone missing every night.)

In December 2002, we began upgrading the machines, and thanks to Moore's Law, they got a lot faster without getting much more expensive. We're still using the same monitors (they've held up great) but we built new machines from scratch:


The kiosks boot over the network, NFS mounting everything, and running applications locally. (The ThinkNIC comes with a bootable CD that basically launches you directly into Netscape, but that's not what I wanted: I want a full desktop environment, not just a browser.)

Instead of booting over the network, I could have just burned my own set of bootable CD-ROMs for them: these CDs would contain a kernel, a basic root file system, and enough in the way of config files to boot up and mount everything else over NFS. But I decided to go with a full netboot for two reasons:

When I started this project in late 2000, I considered setting up the kiosks as remote X terminals, with all the applications running on a single large remote server machine, but decided against it. Especially once the kiosks were upgraded to the 200MHz range in 2002 (instead of the original 90MHz range), they were absolutely performant enough to do web browsing and general communications-oriented tasks here in this modern age.

I also took a look at the Linux Terminal Server Project, but that didn't do quite what I wanted. They've got a really nice setup, and it's very easy to install, but it's heavily oriented toward remote X terminals that run applications on the server. Since I want to only run applications locally, on the diskless machines, it looked like I wouldn't have ended up using most of what LTSP does: they're about scaling down Linux as far as possible so that you can still run X on small machines; I want to end up with a more complete local Linux system than that.

In 2006, I changed my mind about that; see above.


Here are the steps I followed in creating this system:


Configure a server machine.


Create a user to own the kiosk files.


Build a kernel for the kiosk machines.


Install BPBatch.


Configure DHCP and BPBatch.


Configure NFS.


Construct /rw.


Construct /ro2.


Initialize /ro2.


Construct a ramdisk root directory.


Configure TFTP.


Boot in single-user mode.


Configure X.


Configure auto-login.


Configure sshd.


Other usability tweaks.


It seems far more complicated than it ought to be, just to get a Linux system to boot read-only. The files that need to be writable are scattered in far too many places: in my opinion, an out-of-the-box system should never need to touch a file anywhere but /var, and all the other partitions should be read-only by default, but apparently the Linux vendors don't care very much.


Again, I stopped doing things this way in late 2006. Please go back to see how it works today.