uzERP Blog

Running Raspberry Pi’s as Thin Clients with Ubuntu 14.04 LTS

Posted by Harry Lavender on September 10, 2014

This blog post will show exactly how to set up an LTSP server, running the latest version of Ubuntu, usable by Raspberry Pi thin clients over an Ethernet network, and manage these thin clients using centrally managed software known as Epoptes. This configuration is currently in use in our company setup.

This guide aims to get LTSP running on a network, with thin client access from a Raspberry Pi, as easily as is possible. Please note: This guide assumes that you can confidently install a server with Ubuntu 14.04LTS.


  • Raspberry Pi (B model works best)
  • 512MB+ SD Card
  • Hardware to install Ubuntu 14.04 LTS on (Core2Duo+ is recommended, and a typical C2D system with 4GB of RAM will easily support 10 users). Note: This example uses a simple system that does NOT require 2 Network Interface Cards, meaning you can use a simple home PC as an LTSP server.
  • Copy of 14.04LTS
  • Network with a non-authoritative DHCP server (The LTSP server needs to be the DHCP Server here)
  • Keyboard/Mouse/Monitor for the Raspberry Pi, it obviously needs to be networked too.
  • SD Card Reader/Writer
  • A copy of BerryTerminal:

Advantages over Pi-LTSP

  • Isn’t a fat client.
  • Can run applications that otherwise could not be run on the Pi (Firefox, LibreOffice), whatever you can get working over LTSP that works on your distro..
  • You can mix this up with normal x86 or x64 clients, so if you have a few old Pentium 4 machines sitting around that work, you can use them too. (128MB of RAM is plenty for a thin client).

Installing and configuring the Operating System

Firstly, we need to install Ubuntu 14.04LTS. Download whichever flavour you would like, for this example I will be using standard Ubuntu 14.04 LTS Server. Note: if you are using the Server ISO, you will need a 64bit machine, as no 32bit server image is available.

I am using the standard Ubuntu 14.04LTS, as it has the bare minimum you need for this project, and anything extra that is needed, can be installed. I am not a fan of removing loads of unnecessary packages once the system is up and running. Make sure to install SSH during setup.

Once you have a vanilla server setup, or whatever flavour you happen to be using, we need to do the following, to ensure the system is fully up-to-date:

:~$sudo apt-get update
:~$sudo apt-get upgrade

Depending on your connection speed to the internet, that could have taken anywhere up to 10 minutes (Thanks ADSL). Once you’ve drained your coffee mug, we’re onto the next step.

Prepare packages that people need

I don’t know what you’re going to need for your users to use, whether it be OpenOffice or whatever, but I’ve included packages that are useful, and that we use here.

:~$ sudo apt-get install gnome-desktop-environment

The above installs Gnome3, which includes loads of packages, and most importantly a window manager, pretty essential for this project, as end users aren’t going to want to use busybox! This install is around 2GB, so you might need to slam down some more coffee while this does it’s thing. Feel free to install your favourite desktop environment. This obviously isn’t needed if your distro already comes with one.

Once you have saturated your bloodstream with caffeine, we now need to reboot the server. So go ahead and do:

:~$ sudo reboot now

You’ll end up with a GUI now, instead of bash or tty3 or whatever. You can either do everything from the terminal emulator on the server, or via SSH, it really doesn’t matter.

Now, onto the installation of the LTSP server:

:~$ sudo apt-get install ltsp-server-standalone

Once the above is done, we need to build the LTSP image, for deployment to our raspberry Pi’s.

:~$ sudo ltsp-build-client --arch i386

Make sure that the above is set, as this ensures that the images are built for an x86 system. I’m not too sure whether this actually matters, because obviously the Pi is neither x86 or x64, and berryterminal uses RDP. But best to make sure.

Please note, this will take a while, as it has to download the dependencies and libraries for the 32 bit version. It’s probably not a good idea to have any more coffee, or you might end up in hospital, so maybe take a minute out and have a glass of water.

Configuring Networking

That took a while. Now, let’s edit /etc/networking/interfaces, and set the network configuration to static, as I forgot to set it to static during install. If you managed to set it manually, congratulations. If you’re not sure, do the following:

vim (use whatever you want) /etc/networking/interfaces, and change the lines:

iface eth0 inet dhcp


iface eth0 inet static

Obviously replacing x’s with the IP you want to give the server. Bear in mind you’ll need to edit the DHCP config after this, otherwise the DHCP server will not start for obvious reasons.

For this example I have used:

gateway (No need for internet access).

Now, we need to go and modify the DHCP configuration file to make sure we are allocating the correct IP addresses.

Below is my dhcp.conf. You can see below that I have added in the MAC address of my Raspberry Pi, and given it an IP. You can use this format, or let it assign the Pi, or whatever device an IP from the specified DHCP range. I find it much easier to use statically assigned IP addresses. Also, if you plan on using this in a multi-server environment, then you must specify the server’s MAC addresses here. LTSP has to be the authoritative DHCP server, else it won’t work. If, for some reason, you cannot have LTSP as your DHCP server, you will have to use LTSP-PNP instead.

# Default LTSP dhcpd.conf config file.

host rPi1 {
hardware ethernet 08:00:27:8E:12:5D;


subnet netmask {
option domain-name "";
option domain-name-servers;
option broadcast-address;
option routers;
# next-server;
# get-lease-hostnames true;
option subnet-mask;
option root-path "/opt/ltsp/i386";

if substring( option vendor-class-identifier, 0, 9 ) = "PXEClient" {
    filename "/ltsp/i386/pxelinux.0";
  } else {
    filename "/ltsp/i386/nbi.img";

As you can see above, I have amended the file to reflect the changes I made to /etc/networking/interfaces. I haven’t bothered to change option routers and the like, as this was setup as a VLAN for this tutorial.

Configuring the Raspberry Pi

Now, we need to sort out our Raspberry Pi. Installation of BerryTerminal is trivial, navigate your favourite browser to, and grab a copy of the .zip. As you’ll see on the site, all you need to do to install BerryTerminal is copy the contents of the .zip onto a FAT formatted SD card.

As you can see on the site, there are some extra options you can set, like auto login. I have shamelessly pasted them below.


You can add the following special options to the file cmdline.txt located on the SD card:


Specifies the IP-address of the LTSP server.


Sets the keyboard layout (French in this example)


Automatically logs in to the server.

NOTE: each Berryterminal needs to have its own username.


Sets the language

The options need to be appended on the same line as the existing options.

Now, as the .zip and it’s contents are only 30MB, you can choose the smallest SD card that will fit 30MB!

Create users and install epoptes

Now, we need some users. You can either use something like NIS, to export the users to the LTSP server, if you have a central file server using NFS for example. That is a lot of work, and if there is interest, I will write another tutorial on how to do this.

For now, I am going to create some local users, and make sure that they can log on, and that they can be managed by epoptes. (I’m sure you can actually add users to a *nix system, but hey!)

:~$ sudo adduser mrblobby

Now, obviously we have a user called mrblobby, once you’ve given him a password and the like.

Now, to manage the users, I use epoptes. Check out their site here:

Epoptes provides lots of nice functionality, like grouping users, remote viewing and control via VNC, along with network booting, message sending and so on. It’s a fantastic piece of software in my opinion.

So, to install this beauty, we need to do the following on our LTSP server:

:~$ sudo apt-get install epoptes-client

This is actually quite confusing, well at least it was for me when I first set this up. The client needs to be on whatever device you are trying to manage, and the epoptes server, called epoptes, needs to be on whatever you are going to manage the LTSP server from. So, in our setup here, at Severn Delta, as the lone sysadmin I have the server package installed on my machine, and the client on the LTSP server, so that I can manage our users. I suppose you could install it onto a server used for managing the LTSP server, or you could install it onto the LTSP server, then manage it from a thin client.

So now we need to install the server:

:~$ sudo apt-get install epoptes

And add a user to the group that is authorised to use the program:

:~$ gpasswd -a username epoptes

Finally, we will need to rebuild the LTSP image, so that it includes epoptes-client.

:~$ sudo ltsp-update-image

Does it work?

Plug your raspberry Pi into the network, attach a keyboard and mouse. Finally, insert the SD card, and insert the power. If all is well, you will see the IP being assigned, and the image being downloaded, followed by you being spat out at a LTSP screen, at which you can log on.


If all is well, you now have amazingly cheap thin clients. I’d recommend looking into VESA mountable cases, which have SD covers on them, so naughty people can’t steal your SD cards when you put these into production environments.

If there is interest, I might write some more tutorials on the following LTSP related topics:

  • Locking down Gnome3, so that users do not have access to programs such as a terminal emulator, or a restricted program.
  • NIS users and file sharing, linking into a LTSP server, allowing for fat and thin client users, and remote storage. (Requires 2 servers)
  • Enabling RDP access to other machines from inside LTSP.
  • Network boot, and how to make it work with Epoptes.
  • Default session in LTSP, and menu customization.

Did this work for you? Follow us at on Twitter at @uZERP, or follow me at @HarryLavender

Continue reading »

Lightweight SME business desktop using LXDE

Posted by Martyn Shiner on July 18, 2012

As anybody who follows uzERP and Severn Delta will know, I’ve used Linux everywhere (work, home, netbook, laptop) for many years and am a big fan. I’ve been wondering what to do about updating my work machine for a while as I have been running a pretty old distribution, and many installs/uninstalls of tools were taking their toll on the system. With the advent of Gnome3 and Unity, both of which I dislike, I also had some choices to make about desktop environment. Having used XFCE and Gnome (version 2) for many years I also wanted to give LXDE a whirl to see if it was faster and could provide a lightweight business focused desktop for a typical SME ‘power user’ (like me!!).

I need a lean and fast system and have a minimal set of requirements in terms of ‘apps’ because most of what I do at work is web based. I also hate unnecessary clutter, being a ‘retentive-tidy-freak-accountant’* – I therefore decided to start from scratch using Ubuntu 12.04 and LXDE as a base rather than installing a ‘regular’ distribution.

The initial install was done from the Ubuntu Alternate CD – by pressing F4 you get get a minimal install of a command line environment on which you can build. Once this base install completed and I got a command prompt I proceeded as follows:

sudo apt-get install xorg lxde-core lxappearance lxde-icon-theme cups
sudo apt-get install synaptic gdebi gdm chromium-browser leafpad epdfview xarchiver gnome-system-tools

This installs a very basic LXDE desktop environment as follows

  • X server to run the desktop
  • lxde-core, lxappearance and icons
  • cups printing system
  • package manager
  • package installer
  • GDM graphical desktop manager
  • web browser
  • leafpad text editor
  • pdf viewer
  • lightweight archive manager
  • system tools (add users, printers etc)

Having got my basic install I just need need a selection of programs and a bit of manual configuration. So….

sudo apt-get install ttf-mscorefonts-installer
sudo apt-get install pgadmin3
sudo apt-get install firefox
sudo apt-get install libreoffice libreoffice-gtk libreoffice-sdbc-postgresql

This installs

  • Microsoft true type fonts – a necessary evil :-D
  • PostgreSQL database admin tool
  • Firefox web browser
  • LibreOffice with gtk extensions and native postgresql driver

The above list is not exhaustive, obviously. I’ll play with the system installing things as I go (things like Dia for drawing diagrams, perhaps). But…. I now have all I need for my day to day work at Severn Delta – no clutter, no games, no music players, photo viewers or unneccesary eye-candy. Its blazingly fast and, so far, I’m very happy with what I’ve ended up with.

*Description is trademarked by @positivechurn

Continue reading »

Is it really that long?

Posted by Martyn Shiner on June 26, 2012

Those of you who have some knowledge of our history will know that uzERP was born as the EGS project started by Jake Stride (he’s on twitter @Jake) when he ran Senokian Solutions in Coventry.

I was clearing out some old emails this morning and noticed a folder called EGS – the first email in that folder was dated 11th April 2006. Scrolling down I saw an email with the title “We are using it!!!” sent by me to Jake – intrigued I opened the email and the text is below


Thought you guys would like to know - we are using it!!!! - EGS 1.0
that is. I now have six users, one VERY active, two sort of active
and three... well you know how it is taking horses to water. Sarah
is really starting to add contacts, tasks and projects. I think 
we'll need to meet up in a few weeks.

You'll notice I'm posting to the forum so your stats will 
improve <g>.

Good to see the 1.1 release and the quick responses.



This email was dated 10th May 2006.

We had installed EGS at Severn Delta Limited for CRM and project management but needed a replacement for our ERP system. Over a beer back in the summer of ’06 I wistfully floated the idea to Jake that we could collaborate on some accounting/stock modules and build them into EGS. Jake went along with it and the idea for what is now uzERP was born.

So uzERP has been nearly six years in the making.

Gosh… is it really that long?

Continue reading »

WordPress Custom Post Types

Posted by Martyn Shiner on December 29, 2011

So I (Ben) was asked to write an article for a series called the 12 Devs of Xmas, given the popularity of WordPress I decided to write a little something about custom post types.

Hope you’ve all had a great Christmas!

Continue reading »

uzERP Reporting

Posted by Martyn Shiner on December 1, 2011

uzERP has a very flexible built in report writer. Any table or view from the underlying database can be made available to the reports module and from there you can produce reports with multiple break levels, subtotals, selection criteria, filters and more. You can output to pdf/xml/csv or send via email if required.

Earlier this afternoon Karen, the Ops Manager at SDL, was asking if she could have a report showing future deliveries due against purchase orders with year/week and supplier selections sorted by due date.

Continue reading »

Management information the Severn Delta way… part 2

Posted by Martyn Shiner on

A couple of months ago I blogged about how I could turn around management information really quickly using FOSS tools and uzERP in particular. Well… today is Dec 1st at 14:00 and I’ve already given my business partner (Clive Birnie – @positivechurn) a P&L for November – it was done by midday and the numbers are solid.

Any of you Management Accountants want to do early closing on the cheap – get in touch (mshiner at uzerp dot com or @uzerp on twitter).

Continue reading »

Customer use case always trips you up

Posted by Martyn Shiner on November 24, 2011

When developing uzERP we’ve tried to make the system as flexible as possible for the many ‘use cases’ that our customers may have. However, sometimes something trips you up that you were not expecting.

Before I explain, a little background is required.

Severn Delta, the original sponsor of uzERP, is a contract manufacturer for certain ‘major’ retailers in the UK. As such there are a limited number of products and those products  are specific to the customer and have a single price. Talon Engineering, the second biggest user, is the opposite – they  have many, many products in their catalogue and a combination of trade/retail and special discounts to arrive at the selling price. uzERP caters for both at order entry time.

Continue reading »

Siege! Benchmarking your web applications

Posted by Martyn Shiner on November 23, 2011

On his development blog Ben discusses Siege! and how to benchmark your web applications.

Continue reading »

Disaster Recovery, Trial by Fire

Posted by Martyn Shiner on November 11, 2011

It’s well known that a backup isn’t really a backup until you have to restored it and is workable again. We regularly do this at uzERP, moving backups of various instances of our app around and rebuilding them to ensure that they’re workable after a restore. We also try to make our application light on dependancies so if needs be uzERP can be installed on a very basic server.

Yesterday we had our first trial by fire (literally) when our sponsor company Severn Delta were prevented from entering their offices because of a serious fire in another building on the same industrial estate. This incident obviously causes a major issue to a busy company especially considering deliveries and collections are scheduled throughout the day.

Continue reading »

Management Information the Severn Delta way

Posted by Martyn Shiner on October 5, 2011

As some of you know, I’m the FD of Severn Delta, uzERP’s sponsoring company. I thought I’d share a little about how uzERP and FOSS helps me do what my business needs me to do – in a hurry!

So, today is the 5th October – 3 working days into the new month. Those that follow me on G+ may have clocked my post on Monday 3rd about me “Doin’ accounts stuff today”. Well by close of play today I had completed:

Continue reading »

Next Page » ← Older posts