# Maschinen

Doku über die Maschinen (virtuell und physikalisch) des PING e.V.

# vserver.ping.de

## Was ist LXC und warum machen wir damit VServer

LXC steht für Linux-Containers und ist eine Art virtueller Server für Linux. Dabei nutzen alle virtuellen Server-Instanzen den Kernel der Wirtsystems mit. Implementiert werden die Container in Linux über die Namespace Erweiterungen, die dafür sorgen, dass Prozesse in eigene Adressräume isoliert werden können. Da dies nicht nur Prozesse und Speicher, sondern auch Netzwerke umfasst, können hiermit vollständige virtuelle Server implementiert werde. <span class="anchor" id="bkmrk-"></span><span class="anchor" id="bkmrk--1"></span>

Bislang wurde bei PING die ältere Linux-VServer-Implentierung eingesetzt, die einen eigenen Kernel-Patch und Userspace-Tools implementiert. Bis zur Version Squeeze von Debian wurde dabei vom Debian-Kernel-Team ein entsprechend gepatchter Kernel zur Verfügung gestellt. Mit Release von Wheezy wurde dies allerdings zu Gunsten der weiter fortgeschrittenen Entwicklung der Linux-Containers entfernt. <span class="anchor" id="bkmrk--2"></span><span class="anchor" id="bkmrk--3"></span>

Für Linux-Containers sind einige Optionen zu Namespaces zu aktivieren, was aber bei den Kernel-Images von Debian bereits der Fall ist. Es ist somit nur noch das Paket *lxc* zu installieren, welches die Userspace-Tools zu Erzeugung und Verwaltung der Container enthält.

### Probleme

<span class="anchor" id="bkmrk--5"></span><span class="anchor" id="bkmrk--6"></span>

LXC ist noch in der Entwicklung, früher waren LXC-Container nicht ausbruchsicher, dies ist aber seit Debian Jessie nicht mehr der Fall siehe [https://wiki.debian.org/LXC](https://wiki.debian.org/LXC) <span class="anchor" id="bkmrk--7"></span><span class="anchor" id="bkmrk--8"></span>

### Installation des Hosts

<span class="anchor" id="bkmrk--10"></span>

Der Anleitung im [Debian Wiki](https://wiki.debian.org/LXC) folgend, muss zunächst das LXC-Paket installiert werden: <span class="anchor" id="bkmrk--11"></span><span class="anchor" id="bkmrk--12"></span><span class="anchor" id="bkmrk--13"></span><span class="anchor" id="bkmrk--14"></span><span class="anchor" id="bkmrk--15"></span><span class="anchor" id="bkmrk--16"></span><span class="anchor" id="bkmrk--17"></span><span class="anchor" id="bkmrk--18"></span><span class="anchor" id="bkmrk--19"></span><span class="anchor" id="bkmrk--20"></span><span class="anchor" id="bkmrk--21"></span><span class="anchor" id="bkmrk--22"></span><span class="anchor" id="bkmrk--23"></span><span class="anchor" id="bkmrk--24"></span><span class="anchor" id="bkmrk--25"></span><span class="anchor" id="bkmrk--26"></span>

```
root@containers:~# apt-get install lxc
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following additional packages will be installed:
  arch-test bridge-utils busybox-static cloud-image-utils debootstrap distro-info dns-root-data dnsmasq-base genisoimage libaio1 libglib2.0-0 libglib2.0-data liblxc1 libpam-cgfs lxc-templates lxcfs qemu-utils rsync shared-mime-info uidmap uuid-runtime xdg-user-dirs
Suggested packages:
  cloud-utils-euca ubuntu-archive-keyring squid-deb-proxy-client shunit2 wodim cdrkit-doc btrfs-progs lvm2 python3-lxc qemu-block-extra
The following NEW packages will be installed:
  arch-test bridge-utils busybox-static cloud-image-utils debootstrap distro-info dns-root-data dnsmasq-base genisoimage libaio1 libglib2.0-0 libglib2.0-data liblxc1 libpam-cgfs lxc lxc-templates lxcfs qemu-utils rsync shared-mime-info uidmap uuid-runtime xdg-user-dirs
0 upgraded, 23 newly installed, 0 to remove and 0 not upgraded.
Need to get 8030 kB of archives.
After this operation, 34.4 MB of additional disk space will be used.
Do you want to continue? [Y/n]
```

<span class="anchor" id="bkmrk--28"></span><span class="anchor" id="bkmrk--29"></span>

### Vorbereitung der unprivilegierten Root-Container

<span class="anchor" id="bkmrk--31"></span>

Da die als VServer gedachten Container von Root während des Startes des Systems erzeugt werden, diese aber unprivilegiert sein sollen, muss ein uid- und gid-Bereich dem Nutzer Root zugewiesen werden (vergl. [https://linuxcontainers.org/lxc/getting-started/#creating-unprivileged-containers-as-root](https://linuxcontainers.org/lxc/getting-started/#creating-unprivileged-containers-as-root)): <span class="anchor" id="bkmrk--32"></span><span class="anchor" id="bkmrk--33"></span><span class="anchor" id="bkmrk--34"></span><span class="anchor" id="bkmrk--35"></span><span class="anchor" id="bkmrk--36"></span><span class="anchor" id="bkmrk--37"></span><span class="anchor" id="bkmrk--38"></span><span class="anchor" id="bkmrk--39"></span><span class="anchor" id="bkmrk--40"></span><span class="anchor" id="bkmrk--41"></span><span class="anchor" id="bkmrk--42"></span><span class="anchor" id="bkmrk--43"></span><span class="anchor" id="bkmrk--44"></span><span class="anchor" id="bkmrk--45"></span><span class="anchor" id="bkmrk--46"></span><span class="anchor" id="bkmrk--47"></span><span class="anchor" id="bkmrk--48"></span><span class="anchor" id="bkmrk--49"></span><span class="anchor" id="bkmrk--50"></span><span class="anchor" id="bkmrk--51"></span><span class="anchor" id="bkmrk--52"></span><span class="anchor" id="bkmrk--53"></span><span class="anchor" id="bkmrk--54"></span><span class="anchor" id="bkmrk--55"></span><span class="anchor" id="bkmrk--56"></span><span class="anchor" id="bkmrk--57"></span><span class="anchor" id="bkmrk--58"></span><span class="anchor" id="bkmrk--59"></span><span class="anchor" id="bkmrk--60"></span>

```
root@containers:/etc# git diff
diff --git a/lxc/default.conf b/lxc/default.conf
index d2d1d51..30231e3 100644
--- a/lxc/default.conf
+++ b/lxc/default.conf
@@ -1,3 +1,5 @@
 lxc.net.0.type = empty
 lxc.apparmor.profile = generated
 lxc.apparmor.allow_nesting = 1
+lxc.idmap = u 0 100000 65536
+lxc.idmap = g 0 100000 65536
diff --git a/subgid b/subgid
index dc7d014..44be50f 100644
--- a/subgid
+++ b/subgid
@@ -1,2 +1 @@
-dh:100000:65536
+root:100000:65536
diff --git a/subuid b/subuid
index dc7d014..44be50f 100644
--- a/subuid
+++ b/subuid
@@ -1,2 +1 @@
-dh:100000:65536
+root:100000:65536
```

<span class="anchor" id="bkmrk--62"></span><span class="anchor" id="bkmrk--63"></span>

### Netzwerk

<span class="anchor" id="bkmrk--65"></span>

Damit die LXC-Container auf das Netwerk zugreifen können, müssen deren virtuellen Netzwerkkarten an das `lxcbr0` angebunden werden. Da `vserver.ping.de` selbst eine virtuelle Maschine ist und die IP-Netze außerhalb der VM ankommen, bzw. dorthin geroutet werden, muss für die Container einer Bridge eingerichtet werden, in der die an vserver.ping.de gerouteten Netze verwendet: <span class="anchor" id="bkmrk--66"></span><span class="anchor" id="bkmrk--67"></span><span class="anchor" id="bkmrk--68"></span><span class="anchor" id="bkmrk--69"></span><span class="anchor" id="bkmrk--70"></span><span class="anchor" id="bkmrk--71"></span><span class="anchor" id="bkmrk--72"></span><span class="anchor" id="bkmrk--73"></span><span class="anchor" id="bkmrk--74"></span><span class="anchor" id="bkmrk--75"></span>

```
auto lxcbr0
iface lxcbr0 inet static
        bridge_ports none
        bridge_stp off
        bridge_fd 0
        address 176.9.167.1
        netmask 255.255.255.240
 
iface lxcbr0 inet6 static
        bridge_ports none
        bridge_stp off
        bridge_fd 0
        address 2a01:4f8:262:445e:300::1/72
```

<span class="anchor" id="bkmrk--77"></span><span class="anchor" id="bkmrk--78"></span>

Damit LXC für die erzeugten Container auch ein Interface im Host erzeugt und dies der Bridge hinzufügt, muss `/etc/lxc/default.conf` angepasst werden: <span class="anchor" id="bkmrk--79"></span><span class="anchor" id="bkmrk--80"></span><span class="anchor" id="bkmrk--81"></span><span class="anchor" id="bkmrk--82"></span><span class="anchor" id="bkmrk--83"></span><span class="anchor" id="bkmrk--84"></span><span class="anchor" id="bkmrk--85"></span><span class="anchor" id="bkmrk--86"></span><span class="anchor" id="bkmrk--87"></span><span class="anchor" id="bkmrk--88"></span><span class="anchor" id="bkmrk--89"></span><span class="anchor" id="bkmrk--90"></span><span class="anchor" id="bkmrk--91"></span><span class="anchor" id="bkmrk--92"></span>

```
diff --git a/lxc/default.conf b/lxc/default.conf
index 30231e3..c6bd25e 100644
--- a/lxc/default.conf
+++ b/lxc/default.conf
@@ -1,4 +1,6 @@
-lxc.net.0.type = empty
+lxc.net.0.type = veth
+lxc.net.0.link = lxcbr0
+lxc.net.0.flags = up
 lxc.apparmor.profile = generated
 lxc.apparmor.allow_nesting = 1
 lxc.idmap = u 0 100000 65536
 lxc.idmap = g 0 100000 65536
 lxc.cgroup.devices.allow = c 10:200 rwm
```

<span class="anchor" id="bkmrk--94"></span><span class="anchor" id="bkmrk--95"></span>

### Container erstellen

<span class="anchor" id="bkmrk--97"></span>

Container speichern ihr Dateisystem unter `/var/lib/lxc/<name>/rootfs`. Aus diesem Grund sollte hier ein Dateisystem für den Container eingehängt werden (z.B. ein LV aus dem Dom0 durchgereicht).<span class="anchor" id="bkmrk--98"></span><span class="anchor" id="bkmrk--99"></span>

Auf vserver.ping.de gibt es ein LVM-Volume `vserver` in dem für jeden VServer ein LV mit einem Dateisystem angelegt und eingehängt wird.

```bash
root@vserver:~# lvcreate -L 70G -n jmp100.prima.de vserver
  Logical volume "jmp100.prima.de" created.

root@vserver:~# mkfs.ext4 /dev/vserver/jmp100.prima.de 
mke2fs 1.47.2 (1-Jan-2025)
Discarding device blocks: done                            
Creating filesystem with 18350080 4k blocks and 4587520 inodes
Filesystem UUID: eb9c3ac5-baf0-4dba-92d0-d3ab68097894
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000, 7962624, 11239424
 
Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (131072 blocks): done
Writing superblocks and filesystem accounting information: done   
 
root@vserver:~# mkdir /var/lib/lxc/jmp100.prima.de

root@vserver:~# echo -e "/dev/vserver/jmp100.prima.de\t/var/lib/lxc/jmp100.prima.de\text4\tdefaults\t0\t2" >> /etc/fstab

root@vserver:~# systemctl daemon-reload

root@vserver:~# mount /var/lib/lxc/jmp100.prima.de
```

Das

Da die genutzten Container unprivilegiert sind, muss das D`ownload`-Template genutzt werden. Hier ist dann die `Distribution` (z.B.: `Debian`), das `Release` (z.B.: `buster`) und die `Architektur` (z.B.: `amd64`) angegeben werden. <span class="anchor" id="bkmrk--100"></span><span class="anchor" id="bkmrk--101"></span>

<span class="anchor" id="bkmrk--103"></span><span class="anchor" id="bkmrk--104"></span><span class="anchor" id="bkmrk--105"></span><span class="anchor" id="bkmrk--106"></span><span class="anchor" id="bkmrk--107"></span><span class="anchor" id="bkmrk--108"></span><span class="anchor" id="bkmrk--109"></span><span class="anchor" id="bkmrk--110"></span><span class="anchor" id="bkmrk--111"></span><span class="anchor" id="bkmrk--112"></span><span class="anchor" id="bkmrk--113"></span><span class="anchor" id="bkmrk--114"></span><span class="anchor" id="bkmrk--115"></span><span class="anchor" id="bkmrk--116"></span><span class="anchor" id="bkmrk--117"></span><span class="anchor" id="bkmrk--118"></span><span class="anchor" id="bkmrk--119"></span><span class="anchor" id="bkmrk--120"></span><span class="anchor" id="bkmrk--121"></span><span class="anchor" id="bkmrk--122"></span><span class="anchor" id="bkmrk--123"></span><span class="anchor" id="bkmrk--124"></span><span class="anchor" id="bkmrk--125"></span><span class="anchor" id="bkmrk--126"></span><span class="anchor" id="bkmrk--127"></span><span class="anchor" id="bkmrk--128"></span><span class="anchor" id="bkmrk--129"></span><span class="anchor" id="bkmrk--130"></span><span class="anchor" id="bkmrk--131"></span><span class="anchor" id="bkmrk--132"></span><span class="anchor" id="bkmrk--133"></span><span class="anchor" id="bkmrk--134"></span><span class="anchor" id="bkmrk--135"></span><span class="anchor" id="bkmrk--136"></span><span class="anchor" id="bkmrk--137"></span><span class="anchor" id="bkmrk--138"></span><span class="anchor" id="bkmrk--139"></span><span class="anchor" id="bkmrk--140"></span><span class="anchor" id="bkmrk--141"></span><span class="anchor" id="bkmrk--142"></span><span class="anchor" id="bkmrk--143"></span><span class="anchor" id="bkmrk--144"></span><span class="anchor" id="bkmrk--145"></span><span class="anchor" id="bkmrk--146"></span><span class="anchor" id="bkmrk--147"></span><span class="anchor" id="bkmrk--148"></span><span class="anchor" id="bkmrk--149"></span><span class="anchor" id="bkmrk--150"></span><span class="anchor" id="bkmrk--151"></span><span class="anchor" id="bkmrk--152"></span><span class="anchor" id="bkmrk--153"></span><span class="anchor" id="bkmrk--154"></span><span class="anchor" id="bkmrk--155"></span><span class="anchor" id="bkmrk--156"></span><span class="anchor" id="bkmrk--157"></span><span class="anchor" id="bkmrk--158"></span><span class="anchor" id="bkmrk--159"></span><span class="anchor" id="bkmrk--160"></span><span class="anchor" id="bkmrk--161"></span><span class="anchor" id="bkmrk--162"></span><span class="anchor" id="bkmrk--163"></span><span class="anchor" id="bkmrk--164"></span><span class="anchor" id="bkmrk--165"></span><span class="anchor" id="bkmrk--166"></span><span class="anchor" id="bkmrk--167"></span><span class="anchor" id="bkmrk--168"></span><span class="anchor" id="bkmrk--169"></span><span class="anchor" id="bkmrk--170"></span><span class="anchor" id="bkmrk--171"></span><span class="anchor" id="bkmrk--172"></span><span class="anchor" id="bkmrk--173"></span><span class="anchor" id="bkmrk--174"></span><span class="anchor" id="bkmrk--175"></span><span class="anchor" id="bkmrk--176"></span><span class="anchor" id="bkmrk--177"></span><span class="anchor" id="bkmrk--178"></span><span class="anchor" id="bkmrk--179"></span><span class="anchor" id="bkmrk--180"></span><span class="anchor" id="bkmrk--181"></span><span class="anchor" id="bkmrk--182"></span><span class="anchor" id="bkmrk--183"></span><span class="anchor" id="bkmrk--184"></span><span class="anchor" id="bkmrk--185"></span><span class="anchor" id="bkmrk--186"></span><span class="anchor" id="bkmrk--187"></span><span class="anchor" id="bkmrk--188"></span><span class="anchor" id="bkmrk--189"></span><span class="anchor" id="bkmrk--190"></span><span class="anchor" id="bkmrk--191"></span><span class="anchor" id="bkmrk--192"></span><span class="anchor" id="bkmrk--193"></span><span class="anchor" id="bkmrk--194"></span><span class="anchor" id="bkmrk--195"></span><span class="anchor" id="bkmrk--196"></span><span class="anchor" id="bkmrk--197"></span><span class="anchor" id="bkmrk--198"></span><span class="anchor" id="bkmrk--199"></span><span class="anchor" id="bkmrk--200"></span><span class="anchor" id="bkmrk--201"></span><span class="anchor" id="bkmrk--202"></span><span class="anchor" id="bkmrk--203"></span><span class="anchor" id="bkmrk--204"></span><span class="anchor" id="bkmrk--205"></span><span class="anchor" id="bkmrk--206"></span><span class="anchor" id="bkmrk--207"></span><span class="anchor" id="bkmrk--208"></span><span class="anchor" id="bkmrk--209"></span><span class="anchor" id="bkmrk--210"></span><span class="anchor" id="bkmrk--211"></span><span class="anchor" id="bkmrk--212"></span><span class="anchor" id="bkmrk--213"></span><span class="anchor" id="bkmrk--214"></span><span class="anchor" id="bkmrk--215"></span><span class="anchor" id="bkmrk--216"></span><span class="anchor" id="bkmrk--217"></span><span class="anchor" id="bkmrk--218"></span><span class="anchor" id="bkmrk--219"></span><span class="anchor" id="bkmrk--220"></span><span class="anchor" id="bkmrk--221"></span><span class="anchor" id="bkmrk--222"></span><span class="anchor" id="bkmrk--223"></span><span class="anchor" id="bkmrk--224"></span><span class="anchor" id="bkmrk--225"></span><span class="anchor" id="bkmrk--226"></span><span class="anchor" id="bkmrk--227"></span><span class="anchor" id="bkmrk--228"></span><span class="anchor" id="bkmrk--229"></span><span class="anchor" id="bkmrk--230"></span><span class="anchor" id="bkmrk--231"></span><span class="anchor" id="bkmrk--232"></span><span class="anchor" id="bkmrk--233"></span><span class="anchor" id="bkmrk--234"></span><span class="anchor" id="bkmrk--235"></span><span class="anchor" id="bkmrk--236"></span><span class="anchor" id="bkmrk--237"></span><span class="anchor" id="bkmrk--238"></span><span class="anchor" id="bkmrk--239"></span><span class="anchor" id="bkmrk--240"></span><span class="anchor" id="bkmrk--241"></span><span class="anchor" id="bkmrk--242"></span><span class="anchor" id="bkmrk--243"></span><span class="anchor" id="bkmrk--244"></span><span class="anchor" id="bkmrk--245"></span><span class="anchor" id="bkmrk--246"></span><span class="anchor" id="bkmrk--247"></span><span class="anchor" id="bkmrk--248"></span><span class="anchor" id="bkmrk--249"></span><span class="anchor" id="bkmrk--250"></span><span class="anchor" id="bkmrk--251"></span><span class="anchor" id="bkmrk--252"></span><span class="anchor" id="bkmrk--253"></span><span class="anchor" id="bkmrk--254"></span><span class="anchor" id="bkmrk--255"></span><span class="anchor" id="bkmrk--256"></span><span class="anchor" id="bkmrk--257"></span><span class="anchor" id="bkmrk--258"></span><span class="anchor" id="bkmrk--259"></span><span class="anchor" id="bkmrk--260"></span><span class="anchor" id="bkmrk--261"></span><span class="anchor" id="bkmrk--262"></span><span class="anchor" id="bkmrk--263"></span><span class="anchor" id="bkmrk--264"></span><span class="anchor" id="bkmrk--265"></span><span class="anchor" id="bkmrk--266"></span><span class="anchor" id="bkmrk--267"></span><span class="anchor" id="bkmrk--268"></span><span class="anchor" id="bkmrk--269"></span><span class="anchor" id="bkmrk--270"></span><span class="anchor" id="bkmrk--271"></span><span class="anchor" id="bkmrk--272"></span><span class="anchor" id="bkmrk--273"></span><span class="anchor" id="bkmrk--274"></span><span class="anchor" id="bkmrk--275"></span><span class="anchor" id="bkmrk--276"></span><span class="anchor" id="bkmrk--277"></span><span class="anchor" id="bkmrk--278"></span><span class="anchor" id="bkmrk--279"></span><span class="anchor" id="bkmrk--280"></span><span class="anchor" id="bkmrk--281"></span><span class="anchor" id="bkmrk--282"></span><span class="anchor" id="bkmrk--283"></span><span class="anchor" id="bkmrk--284"></span><span class="anchor" id="bkmrk--285"></span><span class="anchor" id="bkmrk--286"></span><span class="anchor" id="bkmrk--287"></span><span class="anchor" id="bkmrk--288"></span><span class="anchor" id="bkmrk--289"></span><span class="anchor" id="bkmrk--290"></span><span class="anchor" id="bkmrk--291"></span><span class="anchor" id="bkmrk--292"></span><span class="anchor" id="bkmrk--293"></span><span class="anchor" id="bkmrk--294"></span><span class="anchor" id="bkmrk--295"></span><span class="anchor" id="bkmrk--296"></span><span class="anchor" id="bkmrk--297"></span><span class="anchor" id="bkmrk--298"></span><span class="anchor" id="bkmrk--299"></span><span class="anchor" id="bkmrk--300"></span><span class="anchor" id="bkmrk--301"></span><span class="anchor" id="bkmrk--302"></span><span class="anchor" id="bkmrk--303"></span><span class="anchor" id="bkmrk--304"></span><span class="anchor" id="bkmrk--305"></span><span class="anchor" id="bkmrk--306"></span><span class="anchor" id="bkmrk--307"></span><span class="anchor" id="bkmrk--308"></span><span class="anchor" id="bkmrk--309"></span><span class="anchor" id="bkmrk--310"></span><span class="anchor" id="bkmrk--311"></span><span class="anchor" id="bkmrk--312"></span><span class="anchor" id="bkmrk--313"></span><span class="anchor" id="bkmrk--314"></span><span class="anchor" id="bkmrk--315"></span><span class="anchor" id="bkmrk--316"></span><span class="anchor" id="bkmrk--317"></span><span class="anchor" id="bkmrk--318"></span><span class="anchor" id="bkmrk--319"></span><span class="anchor" id="bkmrk--320"></span><span class="anchor" id="bkmrk--321"></span><span class="anchor" id="bkmrk--322"></span><span class="anchor" id="bkmrk--323"></span><span class="anchor" id="bkmrk--324"></span><span class="anchor" id="bkmrk--325"></span><span class="anchor" id="bkmrk--326"></span><span class="anchor" id="bkmrk--327"></span><span class="anchor" id="bkmrk--328"></span><span class="anchor" id="bkmrk--329"></span><span class="anchor" id="bkmrk--330"></span><span class="anchor" id="bkmrk--331"></span><span class="anchor" id="bkmrk--332"></span><span class="anchor" id="bkmrk--333"></span><span class="anchor" id="bkmrk--334"></span><span class="anchor" id="bkmrk--335"></span><span class="anchor" id="bkmrk--336"></span><span class="anchor" id="bkmrk--337"></span><span class="anchor" id="bkmrk--338"></span><span class="anchor" id="bkmrk--339"></span><span class="anchor" id="bkmrk--340"></span><span class="anchor" id="bkmrk--341"></span><span class="anchor" id="bkmrk--342"></span><span class="anchor" id="bkmrk--343"></span><span class="anchor" id="bkmrk--344"></span><span class="anchor" id="bkmrk--345"></span><span class="anchor" id="bkmrk--346"></span><span class="anchor" id="bkmrk--347"></span>

```bash
root@vserver:~# lxc-create -n jmp100.prima.de -t download
Downloading the image index
 
---
DIST             RELEASE     ARCH   VARIANT  BUILD         
---
almalinux        10          amd64  default  20260123_23:25
almalinux        10          arm64  default  20260123_23:29
almalinux        8           amd64  default  20260123_23:23
almalinux        8           arm64  default  20260123_23:27
almalinux        9           amd64  default  20260123_23:25
almalinux        9           arm64  default  20260123_23:28
alpine           3.20        amd64  default  20260124_13:00
alpine           3.20        arm64  default  20260124_13:01
alpine           3.20        armhf  default  20260124_13:00
alpine           3.20        riscv64  default  20260124_13:07
alpine           3.21        amd64  default  20260124_13:00
alpine           3.21        arm64  default  20260124_13:01
alpine           3.21        armhf  default  20260124_13:02
alpine           3.21        riscv64  default  20260124_13:02
alpine           3.22        amd64  default  20260124_13:00
alpine           3.22        arm64  default  20260124_13:02
alpine           3.22        armhf  default  20260124_13:01
alpine           3.22        riscv64  default  20260124_13:02
alpine           3.23        amd64  default  20260124_13:00
alpine           3.23        arm64  default  20260124_13:00
alpine           3.23        armhf  default  20260124_13:00
alpine           3.23        riscv64  default  20260124_13:03
alpine           edge        amd64  default  20260124_13:00
alpine           edge        arm64  default  20260124_13:00
alpine           edge        armhf  default  20260124_13:01
alpine           edge        riscv64  default  20260124_13:06
alt              Sisyphus    amd64  default  20260124_03:08
alt              Sisyphus    arm64  default  20260124_03:22
alt              p11         amd64  default  20260124_03:40
alt              p11         arm64  default  20260124_03:17
amazonlinux      2           amd64  default  20260124_05:09
amazonlinux      2           arm64  default  20260124_05:09
amazonlinux      2023        amd64  default  20260124_05:09
archlinux        current     amd64  default  20260124_04:18
archlinux        current     arm64  default  20260124_04:18
archlinux        current     riscv64  default  20260124_04:18
busybox          1.36.1      amd64  default  20260124_06:00
busybox          1.36.1      arm64  default  20260124_06:00
centos           10-Stream   amd64  default  20260124_07:08
centos           10-Stream   arm64  default  20260124_07:35
centos           9-Stream    amd64  default  20260124_07:35
centos           9-Stream    arm64  default  20260124_07:08
debian           bookworm    amd64  default  20260124_05:24
debian           bookworm    arm64  default  20260124_05:24
debian           bookworm    armhf  default  20260124_05:24
debian           bullseye    amd64  default  20260124_05:24
debian           bullseye    arm64  default  20260124_05:24
debian           bullseye    armhf  default  20260124_05:39
debian           forky       amd64  default  20260124_05:24
debian           forky       arm64  default  20260124_05:24
debian           forky       armhf  default  20260124_05:24
debian           forky       riscv64  default  20260124_05:40
debian           trixie      amd64  default  20260124_05:24
debian           trixie      arm64  default  20260124_05:24
debian           trixie      armhf  default  20260124_05:36
debian           trixie      riscv64  default  20260124_05:24
devuan           chimaera    amd64  default  20260124_11:50
devuan           chimaera    arm64  default  20260124_11:50
devuan           daedalus    amd64  default  20260124_11:50
devuan           daedalus    arm64  default  20260124_11:50
devuan           excalibur   amd64  default  20260124_11:50
devuan           excalibur   arm64  default  20260124_11:50
fedora           41          amd64  default  20260124_00:01
fedora           41          arm64  default  20260123_23:38
fedora           42          amd64  default  20260123_23:40
fedora           42          arm64  default  20260124_00:09
fedora           43          amd64  default  20260124_00:01
fedora           43          arm64  default  20260124_00:39
kali             current     amd64  default  20260124_17:14
kali             current     arm64  default  20260124_17:14
mint             ulyana      amd64  default  20260124_08:51
mint             ulyssa      amd64  default  20260124_08:51
mint             uma         amd64  default  20260124_08:51
mint             una         amd64  default  20260124_08:51
mint             vanessa     amd64  default  20260124_08:51
mint             vera        amd64  default  20260124_08:51
mint             victoria    amd64  default  20260124_08:51
mint             virginia    amd64  default  20260124_08:51
mint             wilma       amd64  default  20260124_08:51
nixos            25.11       amd64  default  20260124_01:00
nixos            25.11       arm64  default  20260124_01:50
nixos            unstable    amd64  default  20260124_01:02
nixos            unstable    arm64  default  20260124_01:50
openeuler        20.03       amd64  default  20260120_15:48
openeuler        20.03       arm64  default  20260120_15:48
openeuler        22.03       amd64  default  20260120_15:48
openeuler        22.03       arm64  default  20260120_15:48
openeuler        24.03       amd64  default  20260120_15:48
openeuler        24.03       arm64  default  20260120_15:48
openeuler        25.03       amd64  default  20260120_15:48
openeuler        25.03       arm64  default  20260120_15:48
openeuler        25.09       amd64  default  20260120_15:48
openeuler        25.09       arm64  default  20260120_15:48
opensuse         15.6        amd64  default  20260124_04:20
opensuse         15.6        arm64  default  20260124_04:20
opensuse         16.0        amd64  default  20260124_04:20
opensuse         16.0        arm64  default  20260124_04:20
opensuse         tumbleweed  amd64  default  20260124_04:20
opensuse         tumbleweed  arm64  default  20260124_04:20
openwrt          23.05       amd64  default  20260124_11:57
openwrt          23.05       arm64  default  20260124_11:57
openwrt          24.10       amd64  default  20260124_11:57
openwrt          24.10       arm64  default  20260124_11:57
openwrt          25.12       amd64  default  20260124_11:57
openwrt          25.12       arm64  default  20260124_11:57
openwrt          snapshot    amd64  default  20260124_11:57
openwrt          snapshot    arm64  default  20260124_11:57
oracle           7           amd64  default  20260124_07:46
oracle           7           arm64  default  20260124_08:10
oracle           8           amd64  default  20260124_07:46
oracle           8           arm64  default  20260124_08:12
oracle           9           amd64  default  20260124_07:46
oracle           9           arm64  default  20260124_08:09
plamo            8.x         amd64  default  20260124_03:08
rockylinux       10          amd64  default  20260124_03:08
rockylinux       10          arm64  default  20260124_03:08
rockylinux       8           amd64  default  20260124_03:08
rockylinux       8           arm64  default  20260124_03:08
rockylinux       9           amd64  default  20260124_03:08
rockylinux       9           arm64  default  20260124_03:14
slackware        15.0        amd64  default  20260123_23:27
slackware        current     amd64  default  20260123_23:26
springdalelinux  7           amd64  default  20260124_06:38
springdalelinux  8           amd64  default  20260124_06:38
springdalelinux  9           amd64  default  20260124_06:38
ubuntu           jammy       amd64  default  20260124_07:42
ubuntu           jammy       arm64  default  20260124_07:42
ubuntu           jammy       armhf  default  20260124_08:02
ubuntu           jammy       riscv64  default  20260124_08:22
ubuntu           noble       amd64  default  20260124_07:42
ubuntu           noble       arm64  default  20260124_07:42
ubuntu           noble       armhf  default  20260124_07:42
ubuntu           noble       riscv64  default  20260124_07:42
ubuntu           plucky      amd64  default  20260124_07:42
ubuntu           plucky      arm64  default  20260124_07:48
ubuntu           plucky      armhf  default  20260124_08:07
ubuntu           plucky      riscv64  default  20260124_08:24
ubuntu           questing    amd64  default  20260124_07:42
ubuntu           questing    arm64  default  20260124_07:42
ubuntu           questing    armhf  default  20260124_07:42
voidlinux        current     amd64  default  20260124_17:10
voidlinux        current     arm64  default  20260124_17:10
---
 
Distribution: 
debian
Release: 
trixie
Architecture: 
amd64

Downloading the image index
Downloading the rootfs
Downloading the metadata
The image cache is now ready
Unpacking the rootfs
 
---
You just created a Debian trixie amd64 (20260124_05:24) container.
 
To enable SSH, run: apt install openssh-server
No default root or user password are set by LXC.
```

<span class="anchor" id="bkmrk--349"></span><span class="anchor" id="bkmrk--350"></span>

Um den Container beim Booten automatisch starten zu lassen, muss eine Zeile zu seiner Config hinzugefügt werden: <span class="anchor" id="bkmrk--351"></span><span class="anchor" id="bkmrk--352"></span><span class="anchor" id="bkmrk--353"></span>

```bash
echo "lxc.start.auto = 1" >> /var/lib/lxc/<name>/config
```

<span class="anchor" id="bkmrk--355"></span><span class="anchor" id="bkmrk--356"></span>

Damit der Container auch Netzwerk hat, wird ganz normal seine `/etc/systemd/network/eth0.network` angepasst. Z.B: <span class="anchor" id="bkmrk--357"></span><span class="anchor" id="bkmrk--358"></span><span class="anchor" id="bkmrk--359"></span><span class="anchor" id="bkmrk--360"></span><span class="anchor" id="bkmrk--361"></span><span class="anchor" id="bkmrk--362"></span><span class="anchor" id="bkmrk--363"></span><span class="anchor" id="bkmrk--364"></span><span class="anchor" id="bkmrk--365"></span><span class="anchor" id="bkmrk--366"></span><span class="anchor" id="bkmrk--367"></span><span class="anchor" id="bkmrk--368"></span><span class="anchor" id="bkmrk--369"></span><span class="anchor" id="bkmrk--370"></span><span class="anchor" id="bkmrk--371"></span><span class="anchor" id="bkmrk--372"></span><span class="anchor" id="bkmrk--373"></span><span class="anchor" id="bkmrk--374"></span><span class="anchor" id="bkmrk--375"></span><span class="anchor" id="bkmrk--376"></span><span class="anchor" id="bkmrk--377"></span><span class="anchor" id="bkmrk--378"></span><span class="anchor" id="bkmrk--379"></span><span class="anchor" id="bkmrk--380"></span><span class="anchor" id="bkmrk--381"></span><span class="anchor" id="bkmrk--382"></span><span class="anchor" id="bkmrk--383"></span><span class="anchor" id="bkmrk--384"></span><span class="anchor" id="bkmrk--385"></span><span class="anchor" id="bkmrk--386"></span>

```bash
cat >>/var/lib/lxc/<name>/rootfs/etc/systemd/network/eth0.network <<EOF
[Match]
Name=eth0
[Network]
Address=176.9.167.13/28
Gateway=176.9.167.1
 
DNS=10.10.10.3
DNS=2a01:4f8:262:445e:100::3
Address=2a01:4f8:262:445e:300::d/72
Gateway=2a01:4f8:262:445e:300::1
EOF
```

<span class="anchor" id="bkmrk--388"></span><span class="anchor" id="bkmrk--389"></span>

Um Probleme beim Neustarten der Container zu vermeiden ist es des Weiteren sinnvoll eine feste MAC-Adresse für das Netzwerk-Interface festzulegen:

```bash
echo "lxc.net.0.hwaddr = f2:93:8c:e9:93:98" >> /var/lib/lxc/<name>/config
```

Mit `lxc-autostart` kann der Container gestartet werden. Mit ``lxc-attach -n jmp100.prima.de`` betritt man den Container und installiert alles wichtige, wie einen SSH-Server.

# Übersicht über die Softwarestände der Produktivsysteme

<table id="bkmrk-buero-debian-gnu%2Flin"><tbody><tr><td>buero

</td><td>Debian GNU/Linux

</td><td>13 trixie

</td></tr><tr><td><span class="anchor" id="bkmrk-"></span>\* blackhole

</td><td>Debian GNU/Linux

</td><td>12 bookworm

</td></tr><tr><td>cogito

</td><td>Ubuntu

</td><td>24.04 Noble

</td></tr><tr><td><span class="anchor" id="bkmrk--1"></span>laboratory

</td><td>Debian GNU/Linux

</td><td>12 bookworm

</td></tr><tr><td><span class="anchor" id="bkmrk--2"></span>\* conf

</td><td>Ubuntu

</td><td>22.04 Jammy

</td></tr><tr><td><span class="anchor" id="bkmrk--3"></span>\* e.ns

</td><td>Debian GNU/Linux

</td><td>12 bookworm

</td></tr><tr><td><span class="anchor" id="bkmrk--4"></span>\* hafen

</td><td>Debian GNU/Linux

</td><td>13 trixie

</td></tr><tr><td><span class="anchor" id="bkmrk--5"></span>\* vserver

</td><td>Debian GNU/Linux

</td><td>13 trixie

</td></tr><tr><td><span class="anchor" id="bkmrk--6"></span>\* zooey

</td><td>Debian GNU/Linux

</td><td>13 trixie

</td></tr><tr><td><span class="anchor" id="bkmrk--7"></span>\* lilly

</td><td>Debian GNU/Linux

</td><td>12 bookworm

</td></tr><tr><td><span class="anchor" id="bkmrk--8"></span>\* lucy

</td><td>Debian GNU/Linux

</td><td><span style="color:rgb(186,55,42);">10 buster</span>

</td></tr><tr><td><span class="anchor" id="bkmrk--9"></span>\* mail

</td><td>Debian GNU/Linux

</td><td>13 trixie

</td></tr></tbody></table>

# Hetzner-Server

Auf dem Weg weg von Knipp wurde im August 2022 ein Server bei Hetzner gemietet. Der Server vom Modell [AX51](https://www.hetzner.com/dedicated-rootserver/ax51) steht im deutschen Rechenzentrum und wir über den Robot-User <office@ping.de> verwaltet. <span class="anchor" id="bkmrk-"></span><span class="anchor" id="bkmrk--1"></span>

Der Server heißt `laboratory.ping.de` (CNAME `lab.ping.de`) und ist über die IP-Adressen `167.235.0.46` und `2a01:4f8:262:445e::2` zu erreicht. <span class="anchor" id="bkmrk--2"></span><span class="anchor" id="bkmrk--3"></span>

## Technische Daten

<span class="anchor" id="bkmrk--5"></span>

- CPU: Octa-Core AMD Ryzen™ 7 3700X <span class="anchor" id="bkmrk--6"></span>
- RAM: 128 GB DDR4 ECC <span class="anchor" id="bkmrk--7"></span>
- HDD: 2 x 12 TB <span class="anchor" id="bkmrk--8"></span>
- SSD: 512 GB NVME SSD <span class="anchor" id="bkmrk--9"></span>
- Netzwerk: 1 Gbit/s <span class="anchor" id="bkmrk--10"></span>
- Primäre IPv4-Adresse und /64-IPv6-Netz <span class="anchor" id="bkmrk--11"></span><span class="anchor" id="bkmrk--12"></span>

## Software

<span class="anchor" id="bkmrk--14"></span>

Das System läuft aktuell mit einem Proxmox 8.14 Image. Dies ist eine auf Debian 12 (Bookworm) basierte Virtualisierungslösung, die eine Web-Oberfläche bietet. Proxmox kann VMs (auf Basis von KVM) und Container (lxc) verwalten. Die Konfiguration richtet sich an der Doku von Proxmox. Verwendete Bridge-Namen und IP-Netze entsprechend (soweit möglich) den Beispielen der Doku. <span class="anchor" id="bkmrk--15"></span><span class="anchor" id="bkmrk--16"></span>

Das Webinterface von Proxmox kann über [https://laboratory.ping.de:8006/](https://laboratory.ping.de:8006/) erreicht werden. <span class="anchor" id="bkmrk--17"></span><span class="anchor" id="bkmrk--18"></span>

Zum Login können die Nutzer des Systems über `pam` genutzt werden. Diese müssen aber wie folgt für Proxmox aktiviert werden: <span class="anchor" id="bkmrk--19"></span><span class="anchor" id="bkmrk--20"></span>

<span class="anchor" id="bkmrk--22"></span><span class="anchor" id="bkmrk--23"></span><span class="anchor" id="bkmrk--24"></span>

```
pveum user add <login>@pam
pveum acl modify / --roles PVEAdmin --users <login>@pam
```

<span class="anchor" id="bkmrk--26"></span>

## Storage

<span class="anchor" id="bkmrk--28"></span>

Bei der Installation des Systems wurde ein RAID-1 über beide HDDs gebildet und in einer LVM-Volumegroup verwendet. Die NVMe-SSD wurde nicht eingebunden und wird später über LVM als Cache für bestimme LVs genutzt (z.B. Mailqueue). <span class="anchor" id="bkmrk--29"></span><span class="anchor" id="bkmrk--30"></span>

## Netzwerk

<span class="anchor" id="bkmrk--32"></span>

Da aktuell nur eine öffentliche IPv4-Adresse verfügbar ist, wird diese an keine VM gebunden, sonder die benötigten Ports werden an die VMs weitergeleitet. Die VMs (und Container) sind an die interne Bridge `vmbr0` gebunden. Hier wird das interne IPv4-Netz `10.10.10.0/24` verwendet. Für IPv6 wird das Netz `2a01:4f8:262:445e:100::0/72` auf die Bridge geroutet. <span class="anchor" id="bkmrk--33"></span><span class="anchor" id="bkmrk--34"></span>

### haProxy

<span class="anchor" id="bkmrk--36"></span>

Für viele VMs/Container ist das Teilen einer IPv4-Adresse relativ problemlos. Da z.B. der Container für DNS andere Ports verwendet als die Mail-VM können diese einfach aufgeteilt werden. Problematischer wird dies mit Port 80 und 443. Diese Ports werden sowohl von der Mail-VM genutzt als auch von einem Webserver-Container. Aus diesem Grund werden Port 80 und 443 nicht an eine VM weitergeleitet, sondern auf dem Host selbst über haProxy als Reverse-Proxy weitergeleitet. Dabei nutzt haProxy für Port 80 den im HTTP-Request angegeben Host und auf 443 wird SNI zur Unterscheidung genutzt. Dies hat den Vorteil, dass haProxy eine Verbindung auf Port 443 an die Ziel-VM weiterleitet, ohne die Verschlüsselung aufzutrennen. Somit bleiben auch sämtliche Daten bis in die VM verschlüsselt und andere VMs können nicht durch Sniffen an der Bridge die Kommunikation einsehen. <span class="anchor" id="bkmrk--37"></span><span class="anchor" id="bkmrk--38"></span>

Konfiguriert wird haProxy auf dem Basissystem über das Config-File `/etc/haproxy/haproxy.cfg`. Neue VMs oder Namen werden dabei als `backend` konfiguriert. Dies geschieht für Port `80` und `443` getrennt. Für eine Test-VM mit der internen IPv4-Adresse `10.10.10.2` sieht dies wie folgt aus: <span class="anchor" id="bkmrk--39"></span><span class="anchor" id="bkmrk--40"></span>

<span class="anchor" id="bkmrk--42"></span><span class="anchor" id="bkmrk--43"></span><span class="anchor" id="bkmrk--44"></span><span class="anchor" id="bkmrk--45"></span><span class="anchor" id="bkmrk--46"></span><span class="anchor" id="bkmrk--47"></span><span class="anchor" id="bkmrk--48"></span><span class="anchor" id="bkmrk--49"></span><span class="anchor" id="bkmrk--50"></span><span class="anchor" id="bkmrk--51"></span><span class="anchor" id="bkmrk--52"></span>

```
backend testvm_https
        mode tcp
        option ssl-hello-chk
        source 0.0.0.0 usesrc clientip
        server testvm:443 10.10.10.2:443 weight 100

backend testvm_http
        mode http
        source 0.0.0.0 usesrc clientip
        server testvm:80 10.10.10.2:80 weight 100
```

<span class="anchor" id="bkmrk--54"></span>

Speziell ist dabei das Keyword `usesrc`, wodurch die `tproxy`-Funktion haProxy aktiviert wird. Dies bedeutet, dass die VMs die ursprüngliche IP des Clients sehen und diese auch entsprechend loggen oder filtern können. <span class="anchor" id="bkmrk--55"></span><span class="anchor" id="bkmrk--56"></span>

Um die Backends zu nutzen, müssen diese in den entsprechenden Frontends für http und https hinzugefügt werden: <span class="anchor" id="bkmrk--57"></span><span class="anchor" id="bkmrk--58"></span>

<span class="anchor" id="bkmrk--60"></span><span class="anchor" id="bkmrk--61"></span><span class="anchor" id="bkmrk--62"></span><span class="anchor" id="bkmrk--63"></span><span class="anchor" id="bkmrk--64"></span><span class="anchor" id="bkmrk--65"></span><span class="anchor" id="bkmrk--66"></span><span class="anchor" id="bkmrk--67"></span><span class="anchor" id="bkmrk--68"></span><span class="anchor" id="bkmrk--69"></span><span class="anchor" id="bkmrk--70"></span><span class="anchor" id="bkmrk--71"></span><span class="anchor" id="bkmrk--72"></span><span class="anchor" id="bkmrk--73"></span><span class="anchor" id="bkmrk--74"></span><span class="anchor" id="bkmrk--75"></span><span class="anchor" id="bkmrk--76"></span>

```
frontend http
        bind 167.235.0.46:80 transparent
        mode http

        ## exact matches
        use_backend testvm_http if { hdr(Host) -i testvm.ping.de } !{ ssl_fc }

frontend https
        option tcplog
        bind 167.235.0.46:443 transparent
        mode tcp
        tcp-request inspect-delay 5s
        tcp-request content accept if { req_ssl_hello_type 1 }

        ## exact matches
        use_backend testvm_https if { req.ssl_sni -i testvm.ping.de }
```

<span class="anchor" id="bkmrk--78"></span>

Über den Teil in den Klammern hinter dem `if` wird der Hostname geprüft. <span class="anchor" id="bkmrk--79"></span><span class="anchor" id="bkmrk--80"></span>

## Aktuelle VMs/Container

<span class="anchor" id="bkmrk--82"></span>

Folgende VMs und Container sind aktuell konfiguriert: <span class="anchor" id="bkmrk--83"></span><span class="anchor" id="bkmrk--84"></span>

### TestVM

<span class="anchor" id="bkmrk--86"></span>

Eine kleine Debian 11 VM mit einem Webserver zum Testen des haProxy. Abgeschaltet wenn nicht benötigt. <span class="anchor" id="bkmrk--87"></span><span class="anchor" id="bkmrk--88"></span>

### e.ns.ping.de

<span class="anchor" id="bkmrk--90"></span>

Container mit konfiguriertem Bind. Dient als Nameserver für `ping.de`, `prima.de`, `ping.ruhr` und `prima.ruhr`, um auch noch dann von Nutzen zu sein, wenn Knipp mal wieder vollständig ausfällt. Die Zonen werden aktuell von den Servern bei Knipp über `AXFR` gezogen sobald diese sich dort ändern. <span class="anchor" id="bkmrk--91"></span><span class="anchor" id="bkmrk--92"></span>

Im Falle eines Ausfalls von Knipp könnte hier angesetzt werden, um z.B. `www.ping.de` auf einen anderen Webserver umzubiegen. <span class="anchor" id="bkmrk--93"></span><span class="anchor" id="bkmrk--94"></span>

### mail.ping.ruhr

<span class="anchor" id="bkmrk--96"></span>

Debian 11 (Bullseye) VM mit Docker und den Mailcow-Docker-Containern für unseren Test mit den `*.ping.ruhr`- und `*.prima.ruhr`-Domains. Das Mailcow hat alle PING- und Prima-Sites konfiguriert (nur halt mit der `.ruhr`-Endung) und kann entsprechend für Tests genutzt werden. <span class="anchor" id="bkmrk--97"></span><span class="anchor" id="bkmrk--98"></span>

### lilly

<span class="anchor" id="bkmrk--100"></span>

Debian 12 (Bookworm) <span class="anchor" id="bkmrk--101"></span><span class="anchor" id="bkmrk--102"></span>

### lucy

<span class="anchor" id="bkmrk--104"></span>

Debian 10 Buster <span class="anchor" id="bkmrk--105"></span><span class="anchor" id="bkmrk--106"></span>

News-Server mit architektur-abhängigem Storage 32bit <span class="anchor" id="bkmrk--107"></span><span class="anchor" id="bkmrk--108"></span>

### hafen

<span class="anchor" id="bkmrk--110"></span>

Debian 12. <span class="anchor" id="bkmrk--111"></span><span class="anchor" id="bkmrk--112"></span>

Docker Container Server: <span class="anchor" id="bkmrk--113"></span><span class="anchor" id="bkmrk--114"></span>

- [portainer](https://hafen.ping.de:9443/), <span class="anchor" id="bkmrk--115"></span>
- [Keycloak](https://auth.ping.de/) (auth), <span class="anchor" id="bkmrk--116"></span>
- [Nextcloud](https://cloud.ping.de/) (cloud), <span class="anchor" id="bkmrk--117"></span>
- [mastodon](https://mastodon.ping.de/), Derzeit mit Patch beim Starten der etwas längere Nachrichten erlaubt: <span class="anchor" id="bkmrk--118"></span><span class="anchor" id="bkmrk--119"></span>
- <span class="anchor" id="bkmrk--120"></span><span class="anchor" id="bkmrk--121"></span>```
    sed -ie 's/MAX_CHARS = 500/MAX_CHARS = 1500/' app/validators/status_length_validator.rb
    ```
    
    <span class="anchor" id="bkmrk--122"></span>
- Matrix (Synapse Port 8448), <span class="anchor" id="bkmrk--123"></span>
- Jabber (ejabberd), <span class="anchor" id="bkmrk--124"></span>
- bookstack <span class="anchor" id="bkmrk--125"></span><span class="anchor" id="bkmrk--126"></span>

### vserver

<span class="anchor" id="bkmrk--128"></span>

VM für Mitglieder VPS <span class="anchor" id="bkmrk--129"></span><span class="anchor" id="bkmrk--130"></span>

### conf

<span class="anchor" id="bkmrk--132"></span>

Big Blue Button BBB Videokonferenz <span class="anchor" id="bkmrk--133"></span><span class="anchor" id="bkmrk--134"></span>

### zooey

<span class="anchor" id="bkmrk--136"></span>

u.a. wiki.ping.de (ehemals techdoc und aktiv wikis)

# Mailserver

Der PING-Mailserver hat seine eigene virtuelle Maschine und nutzt getrennte IP-Adressen, um ein versehentliches Versenden von SPAM durch andere Dienste zu verhindern.

Aktuell hört der Mailserver auf den Namen mail.ping.ruhr und ist eine Debian 13 Trixie VM.

# KI-Server

PING hat 2025 einen KI-Server angeschafft. Er heißt **cogito.ping.de** und befindet sich im Rechnerraum des Gebäudes in der Joseph-von-Fraunhofer-Straße. <span class="anchor" id="bkmrk-"></span><span class="anchor" id="bkmrk--1"></span>

## Technische Daten

<span class="anchor" id="bkmrk--3"></span>

- CPU AMD Threadripper Pro 5955WX 16 cores 32 threads 4.5Ghz, Zen 3, 64MB L3, 128 PCIe 4.0 lanes <span class="anchor" id="bkmrk--4"></span>
- Mainboard Asus Pro WS WRX80E Sage SE Wifi (7x PCIe 4.0 x16, 8x DDR4 DIMM, 3x M.2, …) <span class="anchor" id="bkmrk--5"></span>
- 2x RAM Corsair Dominator Platinum RGB White UDIMM 64GB **Kit** DDR4-3600 CL18-19-19-39 (128GB gesamt) <span class="anchor" id="bkmrk--6"></span>
- GPU NVIDIA [GeForce](https://techdoc.ping.de/GeForce) RTX 3090 Founders Edition 24 GB <span class="anchor" id="bkmrk--7"></span>
- GPU Zotac Gaming [GeForce](https://techdoc.ping.de/GeForce) RTX 3090 Trinity OC 24 GB mit Noctua Lüftern <span class="anchor" id="bkmrk--8"></span>
- Fractal Design Define 7 XL Black TG Dark Tint schallgedämmt Big-Tower (12 PCI Steckplätze) <span class="anchor" id="bkmrk--9"></span>
- Enermax [LiqTech](https://techdoc.ping.de/LiqTech) TR4 II 280 CPU-Wasserkühlung <span class="anchor" id="bkmrk--10"></span>
- Antec Neo Eco Gold Modular NE1300G m 1300W ATX 3.0 Netzteil <span class="anchor" id="bkmrk--11"></span>
- 4x SSD Lexar NM790 1TB M.2 NVMe PCIe 4.0 in Asus Hyper M.2 X16 Gen 4 Card (RAID 0) <span class="anchor" id="bkmrk--12"></span>
- SSD Samsung PM951 512GB M.2 NVMe (boot) <span class="anchor" id="bkmrk--13"></span>
- SSD Samsung EVO 850 500GB S-ATA <span class="anchor" id="bkmrk--14"></span>
- 4x Noctua NF-P12 redux-1700 PWM 120mm Lüfter <span class="anchor" id="bkmrk--15"></span><span class="anchor" id="bkmrk--16"></span>

siehe auch [https://geizhals.de/wishlists/3870524](https://geizhals.de/wishlists/3870524) <span class="anchor" id="bkmrk--17"></span><span class="anchor" id="bkmrk--18"></span>

Zu dem Mainboard gehört auch eine PCIe 4.0 x16 Karte um vier PCIe 4.0 x4 NVMe SSDs anzuschließen. Dort befinden sich die 4 Lexar SSDs. <span class="anchor" id="bkmrk--19"></span><span class="anchor" id="bkmrk--20"></span>

Durch die 2 GPUs stehen derzeit 48GB schnelles VRAM zur Verfügung, eine Erweiterung ist möglich. Ins Gehäuse passen maximal fünf 2-slot GPUs. <span class="anchor" id="bkmrk--21"></span><span class="anchor" id="bkmrk--22"></span>

Der Hauptspeicher ist auf acht 16GB-Module verteilt und nutzt so die 8 Speicherkanäle der AMD Threadripper Pro Architektur. <span class="anchor" id="bkmrk--23"></span><span class="anchor" id="bkmrk--24"></span>

Der Platz im Gehäuse und das Mainboard mit vielen PCIe-Lanes ermöglichen es uns, bei Bedarf noch mehr GPUs einzubauen.

## Software

<span class="anchor" id="bkmrk--26"></span>

Auf dem Rechner läuft derzeit Ubuntu 24.04 LTS. <span class="anchor" id="bkmrk--27"></span><span class="anchor" id="bkmrk--28"></span>

Das Konzept sieht vor, die Dienste als Docker Container laufen zu lassen. Die compose Dateien liegen in Unterverzeichnissen unter `/opt`. <span class="anchor" id="bkmrk--29"></span><span class="anchor" id="bkmrk--30"></span>

Mit `nvtop` kann der Status der GPUs angezeigt werden. <span class="anchor" id="bkmrk--31"></span><span class="anchor" id="bkmrk--32"></span>

Über das Script `/usr/local/bin/set-gpu-power.sh` sind die GPUs aktuell auf 280W gedrosselt. Das führt zu nur sehr geringen Leistungseinbußen. <span class="anchor" id="bkmrk--33"></span><span class="anchor" id="bkmrk--34"></span>

## Storage

<span class="anchor" id="bkmrk--36"></span>

Die 4 Lexar NMVe SSDs bilden ein RAID0 das unter `/opt` eingehängt ist. Dadurch können große LLMs schnell in den Speicher geladen werden. <span class="anchor" id="bkmrk--37"></span><span class="anchor" id="bkmrk--38"></span>

Die S-ATA SSD ist unter `/var/local` eingehängt. <span class="anchor" id="bkmrk--39"></span><span class="anchor" id="bkmrk--40"></span>

Die PM951 NVMe SSD dient als Bootlaufwerk und enthält auch das OS. <span class="anchor" id="bkmrk--41"></span><span class="anchor" id="bkmrk--42"></span>

<span class="anchor" id="bkmrk--44"></span><span class="anchor" id="bkmrk--45"></span><span class="anchor" id="bkmrk--46"></span><span class="anchor" id="bkmrk--47"></span><span class="anchor" id="bkmrk--48"></span><span class="anchor" id="bkmrk--49"></span><span class="anchor" id="bkmrk--50"></span><span class="anchor" id="bkmrk--51"></span><span class="anchor" id="bkmrk--52"></span><span class="anchor" id="bkmrk--53"></span><span class="anchor" id="bkmrk--54"></span><span class="anchor" id="bkmrk--55"></span><span class="anchor" id="bkmrk--56"></span><span class="anchor" id="bkmrk--57"></span><span class="anchor" id="bkmrk--58"></span><span class="anchor" id="bkmrk--59"></span><span class="anchor" id="bkmrk--60"></span><span class="anchor" id="bkmrk--61"></span><span class="anchor" id="bkmrk--62"></span><span class="anchor" id="bkmrk--63"></span><span class="anchor" id="bkmrk--64"></span><span class="anchor" id="bkmrk--65"></span><span class="anchor" id="bkmrk--66"></span><span class="anchor" id="bkmrk--67"></span><span class="anchor" id="bkmrk--68"></span><span class="anchor" id="bkmrk--69"></span><span class="anchor" id="bkmrk--70"></span><span class="anchor" id="bkmrk--71"></span><span class="anchor" id="bkmrk--72"></span><span class="anchor" id="bkmrk--73"></span><span class="anchor" id="bkmrk--74"></span><span class="anchor" id="bkmrk--75"></span><span class="anchor" id="bkmrk--76"></span><span class="anchor" id="bkmrk--77"></span><span class="anchor" id="bkmrk--78"></span><span class="anchor" id="bkmrk--79"></span><span class="anchor" id="bkmrk--80"></span>

```
$ lsblk
NAME                      MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINTS
sda                         8:0    0 465.8G  0 disk
└─sda1                      8:1    0 465.8G  0 part  /var/local
nvme0n1                   259:0    0 953.9G  0 disk
└─md0                       9:0    0   3.7T  0 raid0 /opt
nvme1n1                   259:1    0 953.9G  0 disk
└─md0                       9:0    0   3.7T  0 raid0 /opt
nvme3n1                   259:2    0 953.9G  0 disk
└─md0                       9:0    0   3.7T  0 raid0 /opt
nvme2n1                   259:3    0 953.9G  0 disk
└─md0                       9:0    0   3.7T  0 raid0 /opt
nvme4n1                   259:8    0 476.9G  0 disk
├─nvme4n1p1               259:9    0     1G  0 part  /boot/efi
├─nvme4n1p2               259:10   0     2G  0 part  /boot
└─nvme4n1p3               259:11   0 473.9G  0 part
  └─ubuntu--vg-ubuntu--lv 252:0    0   445G  0 lvm   /

$ blkid
/dev/nvme0n1: UUID="ebe75b1c-af8f-5e3a-aa0f-9464c3951451" UUID_SUB="1d5de863-0634-7dd3-0e97-7dec7f076aea" LABEL="cogito:0" TYPE="linux_raid_member"
/dev/nvme3n1: UUID="ebe75b1c-af8f-5e3a-aa0f-9464c3951451" UUID_SUB="440d89df-a9d1-bfc9-3634-e57bd579023e" LABEL="cogito:0" TYPE="linux_raid_member"
/dev/md0: LABEL="RAID" UUID="f57d1a53-8b0c-4119-a02b-e06632c7933d" BLOCK_SIZE="4096" TYPE="ext4"
/dev/nvme2n1: UUID="ebe75b1c-af8f-5e3a-aa0f-9464c3951451" UUID_SUB="eb15293d-d63b-c940-841d-a918a0ea0cba" LABEL="cogito:0" TYPE="linux_raid_member"
/dev/mapper/ubuntu--vg-ubuntu--lv: UUID="98bd9894-3827-42bb-a0f4-d92931530cab" BLOCK_SIZE="4096" TYPE="ext4"
/dev/nvme1n1: UUID="ebe75b1c-af8f-5e3a-aa0f-9464c3951451" UUID_SUB="797f9137-3a34-2689-5d0b-a294ee05c9e4" LABEL="cogito:0" TYPE="linux_raid_member"
/dev/sda1: LABEL="ssd500" UUID="c57d324d-3c4f-4f5d-90ca-3859ca87f550" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="ssd500" PARTUUID="48cd0c6a-827f-4882-ad1a-74e38e473d6b"
/dev/nvme4n1p3: UUID="XbVKNc-zwqt-qe2c-fj2e-8MRA-p8e0-XDQdsz" TYPE="LVM2_member" PARTUUID="5f6534ab-7909-40c3-b0b3-4865c7f90e5b"
/dev/nvme4n1p1: UUID="7006-F657" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="f57a2cbc-da3a-4322-8921-42b86e1fc564"
/dev/nvme4n1p2: UUID="8256bdab-088d-437e-a82b-b94470729f4c" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="6a4a7fc5-0f1a-4c23-8591-414239e1ebd8"

$ cat /proc/mdstat
Personalities : [raid0] [linear] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid0 nvme3n1[3] nvme2n1[2] nvme0n1[0] nvme1n1[1]
      4000288768 blocks super 1.2 512k chunks

unused devices: <none>
```

<span class="anchor" id="bkmrk--82"></span>

### vLLM mit Open-WebUI

Für Inferenz läuft i.d.R ein vLLM Server. Als WebUI gibt es dafür ein [open-webui](https://docs.openwebui.com/).

Für das Umwandeln von Office Dokumenten (zum Beispiel ODT) läuft Apache Tika.

Das Docker compose file liegt unter `/opt/vllm/`

Auf milla.ping.de (aka buero) läuft ein nginx der open-webui unter [https://ki.ping.de](https://buero.ping.de) erreichbar macht. Für den Login nutzt bitte unser [Single Sign-On](https://techdoc.ping.de/Anleitungen/Single%20Sign-On).

Der vLLM bietet auch direk auf Port 8000 unter [https://ki.ping.de:8000/v1](https://ki.ping.de:8000/v1) eine OpenAI-kompatible API. Ihr benötigt das Bearer Token, ihr erhaltet es unter [https://ki.ping.de:9443/protected/](https://ki.ping.de:9443/protected/).

### Ollama mit Open-WebUI

<span class="anchor" id="bkmrk--84"></span>

Alternativ können wir den [Ollama](https://ollama.com/) Server starten. Der ist aber nicht mehr der bevorzugte Dienst, u.a. weil die Performance mit mehreren Usern schlecht ist.<span class="anchor" id="bkmrk--87"></span>

Das Docker compose file liegt unter `/opt/ollama/` <span class="anchor" id="bkmrk--89"></span><span class="anchor" id="bkmrk--90"></span>

Beim Einsatz von Ollama erscheint im Model-Selektor von Open-WebUI ein grüner Punkt neben den LLMs, die derzeit im GPU Speicher sind. <span class="anchor" id="bkmrk--93"></span><span class="anchor" id="bkmrk--94"></span>

Das Script `/usr/local/bin/ollama-nogpu.sh` ist dafür da, den Ollama Container neu zu starten, falls dieser mal wieder die GPUs nicht erkennt. <span class="anchor" id="bkmrk--97"></span><span class="anchor" id="bkmrk--98"></span>

## ComfyUI

<span class="anchor" id="bkmrk--100"></span>

[ComfyUI](https://www.comfy.org/) (primär für KI-Bildergenerierung) ist noch nicht fertig installiert, es liegt unter `/opt/comfyui` und kann bei Bedarf gestartet werden. Vorher sollte ollama gestoppt werden, weil nicht genügend GPU VRAM für beide Dienste gleichzeitig vorhanden ist.