# LTSP — Linux Terminal Server Project

# 1. Introducció 

**LTSP** (*Linux Terminal Server Project*) és una solució de codi obert que permet que ordinadors antics, o sense disc dur, arrenquin a través de la xarxa i s'executen íntegrament des d'un servidor central. El client no necessita sistema operatiu propi: carrega un entorn Linux complet des del servidor.

![LTSP logo](https://proferamon.com/tic/imatges/ltsp/ltsp01.png)

## 1.1. Casos d'ús típics

- **Aules informàtiques** amb equips heterogenis o obsolets.
- **Entorns corporatius** on es vol centralitzar la gestió del sistema operatiu.
- **Laboratoris** de pràctiques de sistemes operatius en xarxa.
- **Thin clients** (terminals lleugers) comercials o reciclats.

## 1.2. LTSP clàssic vs. LTSP modern (≥ v5.x / LTSP 2019+)

| Característica | LTSP clàssic (< 2019) | LTSP modern (≥ 2019) |
|---|---|---|
| Execució de les aplicacions | Al servidor (X11 forwarding) | Al client (imatge squashfs) |
| Requisits de CPU del servidor | Molt alts | Moderats |
| Requisits del client | Mínims | Alts (executa el sistema) |
| Complexitat | Alta | Moderada |
| Distribucions suportades | Debian, Ubuntu | Debian, Ubuntu, Fedora… |

Aquesta guia cobreix **LTSP modern** (versió ≥ 23.x), basat en imatges squashfs i arrencada iPXE/PXE.

# 2. Arquitectura general

![Arquitectura general](https://proferamon.com/tic/imatges/ltsp/ltsp02.png)

**Flux d'arrencada:**

1. El client engega i el seu firmware (BIOS/UEFI) fa una petició DHCP.
2. El servidor DHCP respon amb una IP i l'adreça del servidor TFTP.
3. El client descarrega el fitxer d'arrencada **iPXE** via TFTP.
4. iPXE descarrega el **kernel Linux** i un **initrd** mínim via HTTP/TFTP.
5. L'initrd munta la imatge **squashfs** del sistema via **NFS** o **NBD**.
6. El client inicia una sessió gràfica (SDDM, LightDM…) localment.
7. L'autenticació es fa contra el servidor (LDAP, NIS, fitxers locals sincronitzats…).

# 3. Requisits del sistema

## 3.1. Servidor

| Component | Mínim recomanat |
|---|-----------|
| CPU | 4 nuclis |
| RAM | 4 GB + ~200 MB per client concurrent |
| Disc | 20 GB (SO) + espai per a la imatge (~5–10 GB) |
| Xarxa | 1 Gbps (Gigabit Ethernet obligatori) |
| SO | Debian 12 o Ubuntu 22.04/24.04 LTS |

> [!NOTE] 
> Amb 30 clients simultanis calen ~10 GB de RAM addicionals al servidor si la imatge es munta per NBD en RAM; amb NFS el consum és menor.

## 3.2. Client

| Component | Mínim |
|---|---------|
| CPU | x86_64, qualsevol |
| RAM | 512 MB (1 GB recomanat per a entorn gràfic) |
| Xarxa | Targeta amb suport PXE (pràcticament universal des de 2005) |
| Disc | No necessari |

# 4. Instal·lació del servidor LTSP {#installacio-del-servidor-ltsp}

## 4.1. Prerequisits

```bash
sudo apt update && sudo apt upgrade -y
sudo apt install --no-install-recommends \
    dnsmasq \
    nfs-kernel-server \
    openssh-server \
    curl \
    squashfs-tools
```

> En entorns de producció es pot usar un servidor DHCP extern (router, pfSense…). En aquest cas, `dnsmasq` s'usa únicament com a proxy PXE.

## 4.2. Instal·lació de LTSP

```bash
sudo apt install ltsp
```

A Debian/Ubuntu el paquet `ltsp` ja inclou:

- `ltsp-server` — eines del servidor
- `ltsp-client` — components que van a la imatge
- Scripts d'inicialització i servei systemd

Comprova la versió instal·lada:

```bash
ltsp --version
```

## 4.3. Inicialització del servidor

```bash
# Genera la configuració bàsica del servidor
sudo ltsp init
```

Això crea `/etc/ltsp/ltsp.conf` amb valors per defecte.

# 5. Creació de la imatge del client

LTSP genera una imatge comprimida (squashfs) que els clients carreguen a la RAM o munten per xarxa.

## Opció A: imatge basada en el mateix servidor (recomanada)

```bash
sudo ltsp image /
```

Crea `/srv/ltsp/images/amd64.img` a partir del sistema de fitxers del servidor. Qualsevol programari instal·lat al servidor estarà disponible als clients.

## Opció B: imatge en un chroot separat

```bash
# Crea un chroot de Debian minimal
sudo debootstrap --arch=amd64 bookworm /srv/ltsp/bookworm

# Instal·la paquets dins el chroot
sudo chroot /srv/ltsp/bookworm apt install \
    task-xfce-desktop \
    ltsp-client \
    firefox-esr

# Genera la imatge a partir del chroot
sudo ltsp image /srv/ltsp/bookworm
```

Útil si vols que els clients tinguin un entorn diferent del servidor.

## 5.1 Actualització de la imatge

Cada cop que instal·les programari nou o fas canvis al sistema, has de regenerar la imatge:

```bash
sudo ltsp image /
```

I actualitzar el fitxer d'arrencada iPXE:

```bash
sudo ltsp ipxe
```

# 6. Configuració de xarxa: DHCP i TFTP

## Escenari 1: dnsmasq com a servidor DHCP complet

Edita `/etc/dnsmasq.d/ltsp.conf`:

```bash
sudo nano /etc/dnsmasq.d/ltsp.conf
```

```nano
# Interfície on escolta (canvia-la pel nom correcte)
interface=enp3s0
bind-interfaces

# Rang DHCP per als clients
dhcp-range=192.168.1.100,192.168.1.200,12h

# Servidor TFTP integrat
enable-tftp
tftp-root=/srv/tftp

# Fitxer d'arrencada per a clients BIOS (PXE legacy)
dhcp-boot=ltsp/ipxe.efi,ltsp-server,192.168.1.1

# Fitxer d'arrencada per a clients UEFI
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-boot=tag:efi-x86_64,ltsp/ipxe.efi
```

```bash
sudo systemctl restart dnsmasq
```

## Escenari 2: DHCP extern (router) + dnsmasq com a proxy PXE

Si ja tens un servidor DHCP a la xarxa (molt habitual a les aules), configura `dnsmasq` en mode **proxy PXE**:

```ini
# Proxy PXE — no assigna IPs, només respon les peticions PXE
dhcp-range=192.168.1.0,proxy

enable-tftp
tftp-root=/srv/tftp
dhcp-boot=ltsp/ipxe.efi
```

## 6.1 Generació dels fitxers TFTP i iPXE

```bash
sudo ltsp ipxe
sudo ltsp tftp
```

Això copia el kernel, l'initrd i els fitxers iPXE a `/srv/tftp/ltsp/`.

# 7. Configuració d'NFS 

Els clients necessiten accedir a la imatge squashfs. La manera més habitual és exportar-la via **NFS**.

## 7.1. Exportació automàtica (recomanada)

```bash
sudo ltsp nfs
```

Afegeix automàticament a `/etc/exports`:

```bash
sudo nano /etc/exports
```

```nano
/srv/ltsp  *(ro,async,no_subtree_check,no_root_squash)
```

I reinicia el servei:

```bash
sudo exportfs -arv
sudo systemctl restart nfs-kernel-server
```

## 7.2. Verificació

```bash
showmount -e localhost
```

Hauries de veure `/srv/ltsp` a la llista.

# 8. Arrencada dels clients per xarxa

## 8.1. Configuració del client (BIOS/UEFI)

1. Accedeix al BIOS/UEFI del client (normalment `F2`, `Del`, `F12`…).
2. Activa **Network Boot** o **PXE Boot**.
3. Posa el **Boot from Network** com a primera opció d'arrencada.
4. Desa i reinicia.

## 8.2. Seqüència esperada

```ini
Initializing Intel® Boot Agent...
CLIENT MAC ADDR: 00:1A:2B:3C:4D:5E
DHCP.......  OK (192.168.1.105)
TFTP...........
iPXE 1.x.x ...
Loading ltsp/vmlinuz... OK
Loading ltsp/initrd.img... OK
Booting kernel...
[LTSP] Mounting image via NFS...
[OK] Started Session Manager.
```

Si tot va bé, el client presentarà la pantalla d'inici de sessió gràfica.


# 9. Gestió d'usuaris

## 9.1. Usuaris locals (entorn senzill)

En LTSP modern, els usuaris creats al servidor estan disponibles als clients sempre que la imatge s'hagi generat amb `ltsp image /`:

```bash
sudo adduser alumne01
sudo passwd alumne01
```

## 9.2. Sincronització de comptes sense LDAP

LTSP pot sincronitzar `/etc/passwd` i `/etc/shadow` a la imatge:

```bash
# A /etc/ltsp/ltsp.conf
[common]
PWMERGE_SUR="^(?!ltsp|nobody|root)"
```

Regenera la imatge per aplicar els canvis:

```bash
sudo ltsp image /
```

## 9.3. Integració amb LDAP / Active Directory

Per a entorns amb molts usuaris, el recomanable és autenticació centralitzada:

```bash
sudo apt install sssd sssd-ldap
```

Configura `/etc/sssd/sssd.conf`:

```bash
sudo nano /etc/sssd/sssd.conf
```

```nano
[sssd]
services = nss, pam
domains = ldap

[domain/ldap]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldap://192.168.1.10
ldap_search_base = dc=institut,dc=cat
ldap_default_bind_dn = cn=admin,dc=institut,dc=cat
ldap_default_authtok = contrasenya_admin
cache_credentials = True
```

```bash
sudo chmod 600 /etc/sssd/sssd.conf
sudo systemctl enable --now sssd
```

# 10. Personalització de la imatge

## 10.1. Instal·lació de programari addicional

Tot el que instal·les al servidor (si uses `ltsp image /`) estarà als clients:

```bash
sudo apt install libreoffice gimp inkscape vlc
sudo ltsp image /
```

## 10.2. Scripts d'inici de sessió

Pots executar scripts personalitzats quan un usuari inicia sessió. Crea fitxers a `/etc/ltsp/xsessionrc.d/`:

```bash
# /etc/ltsp/xsessionrc.d/10-munta-xarxa.sh
#!/bin/bash
# Munta una carpeta de xarxa en iniciar sessió
mount -t cifs //servidor/compartit /home/$USER/Compartit \
    -o username=$USER,password=$PASSWORD,uid=$UID
```

```bash
sudo chmod +x /etc/ltsp/xsessionrc.d/10-munta-xarxa.sh
sudo ltsp image /
```

## 10.3. Fons de pantalla i configuració gràfica

```bash
# Copia el fons corporatiu
sudo cp fons_institut.png /usr/share/backgrounds/

# Edita la configuració per defecte del gestor de pantalla
# Per a XFCE:
sudo mkdir -p /etc/skel/.config/xfce4/xfconf/xfce-perchannel-xml/
```

# 11. Opcions avançades d'ltsp.conf

El fitxer `/etc/ltsp/ltsp.conf` permet una personalització detallada. Admet seccions globals i per MAC/IP.

```bash
sudo nano /etc/ltsp/ltsp.conf
```

```nano
[common]
# Servidor SSH per al túnel de sessió
SERVER=192.168.1.1

# Resolució de pantalla per defecte
XRANDR_SIZE=1920x1080

# Gestor de pantalla
DISPLAY_MANAGER=lightdm

# Desactiva l'apagada del client des del menú
AUTOLOGIN=alumne_demo

[mac:00:1A:2B:3C:4D:5E]
# Configuració específica per a una màquina
XRANDR_SIZE=1280x1024
KEEP_SYSTEM_SERVICES=bluetooth

[ip:192.168.1.110]
# Configuració per IP
AUTOLOGIN=professor
```

## 11.1. Paràmetres habituals

| Paràmetre | Descripció | Exemple |
|---|---|---|
| `SERVER` | IP del servidor LTSP | `192.168.1.1` |
| `DISPLAY_MANAGER` | Gestor de sessió gràfica | `lightdm`, `sddm` |
| `AUTOLOGIN` | Usuari per a inici automàtic | `alumne` |
| `XRANDR_SIZE` | Resolució de pantalla | `1920x1080` |
| `SOUND` | Activa el so al client | `true` |
| `CRONTAB_x` | Tasques cron al client | `CRONTAB_01="@reboot ntpdate …"` |
| `KEEP_SYSTEM_SERVICES` | Serveis systemd que s'han de mantenir | `bluetooth cups` |

# 12. Resolució de problemes habituals

## 12.1. El client no rep IP

```bash
# Comprova que dnsmasq està en marxa
sudo systemctl status dnsmasq

# Revisa els logs de DHCP
sudo journalctl -u dnsmasq -f

# Verifica que no hi ha conflicte amb un altre DHCP a la xarxa
sudo nmap -sU -p 67 192.168.1.0/24
```

## 12.2. El client rep IP, però no carrega el kernel

```bash
# Comprova que TFTP funciona des d'un altre equip
sudo apt install tftp-hpa
tftp 192.168.1.1 -c get ltsp/ipxe.efi

# Regenera els fitxers TFTP
sudo ltsp tftp
sudo ltsp ipxe
```

## 12.3. Error "Cannot mount NFS"

```bash
# Verifica l'exportació NFS
showmount -e 192.168.1.1

# Comprova el tallafoc
sudo ufw allow from 192.168.1.0/24 to any port 2049
sudo ufw allow from 192.168.1.0/24 to any port 111

# Torna a exportar
sudo exportfs -arv
```

## 12.4. El client arrenca, però no mostra pantalla de login

```bash
# Comprova la imatge squashfs
sudo ltsp image --verify /

# Mira els logs del client (si tens accés a la consola)
# A la consola del client, prem Ctrl+Alt+F2 per accedir a un TTY
journalctl -b -u display-manager
```

## 12.5. Usuaris no poden autenticar-se

```bash
# Prova l'autenticació SSH directament
ssh alumne01@192.168.1.1

# Comprova PAM
sudo cat /var/log/auth.log | grep -i pam

# Si uses SSSD
sudo sss_cache -G -U
sudo systemctl restart sssd
```

# 13. Resum d'ordres

| Ordre | Descripció |
|---|---|
| `sudo ltsp init` | Inicialitza la configuració del servidor |
| `sudo ltsp image /` | Genera la imatge squashfs del sistema |
| `sudo ltsp image /chroot` | Genera la imatge d'un chroot |
| `sudo ltsp image --verify /` | Verifica la integritat de la imatge |
| `sudo ltsp ipxe` | Genera/actualitza els fitxers iPXE |
| `sudo ltsp tftp` | Copia els fitxers d'arrencada a TFTP |
| `sudo ltsp nfs` | Configura i exporta via NFS |
| `sudo ltsp info` | Mostra informació de la configuració actual |
| `sudo ltsp dnsmasq` | Genera la configuració de dnsmasq |
| `sudo exportfs -arv` | Actualitza les exportacions NFS |
| `showmount -e localhost` | Llista les exportacions NFS actives |

# 14. Recursos addicionals

- [Web oficial LTSP](https://ltsp.org)
- [Documentació LTSP a GitHub](https://github.com/ltsp/ltsp/wiki)
- [Paquet ltsp a Debian](https://packages.debian.org/search?keywords=ltsp)

#### Versions d'aquest document

+ HTML - [ltsp.html](https://proferamon.com/tic/ltsp.html)
+ PDF - [ltsp.pdf](https://proferamon.com/tic/docs/ltsp.pdf)
+ ODT - [ltsp.odt](https://proferamon.com/tic/odt/ltsp.odt)
+ MD - [ltsp.md](https://proferamon.com/tic/md/ltsp.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)
