Da die neue LTSP Version 19.08, die in den Sommerferien im Rahmen des Google Summer of Code vollständig von Grund auf neu geschrieben wurde, viele Neuerungen bietet, habe ich mich entschlossen, sie in einer virtuellen Maschine auszuprobieren. Besonders reizvoll ist die Neuerung, dass man in 19.08 verschiedene Images auf dem Server zum Booten für die Clients zur Auswahl stellen kann. Es ist sogar möglich, von virtuellen Festplattenabbildern (vmdk) zu booten. Das ermöglicht es, dass man ein Schulsystem in VirtualBox pflegt und dieses dann den Clients über den LTSP zur Verfügung stellt.
Im Folgenden beschreibe ich die zur Installation erforderlichen Schritte. Diese Beschreibung basiert auf einer normalen Desktop-Installation von Ubuntu Mate 18.04 LTS.
Als ersten Schritt muss man die Netzwerkkarten so konfigurieren, dass eine Netzwerkkarte per DHCP bedient wird und dass die andere Netzwerkkarte eine feste IP zugewiesen bekommt. Über diese zweite Netzwerkkarte wird der Server dann die Clients bedienen.
sudo nano /etc/network/interfaces
Die Konfigurationsdatei /etc/network/interfaces sollte wie folgt aussehen. Dabei können die Netzwerkkarten anders heißen als in meinem Beispiel.
auto lo
iface lo inet loopback
auto enp0s3
iface enp0s3 inet dhcp
auto enp0s8
iface enp0s8 inet static
address 192.168.67.1
netmask 255.255.255.0
broadcast 192.168.67.255
Nach diesen Änderungen sollte der Systemdienst, der für die Netzwerkkommunikation verantwortlich ist, neugestartet werden, damit die Änderungen sofort wirksam werden.
sudo systemctl restart networking.service
Im nächsten Schritt müssen einige Pakete entfernt werden, die Probleme verursachen.
Im nächsten Schritt muss das PPA der LTSP-Entwickler hinzugefügt werden, damit man die aktuellen Pakete erhält. In den Ubuntu-Paketquellen sind derzeit noch die alten Pakete enthalten.
sudo add-apt-repository ppa:ltsp
sudo apt update
Jetzt können die für den Betrieb des LTSP erforderlichen Pakete installiert werden.
Der nächste Befehl ermöglicht es dem Systemadministrator, das Monitoring-Tool epotes auszuführen. „administrator“ muss dabei durch den Benutzernamen des LTSP-Admins ersetzt werden.
sudo gpasswd -a administrator epoptes
Der nächste Befehl konfiguriert den LTSP so, dass er auf der internen Netzwerkkarte als DHCP-Server arbeitet und die Clients mit den Images versorgt. Das ist an dieser Stelle eine gewaltige Vereinfachung, weil kein umständliches Bearbeiten von Konfigurationsdateien mehr erforderlich ist.
sudo ltsp dnsmasq --proxy-dhcp=0
Der nächste Befehl erzeugt aus dem Server-Wurzel-Verzeichnis ein bootbares Images für die Clients. Das System, was an die Clients ausgeliefert wird, entspricht also in dieser Konfiguration dem System des Servers. An dieser Stelle wäre es jetzt aber auch möglich, aus einem virtuellen Festplattenabbild (vmdk) ein bootbares Image zu erzeugen. Wie das geht, werde ich ein anderes Mal beschreiben.
sudo ltsp image /
Im nächsten Schritt erzeugt man einen Eintrag für das PXE-Startmenü.
sudo ltsp ipxe
Der nächste Befehl konfiguriert den Server so, dass er das neu erzeugte Image per nfs an die Clients ausliefert.
sudo ltsp nfs
Schließlich wird die initial ramdisk zum Booten erzeugt:
sudo ltsp initrd
Folgendes Skript richtet das Routing vom internen Netz ins externe Netz ein:
Soll der LTSP 19.08 in die IServ-Domäne aufgenommen werden, geht dieses auch. Leider funktioniert dieses nicht mehr so, wie in der Version LTSP5. Mir ist es dennoch gelungen, den LTSP Server in die IServ-Domäne aufzunehmen und für die Nutzerauthentifizierung zu nutzen. Wie das genau geht, darüber werde ich in meinem Blog noch berichten.
Ungeachtet der vielen mobilen Endgeräte und dem Wunsch, flexibel mit einem mobilen Gerät arbeiten zu können, haben bei uns in der Schule die Desktop-Clients noch längst nicht ausgedient. Um die Administration wesentlich zu vereinfachen, haben wir uns vor eineinhalb Jahren entschieden, auf festplattenlose Fat-Clients mit einem Linux-Terminalserver zu setzen.
In diesem Blog-Beitrag werde ich die Installation eines solchen Systems in Verbindung mit dem IServ-Schulserver beschreiben. Meine Anleitung bezieht sich auf LTSP5. Diesen Sommer wurde das LTSP-Projekt von Grund auf neu programmiert.
Wir nutzen aber weiterhin die alte Version, da jetzt alles geschmeidig läuft. Nichtsdestotrotz bietet die neue Version viele Verbesserungen. Deswegen werden wir nächstes Jahr umsteigen und ich werde alles hier dokumentieren.
Diese Anleitung bezieht sich auf Ubuntu Mate 18.04 LTS (Bionic) und einen Server mit zwei Netzwerkkarten (eno1 und eno2).
Der Ubuntu-LTSP-Server in Raum 501 stellt für die dort vorhanden Computer („Clients“) ein Festplattenabbild über das Netzwerk zur Verfügung, von dem die Clients starten. Auf diese Weise benötigen die Clients keine eigene Festplatte mehr und der Wartungsaufwand reduziert sich auf die Aktualisierung des Festplattenabbildes auf dem Server. Zudem können neue Clients direkt und ohne Installationsaufwand in das bestehende Netzwerk integriert werden. Die Clients im Raum 501 befinden sich in einem eigenen Subnetz, was von der internen Netzwerkkarte des Servers bedient wird. Auf dem Server läuft ein DHCP-Server, der den Clients IP-Adressen sowie das Festplattenabbild zum Starten des Betriebssystems zur Verfügung stellt. Ferner arbeitet der Server als Router in das IServ-Netzwerk, sodass ein Zugriff auf dieses sowie auf das Internet möglich ist. Bei der Benutzeranmeldung an einem Client erfolgt eine Authentifizierung über ssh am Server und es wird das Heimatverzeichnis des Nutzers per sshfs eingebunden.
Installation des Grundsystems
Als erstes muss das Grundbetriebssystem Ubuntu Mate 18.04 LTS installiert werden. Von diesem System wird später das Festplattenabbild erstellt, mit dem die Clients starten werden. Dieses bedeutet, dass das Betriebssystem von Server und Clients dasselbe ist. Alle Programme, die auf den Clients verfügbar sein sollen, müssen somit immer zuerst auf dem Server installiert werden. Die Installation des Grundbetriebssystems kann beispielsweise von einem USB-Stick erfolgen. Da es sich hierbei um eine Standardinstallation handelt, wird diese in diesem Handbuch nicht weiter dokumentiert. Im nächsten Schritt müssen die Netzwerkkarten entsprechend unserer Anforderungen konfiguriert werden. Dieses geschieht bei Ubuntu durch das Bearbeiten der Konfigurationsdatei /etc/network/interfaces mit einem Texteditor mit root-Rechten.
sudo nano /etc/network/interfaces
Die Datei muss so angepasst werden, dass eine Netzwerkkarte (in unserem Fall eno1) die IP-Adresse dynamisch per DHCP von dem IServ-DHCP-Server bezieht. Die andere Netzwerkkarte benötigt eine statische IP-Adresse (in unserem Fall eno2). Auf dieser wird dann der interne DHCP-Server „lauschen“ und IP-Adressen sowie das Festplattenabbild an die mit dieser Netzwerkkarte verbundenen Clients verteilen. Diese Konfiguration wird bei unserem Server mit folgender Konfiguration von /etc/network/interfaces erreicht.
auto lo
iface lo inet loopback
auto eno1
iface eno1 inet dhcp
auto eno2
iface eno2 inet static
address 192.168.0.1
netmask 255.255.255.0
broadcast 192.168.0.255
Nach diesen Änderungen sollte der Systemdienst, der für die Netzwerkkommunikation verantwortlich ist, neugestartet werden, damit die Änderungen sofort wirksam werden.
sudo systemctl restart networking.service
Nach der Konfiguration der beiden Netzwerkkarten muss der LTSP-Server installiert werden, der die Programme bereitstellt, die für die Erstellung und Auslieferung des Festplattenabbildes an die Clients verantwortlich sind. Mit folgenden Befehl werden die hierfür erforderlichen Programme installiert.
Im nächsten Schritt muss der interne DHCP-Server so konfiguriert werden, dass er das gewünschte Verhalten zeigt. Als erstes muss dem DHCP-Server mitgeteilt werden, auf welcher Netzwerkkarte er IP-Adressen verteilen soll. Dieses geschieht durch Bearbeiten der Konfigurationsdatei /etc/default/isc-dhcp-server. In dieser Datei muss folgende Bedingung eingetragen werden, damit der DHCP-Server auf der Netzwerkkarte eno2 arbeitet.
INTERFACESv4="eno2"
Für die weitere Konfiguration muss die Datei /etc/ltsp/dhcpd.conf bearbeitet werden.
Nach diesen Änderungen muss der DHCP-Server neugestartet werden, damit die Änderungen sofort wirksam werden.
sudo systemctl restart isc-dhcp-server.service
Jetzt ist das Netzwerk eingerichtet und Clients, die mit der internen Netzwerkkarte des Servers verbunden sind, sollten eine IP-Adresse bekommen. Als nächster Schritt muss das Festplattenabbild erzeugt werden, von dem die Clients starten sollen. Hierfür muss als erstes ein LTSP-Kernel-Update durchgeführt werden.
sudo /usr/share/ltsp/update-kernels
Als nächstes muss das Festplattenabbild erzeugt werden. Je nach Prozessorleistung des Servers und Größe des Abbilds kann dieses mehrere Minuten dauern.
sudo ltsp-update-image --cleanup /
Um Probleme zu vermeiden, sollte an dieser Stelle der nbd-Server neugestartet werden, der die Aufgabe hat, das Festplattenabbild für die Clients zur Verfügung zu stellen.
sudo systemctl restart nbd-server.service
Jetzt bekommen mit der internen Netzwerkkarte des Servers verbundene Clients nicht nur eine IP-Adresse, sondern sie sollten auch mit dem soeben erzeugten Festplattenabbild starten. Allerdings wird man mit den Clients zu diesem Zeitpunkt noch nicht ins Internet kommen, weil der Server noch nicht so konfiguriert ist, dass er Datenpakete von den Clients in das IServ-Netz weiterleitet.
Einrichtung des Servers als Router
In der Konfigurationsdatei /etc/sysctl.conf muss folgende Zeile hinzugefügt werden, die dafür sorgt, dass Datenpakete weitergeleitet werden.
net.ipv4.ip_forward=1
Diese Änderung ist erst nach einem Neustart wirksam. Mit folgendem Befehl kann man das Verhalten aber dennoch sofort erzielen.
sudo sysctl -w net.ipv4.ip_forward=1
Als nächstes muss NAT aktiviert werden. Dieses geschieht mit dem folgenden Befehl.
Um NAT permanent zu aktivieren, müssen wir diese Konfiguration in der Textdatei /etc/ltsp/nat hinterlegen.
sudo sh -c 'iptables-save > /etc/ltsp/nat'
Im folgenden Schritt müssen wir die NAT-Konfiguration in der Datei /etc/network/interfaces für die entsprechende Netzwerkkarte hinterlegen. Dieses geschieht, in dem die folgende Zeile für eno2 als letzte Zeile ergänzt wird.
up iptables-restore < /etc/ltsp/nat
An dieser Stelle sollte nochmals der Netzwerkdienst neugestartet werden.
sudo systemctl restart networking.service
Um sicherzugehen, dass alle Dienste mit der richtigen Konfiguration laufen, kann man aber auch einfach einen kompletten Neustart des Servers durchführen.
sudo reboot
Einrichtung der Anmeldung mit der IServ-Kennung
Damit man sich einfach mit der IServ-Kennung an einem Client anmelden kann, muss man am Server die Benutzerauthentifizierung an der Samba-Domäne „SCHULE“ einrichten. Hierfür müssen zunächst folgende Pakete installiert werden.
Als nächstes muss der LTSP-Server der Domäne „SCHULE“ beitreten.
net rpc join -U benutzername
Hierbei ist „benutzername“ durch den Benutzernamen eines IServ-Domänen-Administrators zu ersetzen. Bei dem Beitritt zur Domäne wird das Passwort des IServ-Domänen-Administrators abgefragt. Als nächstes ist die Konfigurationsdatei /etc/samba/smb.conf wie folgt zu bearbeiten.
[global]
workgroup = SCHULE
security = DOMAIN
os level = 0
local master = No
domain master = No
template homedir = /home/%U
template shell = /bin/bash
winbind separator = +
winbind cache time = 10
winbind enum users = Yes
winbind enum groups = Yes
winbind use default domain = Yes
idmap config * : range = 10000-20000
idmap config * : backend = tdb
Im folgenden Schritt ist in der Datei /etc/nsswitch.conf in den Zeilen, die mit „passwd:“ sowie mit „group“ beginnen noch „winbind“ als letzter Eintrag zu ergänzen. In der Konfigurationsdatei /etc/security/pam_mount.conf.xml muss noch festgelegt werden, wie die Samba-Shares eingebunden werden sollen. Dafür müssen die folgenden Zeilen in /etc/security/pam_mount.conf.xml direkt nach „<!– Volume definitions –>“ eingefügt werden.
Um die Änderungen wirksam werden zu lassen, muss winbind neugestartet werden.
sudo systemctl restart windbind.service
Nach diesen paar kleinen Schritten hat man einen LTSP-Server mit Fat-Clients, an denen man sich mit der IServ-Kennung anmelden und die Netzwerklaufwerke mit Samba nutzen kann.
Aktuellere Software
Um aktuellere Software als die aus den Ubuntu-Paketquellen zu erhalten, ist es empfehlenswert das Repository des „Hellenic Schools Technical Support Team“ zu den Paketquellen hinzuzufügen. Dieses wird sehr gut gewartet und Bugs werden schnell durch entsprechende Updates behoben.
Zur Verwaltung unserer zahlreichen Linux-Notebooks verwenden wir die Open-Source-Software Ansible. Diese ermöglicht uns eine extrem leichte Softwareverteilung, eine Ad-hoc-Kommando-Ausführung auf allen unseren Clients sowie ein einfaches Konfigurationsmanagement. Ansible verwaltet Netzwerkcomputer über SSH und erfordert keinerlei zusätzliche Software auf dem zu verwaltenden System. Ansible kann sogar Windows-Clients managen.
Ansible lässt sich bei Ubuntu sowie Debian ganz bequem über die Paketquellen installieren:
sudo apt install ansible
Damit sich Ansible auf den Client-Systemen anmelden kann, benötigt man einen ssh-Schlüssel, den man mit dem folgenden Befehl erstellt:
ssh-keygen -b 4096
Nach der Erstellung muss dieser Schlüssel auf die Clients kopiert werden, die verwaltet werden sollen. Dieses geschieht mit dem folgenden Befehl:
Dabei muss „benutzer“ durch den Benutzernamen ersetzt werden, unter dem Ansible laufen soll und zudem muss „IP-Adresse“ durch die korrekte IP-Adresse des Clients ersetzt werden. Nach der Verteilung des öffentlichen ssh-Schlüssels an die Clients müssen diese in die Datei /etc/ansible/hosts eingetragen werden. Es folgt ein Beispiel für unsere Roboter-AG-Laptops:
[RoboLaptops]
10.1.11.1
10.1.11.2
Ad-hoc-Kommando-Ausführung auf den Clients
Nachdem alle Clients, die verwaltet werden sollen, in die Datei /etc/ansible/hosts eingetragen und der öffentliche ssh-Schlüssel auf die Geräte übertragen wurde, kann man Ansible testen und einen Befehl auf allen Clients einer Gruppe (z.B. „RoboLaptops“) ausführen:
ansible RoboLaptops -u benutzer -a "shutdown -h now"
Dieses Kommando führt nun auf allen entsprechenden Geräten, die der Gruppe „RoboLaptops“ angehören, den Befehl „shutdown -h now“ aus und fährt die Geräte somit herunter. Zum Herunterfahren sind allerdings root-Privilegien erforderlich, weswegen der Befehl, so wie angegeben, nur funktioniert, wenn der Benutzer root ist.
Nutzung von „playbooks“
Damit man nicht immer einzelne Befehle eingeben muss, die dann auf allen Clients ausgeführt werden, gibt es sogenannte „playbooks“. Dabei handelt es sich um eine YAML-Datei, die die zu erreichende Konfiguration und Befehlsabfolge auf den Clients beschreibt. Die folgende Datei „e31.yml“ sorgt dafür, dass alle Clients im PC-Raum E31 die Paketquellen aktualisieren, alle verfügbaren Updates installieren und nicht mehr benötige Abhängigkeiten entfernen:
---
- hosts: E31
remote_user: root
tasks:
- name: Run the equivalent of "apt-get update" as a separate step
apt:
update_cache: yes
- name: Update all packages to the latest version
apt:
upgrade: dist
dpkg_options: 'force-confold,force-confdef'
- name: Remove dependencies that are no longer required
apt:
autoremove: yes