Void-Linux als X2Go-ThinClient/-Server Lösung konfigurieren

Die Anleitung(1) zur Konfiguration einer Thin-Client Umgebung mittels X2Go ist unnötig komplex und kann mit Hilfe der richtigen Werkzeuge drastisch vereinfacht werden.

Hier sind die notwendigen Schritte erläutert um Void-Linux als Server zu nutzen. Dieser stellt alles Notwendige bereit um Clients über das Netzwerk zu booten und ihn dann so zu nutzen, als wäre der Benutzer am Server lokal eingeloggt:

  • Ein DHCP-Dienst weist dem Client eine IP Adresse zu und teilt ihm mit wo die Inhalte für den weiteren Bootvorgang zu finden sind.
  • Ein TFTP-Dienst stellt dem Client einen Bootloader zur Verfügung, welcher im weiteren Schritt Kernel und Init-Umgebung laden kann.
  • Ein HTTP-Dienst stellt dem Client letztendlich Kernel, Init-Umgebung und ein vollständiges Betriebssystem-Abbild zur Verfügung.
  • Zu der am Server installierten grafischen Oberfläche XFCE verbindet sich der Client am Ende des Startvorgangs via X2Go-Client.

In diesem Beispiel wird in einer bereits vorbereiteten Void-Linux Installation(2) die Netzwerk-Schnittstelle eth1 als 192.168.0.3/24 konfiguriert.

Am Server sollten dafür mindestens 10 GB Festplattenkapazität zur Verfügung stehen und Clients sollten über mindestens 1 GB RAM verfügen.

Server für X2Go-Verbindungen vorbereiten

Pakete installieren und X2Go-Server vorbereiten

xbps-install -Suy dhcp syslinux tftpd-hpa darkhttpd xfce4 x2goserver curl dracut-network binutils squashfs-tools
ln -s /etc/sv/x2gocleansessions /var/service/
x2godbadmin --createdb

# X2Go-Verbindung zu Desktopumgebung von Void-Clients ermöglichen
sed -i 's#/etc/redhat-release ]#/etc/redhat-release ] || [ -d /usr/share/void-artwork ]#g' /etc/x2go/Xsession

XFCE ohne Compositor starten

Mit aktivem Compositor ist XFCE in X2Go quasi unbrauchbar(3). Er kann aber einfach deaktiviert werden:

cat >> /usr/local/bin/xfce << EOF
#!/bin/sh
/usr/bin/xfconf-query -c xfwm4 -p /general/use_compositing -s false
/usr/bin/xfce4-session
EOF

chmod +x /usr/local/bin/xfce

Netzwerk-Schnittstelle konfigurieren

cat >> /etc/rc.local << EOF
ip addr add 192.168.0.3/24 brd 192.168.0.255 dev eth1
ip link set eth1 up alias "'Network for Thin-Clients'"
EOF

/etc/rc.local

Dienste einrichten

Die Dienste stellen die eingangs genannten Boot-Schritte zur Verfügung: DHCP > TFTP > HTTP.

DHCP

cat >> /etc/dhcpd.conf << EOF
authoritative;
subnet 192.168.0.0 netmask 255.255.255.0 {
    range 192.168.0.20 192.168.0.250;
    option domain-name "local";
    option domain-name-servers 192.168.0.3;
    option broadcast-address 192.168.0.255;
    option routers 192.168.0.3;
    option subnet-mask 255.255.255.0;
    option root-path "/";
    filename "lpxelinux.0";
}
EOF

cp -a /etc/sv/dhcpd4 /etc/sv/dhcpd4-eth1
sed -i 's#dhcpd4.pid}$#dhcpd4.pid} eth1#g' /etc/sv/dhcpd4-eth1/run
ln -s /etc/sv/dhcpd4-eth1 /var/service/dhcpd4-eth1

TFTP

# PXE Netzwerk-Bootloader anbieten
cp -a /usr/lib/syslinux/ldlinux.c32 /usr/lib/syslinux/lpxelinux.0 /var/lib/tftp/

mkdir /var/lib/tftp/pxelinux.cfg
cat >> /var/lib/tftp/pxelinux.cfg/default << EOF
DEFAULT x2go-tce

LABEL x2go-tce
TIMEOUT 50
MENU LABEL X2Go-TCE
KERNEL http://192.168.0.3/vmlinuz
INITRD http://192.168.0.3/initrd.img
APPEND root=live:http://192.168.0.3/void.squashfs ro rd.live.image
EOF

ln -s /etc/sv/tftpd-hpa /var/service/

HTTP

# Netzwerk-Bootfähiges System bereit stellen
cp /boot/vmlinuz-`uname -r` /srv/www/darkhttpd/vmlinuz
dracut --omit "bash drm btrfs crypt dmraid lvm kernel-modules kernel-modules-extra mdraid nvdimm qemu cifs lunmask nfs resume terminfo usrmount virtfs" --add "livenet" /srv/www/darkhttpd/initrd.img
chmod +r /srv/www/darkhttpd/initrd.img

ln -s /etc/sv/darkhttpd /var/service/

An dieser Stelle sind alle Dienste des Servers vollständig konfiguriert. Es fehlt lediglich das Betriebssystem-Abbild welches der HTTP-Dienst dem Client bereit stellt.

Das Erstellen des Abbilds ist in folgendem Abschnitt erläutert.


Betriebssystem-Abbild für den Thin-Client vorkonfigurieren

Über https://voidlinux.org/download/ kann das tar-Archiv eines Void-Grundsystems gefunden werden.

Grundsystem installieren

URL=https://alpha.de.repo.voidlinux.org/live/current/void-x86_64-musl-ROOTFS-20210930.tar.xz
cd ~
curl -o rootfs.tar.xz "$URL"
mkdir ~/thin && tar xvf rootfs.tar.xz -C ~/thin

mount --rbind /sys  ~/thin/sys  && mount --make-rslave ~/thin/sys
mount --rbind /dev  ~/thin/dev  && mount --make-rslave ~/thin/dev
mount --rbind /proc ~/thin/proc && mount --make-rslave ~/thin/proc

cp /etc/resolv.conf ~/thin/etc/
echo "client" > ~/thin/etc/hostname

chroot ~/thin/ /bin/xbps-install -Suy xbps
chroot ~/thin/ /bin/xbps-install -uy
chroot ~/thin/ /bin/xbps-install -y base-system xorg-video-drivers xorg-fonts xorg-input-drivers xorg-minimal x2goclient
chroot ~/thin/ /bin/xbps-remove -y base-voidstrap
rm -Rf ~/thin/var/cache/xbps

chroot ~/thin/ /bin/passwd

X2Go-Verbindung definieren

chroot ~/thin/ /bin/mkdir /root/.x2goclient/

cat >> ~/thin/root/.x2goclient/sessions << EOF
[server]
clipboard=none
command=xfce
fullscreen=true
host=192.168.0.3
name=srv
icon=/usr/share/void-artwork/void-logo.svg
user=
EOF

Schritte des Systemstarts automatisieren

# root automatisch einloggen
sed -i 's#GETTY_ARGS=.*#GETTY_ARGS="--autologin root --noclear"#g' ~/thin/etc/sv/agetty-tty1/conf

# X auf tty0 automatisch starten
echo '[ `fgconsole` -eq 1 ] && startx' > ~/thin/root/.profile

# X2Go-Client automatisch starten
echo 'exec x2goclient --thinclient --session=srv --add-to-known-hosts --no-menu --no-session-edit --branding=/dev/null' > ~/thin/root/.xinitrc

# Herunterfahren per Ausschaltknopf ermöglichen
chroot ~/thin/ /bin/ln -s /etc/sv/acpid /etc/runit/runsvdir/default/acpid

Betriebssystem-Abbild als SquashFS verpacken

Spezielle Dateisysteme aus chroot aushängen

umount --recursive ~/thin/sys ~/thin/dev ~/thin/proc

Betriebsystem-Abbild generieren und in HTTP-Server erstellen

mksquashfs ~/thin /srv/www/darkhttpd/void.squashfs

An dieser Stelle sollte ein Client über das Netzwerk via PXE booten können.

Im letzten Abschnitt sei noch erläutert, wie man prüft ob jeder der Dienste die notwendigen Dateien korrekt ausliefert.


Konfiguration überprüfen

Antowort des DHCP-Dienstes prüfen

dhcpcd -T eth1

Verfügbarkeit der Dateien des TFTP-Dienstes prüfen

cd `mktemp -d`
tftp 192.168.0.3 -c get pxelinux.cfg/default
tftp 192.168.0.3 -c get vmlinuz 
tftp 192.168.0.3 -c get initrd.img
stat default vmlinuz initrd.img

Verfügbarkeit der Dateien des HTTP-Dienstes prüfen

curl http://192.168.0.3/void.squashfs -o /dev/null

1 X2Go-ThinClientEditon-Live Installation Guide

2 Void-Handbook: Installation

3 X2Go Desktop Environment Compatibility

4 Void-Handbook: Installation via the ROOTFS Method