LTSP on LXD: A Fun Dev Trip
Source: Dev.to
Introduction
Recently I’ve been excited about setting up a little ‘homelab’ to experiment with virtual machines (VMs), containers, Linux admin, and networking.
There are two problems: first, I don’t yet have hard drives for my machines and second, I don’t yet have a great place for the machines to be set up.
To solve the first problem (lack of drives), I’ve been looking at a project I first played with years ago – LTSP, the Linux Terminal Server Project. LTSP makes “maintaining tens or hundreds of diskless clients is as easy as maintaining a single PC”. The ‘terminals’ (client machines) will boot over the network without needing any permanent storage attached.
To solve the second problem (lack of space), I’m initially going to skip setting up any physical client machines altogether. The idea is to run both the LTSP server and the LTSP client “machine” as containerized instances inside my dev box (e.g. laptop). There are a number of ways this can be done, and many homelabbers might use Proxmox if they have that running already, but today I’m going to use software from Canonical (the company behind Ubuntu Linux) called LXD. Later, after getting the systems set up virtually, I could plug in actual physical machines with very little changes and have it all just work.
In this post, I’ll be talking about using LXD with LTSP, but the same approach works for any set of instances you want to run for development purposes. I’ll use “instances” to refer to either a virtual‑machine instance or a system‑container instance.
Article © 2025. All rights reserved. Not for AI/ML training or data‑mining use.
Why LXD?
We use LXD for its ability to manage both virtual machines and system containers.
- If we wanted to run just a single application in a container, we’d use something like Docker.
- In this case we need to run an entire Linux operating system in a container, which is possible via the Linux kernel’s LXC (“Linux Containers”) system. We’ll get an LTSP client set up as a VM (booting via iPXE) and the LTSP server set up as a system container.
LXD provides KVM‑based VMs and system containers based on LXC – that can run a full Linux OS – in a single open‑source virtualization platform. ref
Note: LXC stands for “Linux Containers”, so naturally LXD stands for “Linux Container Daemon”. If “lxd” vs “lxc” is confusing, see the explanation here.
This setup also allows us to develop on a personal machine without needing to install Proxmox on bare metal, saving us from requiring a dedicated server.
Sidenote
- In 2023, Canonical took more direct control of the LXD project (which they had sponsored from its beginning); this prompted the creation of a community fork, Incus. You can use either one fairly interchangeably, and these notes may help if you want to switch.
Why LTSP?
Linux Terminal Server Project makes it easy to manage multiple diskless computers. It’s useful for reducing costs or admin effort in labs, schools, homes, or even a small research cluster.
LTSP can be set up in many ways. The hypothetical LTSP network I’ll emulate looks like this:
(We’ll simplify: since all our hypothetical clients are identical, we’ll start with a single client.)
Prerequisites
If you’d like to follow along, you’ll need:
- A computer running Linux with internet access and root/sudo privileges (a Debian or Ubuntu variant works best).
- Sufficient disk space on that computer to store the VM images.
That’s it! In a future post I’ll share more on testing this with real client machines.
You can also follow along without a native Linux host by running a Linux VM on macOS/Windows, or even using an online environment such as Killercoda Ubuntu Playground.
For this guide we’ll use Linux Mint because it’s a good choice in a school context. (I initially tried Ubuntu 25.10 but ran into conflicts between cloud‑init and LTSP, so Mint avoids those headaches. I may write up a workaround later.)
Virtual Network Overview
The architecture is simple: one “computer” for the server and one for the client (additional clients can be added later). The setup aims to:
- Roughly match the physical network topology illustrated above (server with two connections: internet and a switch).
- Work around an issue that can arise when running an LTSP network with LXD.
The server can be either a VM or a system container, but the client must be a VM so it can run the full boot process.
For the unfamiliar, lxdbr0 and lxdbr1 are bridge devices created by LXD on the host. They act like physical switches, allowing containers to communicate with each other and the outside world. In our setup the server and client communicate over lxdbr1. These bridges also provide DHCP and NAT, so lxdbr0 effectively acts as the internet router in the physical topology.
Now that you know where we’re heading, let’s get started!
Step 1: Install LXD
The following commands work on a modern Ubuntu‑based system. Refer to the LXD documentation and the ‘first steps’ tutorial if your situation differs.
sudo snap install lxd
sudo lxd init # run as root
You’ll then be prompted to configure LXD.

