Wir bauen einen Raspberry Pi Konsolenserver

Wir bauen einen Raspberry Pi Konsolenserver

Warum einen Konsolenserver selbst bauen?

Stellen Sie sich Folgendes vor: Sie arbeiten an der Konfiguration Ihrer Router im Rechenzentrum. Sobald Sie die neue Konfiguration aktivieren, wird Ihre Verbindung abgebrochen. Was nun? Wenn Sie darauf vorbereitet sind, besitzen Sie einen Konsolenserver mit einer redundanten Netzwerkverbindung, über den Sie mit einem seriellen Kabel Ihre Router wieder erreichen können. Leider sind diese Konsolenserver recht teuer und unflexibel. Also haben wir beschlossen, unseren eigenen zu bauen.

Der Entwurf des Konsolenservers wurde mir überlassen. Das auf einem Raspberry Pi aufbauende System muss in der Lage sein, mit den seriellen Schnittstellen unserer Switche und Router kommunizieren zu können. Nur so ist sichergestellt, dass wir über unsere redundante Netzwerkanbindung die Geräte noch erreichen, wenn sie über die Hauptleitungen nicht mehr erreichbar sind. Da ein Raspberry Pi von sich aus über keine seriellen Schnittstellen verfügt, setzen wir Adapterkabel ein, welche USB auf Seriell wandeln.

Eine weitere Aufgabe des Konsolenservers ist die Überwachung unserer Racks: Er checkt die Umgebungstemperatur und Luftfeuchtigkeit des Racks und prüft regelmäßig, ob die seriellen Schnittstellen zu den Switchen und Routern noch erreichbar sind.

Für den Entwurf musste ich die richtigen Komponenten für den Server finden und sie dann mit selbst entworfenen Teilen zusammenfügen. So lernte ich, wie man CAD-Software verwendet, um Teile zu entwerfen, die 3D gedruckt werden können.

Um einen konstanten Betrieb sicherzustellen, benutzen wir eine zusätzliche Schaltung für die Bereitstellung einer redundanten Stromversorgung (Dual Ideal Diode Supply). Auf diese Weise können wir den Konsolenserver weiter nutzen, selbst wenn eine der beiden Stromversorgungen im Rechenzentrum oder ein einzelnes Netzteil ausfällt. Wir verwenden ausschließlich originale Raspberry Pi Netzteile, da wir in der Vergangenheit Probleme mit der Zuverlässigkeit der Stromversorgung hatten, die durch Netzteile von Drittanbietern stammten.

Aufbau des Konsolenservers

Der Server besteht aus mehreren Teilen: einem Gehäuse, einem Raspberry Pi, einem Lüfter, einer Ein/Aus-Taste, einem Temperatursensor und einem Stromanschluss. Um alles zusammen zu fügen werden zwei 3D gedruckte Teile benötigt, nämlich eine Plattform und eine Blende (FreeCAD-Dateien). Außerdem müssen Jumper-Kabel an die Elektroteile gelötet werden.

Löten/Verkabeln

Verkabelung des Konsolenservers

Um den Lüfter und den Druckknopf an den Raspi anzuschließen, müssen erst die Jumper-Kabel angelötet werden. Von 9 Jumper-Kabeln und von den zwei Lüfter-Kabeln muss das Ende abgeschnitten werden.

An den Pluspol des Druckknopfs wird der 330R Widerstand zwischen Kabel und Pin gelötet. An die restlichen Pins und an die Lüfter Kabel werden dann Jumper-Kabel gelötet.

Dann werden die Embedding Muttern mit dem Lötkolben erhitzt und in die Plattform eingeschmolzen wie im Bild:

Plattform mit eingeschmolzenen Muttern

Jetzt kann man den Raspi in seine Halterung einrasten und den Dual USB-C Supply festkleben. Wenn das erledigt ist, kann man den Lüfter festschrauben. Die 5mm Abstandshalter kommen zwischen den Lüfter und die Plattform.

Vor der Verkabelung ist es schlau, den Druckknopf und den Ethernet Port Extender in die Blende einzubauen. Es ist möglich, dass die Schraubenlöcher im 3D Druck nicht groß genug werden, also müssen sie dann vergrößert werden.

Die Jumper-Kabel können dann, wie in der Tabelle, angeschlossen werden. pinout.xyz wird hier sehr hilfreich sein.

AnschlussPinFunktion
Temperatur Sensor VccPin 25v Power
Lüfter PluspolPin 45v Power
Druckknopf PinPin 5GPIO 3
Lüfter MinuspolPin 6Ground
Temperatur Sensor DataPin 7GPIO 4
Druckknopf LED PluspolPin 8GPIO 14
Temperatur Sensor GroundPin 9Ground
Druckknopf LED MinuspolPin 14Ground
Druckknopf PinPin 34Ground

DHT22-Sensor Pinout

Festkleben

Danach kann man den USB Hub, die Plattform und den Temperatursensor mit einer Heißklebepistole festkleben, wie im Bild (Der Temperatursensor ist im Bild hinter dem USB Hub).

Festgeklebter USB-Hub und Temperatursensor

Fertig montierter Konsolenserver

Software-Installation

Genau so wichtig wie die Hardware ist natürlich auch die Software. Wir benutzen RaspiOS und konfigurieren den Bootloader, um Funktionalität für die Ein/Aus-Taste freizuschalten. Außerdem stellen wir einen SSH-Zugang bereit.

Image runterladen und konfigurieren

Unter downloads.raspberrypi.org/raspios_lite_armhf_latest kann man ein RaspiOS-Image runterladen. Das Image muss vor dem ersten Booten noch editiert werden. Man kann das Image auf ein Flash Drive oder eine SD-Karte flashen und dann editieren. Linux-Nutzer können das Image mit kpartx -s -av <image name>.img mounten und so editieren.

SSH-Konfiguration

Um den SSH-Zugang zu ermöglichen, muss man eine leere Datei namens ssh unter /boot/firmware/ anlegen. SSH Public Keys können dann in home/pi/.ssh/authorized_keys kopiert werden (ein Public Key pro Zeile).

Nutzer-Konfiguration

Um sich per SSH einloggen zu können, muss ein Nutzer erstellt werden. Dafür legt man eine Datei namens userconf in der Boot-Partition an und trägt ein:

nutzer:verschlüsseltes-passwort

Das verschlüsselte Passwort generieren Sie wie folgt im Terminal:

echo 'meinpasswort' | openssl passwd -6 -stdin

Bootloader-Konfiguration

/boot/firmware/config.txt benötigt die folgenden Zeilen:

dtoverlay=gpio-shutdown
# dtoverlay=disable-bt
# dtoverlay=disable-wifi
enable_uart=1

gpio-shutdown ist erforderlich, damit der Raspberry Pi mit der Power-Taste ausgeschaltet werden kann. enable_uart aktiviert eine serielle Konsole, die wir an die Status-LED des Einschaltknopfes anschließen. Auf diese Weise flackert das Licht, während das Gerät hochfährt, und bleibt ansonsten konstant.

Um WiFi oder Bluetooth auszuschalten, können einfach die # entfernt werden.

Hostname-Konfiguration

Der gewünschte Hostname muss in der /etc/hostname eingetragen werden. /etc/hosts muss dann außerdem wie folgt ergänzt werden:

127.0.0.1       localhost
127.0.1.1       <hostname>

Mit diesem Image lässt sich der Raspberry Pi booten. Wenn alles funktioniert, sollten auch die Netzwerkverbindung und der SSH-Zugang klappen.

Weitere Installation

Die folgenden Befehle können für das Setup angepasst werden:

# Passwort-Login für SSH nicht mehr zulassen
# (Stelle sicher, dass ein funktionierender SSH-Key hinterlegt ist)
sed 's/#PasswordAuthentication yes/PasswordAuthentication no/' -i /etc/ssh/sshd_config

# Standardsprache auf Deutsch wechseln
sed 's/# de_DE.UTF-8 UTF-8/de_DE.UTF-8 UTF-8/' -i /etc/locale.gen
locale-gen de_DE.UTF-8
update-locale LANG=de_DE.UTF-8

# Zeitzone setzen
timedatectl set-timezone Europe/Berlin

# pi-Passwort ändern
chpasswd <<<"pi:<passwort>"

# Software-Updates
apt update
apt upgrade --yes

# Avahi, WiFi und Bluetooth ausschalten
systemctl disable avahi-daemon.service
systemctl disable wpa_supplicant
systemctl disable bluetooth
systemctl disable hciuart
systemctl disable inetd
systemctl disable alsa-utils

Temperatursensor

Nachdem ein Temperatursensor angeschlossen wurde, möchten wir natürlich auch gerne Temperaturwerte ablesen. Dies ist mit der folgenden Python-Funktion leicht möglich. Natürlich muss aber erst Python auf dem Pi installiert werden.

Paket-Installation

apt install python3-dev python3-pip libgpiod2 --yes
pip3 install adafruit-circuitpython-dht

Python-Funktion

In diesem Beispiel wird davon ausgegangen, dass der Sensor an GPIO 4 angeschlossen ist. Wenn der Sensor an einem anderen GPIO-Pin hängt, muss SENSOR_PIN angepasst werden.

import adafruit_dht
import board

SENSOR_PIN = board.D4
DHT_SENSOR = adafruit_dht.DHT22(SENSOR_PIN, use_pulseio=False)

def check_temp():
    """Get temperature and humidity from sensor."""
    try:
        humidity = DHT_SENSOR.humidity
        temperature = DHT_SENSOR.temperature
        sensorok = 1
    except BaseException:
        humidity = 0
        temperature = 0
        sensorok = 0
    return (humidity, temperature, sensorok)

Einkaufsliste