Raspberry als Dokuwiki-Server Teil 1

Vorbereitung zur Installation
Letztes Update 2020/11/23 13:40

Voraussetzung ist ein lauffähiges System mit SSH Zugang und einer am USB-Port angeschlossenen Festplatte oder einem USB-Stick.
In diesem Beispiel wird 2020-08-20-raspios-buster-armhf-lite verwendet.

Datei ssh in der Boot-Partition

Wenn man keine Möglichkeit hat, den Raspberry Pi per Tastatur, Maus und Bildschirm in Betrieb zunehmen, dann kann man auf der SD-Speicherkarte in der Boot-Partition eine leere Datei mit dem Namen „ssh“ erstellen. Wenn man das mit Windows macht, dann muss man darauf achten, dass keine Dateiendung hinzugefügt wird.

Die IP-Adresse des Paspberry kann mit Tools wie dem Advanced IP Scanner herausgefunden werden.

Wenn Raspbian gestartet wird, dann wird SSH aktiviert und die Datei automatisch gelöscht.

Paketlisten aktualisieren

sudo apt update -y && apt full-upgrade -y && apt autoremove -y

Fixe IP-Adresse

Der Raspberry Pi bekommt eine fixe IP-Adresse, hier 192.168.20.210. Hierfür öffnen wir die dhcpcd.conf:

sudo nano /etc/dhcpcd.conf

und fügen an das Ende der Datei folgendes ein:

# Eigenes Netzwerk
interface eth0
static ip_address=192.168.20.210/24
static routers=192.168.20.20
static domain_name_servers=192.168.20.20

Die dhcpcd.conf speichern und den Pi rebooten:

sudo reboot

Passwort für User pi ändern

Das Standardpasswort für den User pi ändern. Bei der Eingabe wird nichts angezeigt.

~ $ passwd
Changing password for pi.
Current password:altes_passwort
New password:neues_passwort
Retype new password:neues_passwort
passwd: password updated successfully
~ $

Wenn password updated successfully angezeigt wird, gilt ab sofort das neu eingegebene Passwort.

Midnight Commander installieren

Für die Bequemlichkeit wird der Midnight Commander installiert.

sudo apt install mc -y

Weitere Informationen sind im Artikel Midnight Commander auf dem RPi installieren zu finden.

Key-basierte SSH Logins mit PuTTY

Hier wird beschrieben, wie man vom Windows-Desktop mit PuTTY auf den Pi mit SSH verbinden kann, ohne Username und Passwort einzugeben.

Benötigt wird dazu PuTTY als SSH Client und Puttygen zum Erzeugen der Keys. Alle benötigten Programme sind auf der Seite: http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html zu finden.
Die Programme sind ausführbar und müssen daher nicht installiert werden

Ein Keypaar generieren

Mit PuTTYgen wird nun ein private/public Keypaar erzeugt. Dafür wird nun der PuTTY Key Generator gestartet. Die Einstellun­gen wie im Bild vor­nehmen:

(CC) BY-SA

Auf Generate drücken und und während der Erstellung der Keys den Cursor mit der Maus über das leere Feld bewegen.

(CC) BY-SA

Es wurde ein private/public Keypaar erzeugt. Auf die Eingabe von Key Comment und Key Passphrase wird hier verzichtet. Bei Key Comment wird üblicherweise die Mail-Adresse eingetragen. Mit der Key Passphrase kann ein Kennwort eingegeben werden, welches dann beim Verbindungsvorgang eingegeben werden muss. Es erhöht zwar die Sicherheit, ist aber in geschlossenen Netzwerken nicht unbedingt erforderlich.

(CC) BY-SA

Public und private Key speichern. Den Public Key als Textdatei (zB. id_rsa.txt) und Private Key mit der Endung .ppk speichern.
Den Private Key vornehmlich in einem Bereich speichern, in dem nur der Anwender Zugriff hat.

Den Public Key auf dem Raspberry Speichern

Den Public Key nun auf den Raspberry übertragen. Das Programm FileZilla ist zB. ein geeigneter FTP-Client um den Datentransfer durchzuführen.

(CC) BY-SA

Die Datei id_rsa.txt in das Verzeichnis pi am Raspberry kopieren.

Auf dem Raspberry als User pi einloggen und in der Konsole ein Verzeichnis .ssh anlegen:

~ $ mkdir ~/.ssh
~ $ chmod 700 ~/.ssh
~ $ sudo cat id_rsa.txt >> ~/.ssh/authorized_keys
~ $ nano ~/.ssh/authorized_keys

In der Datei authorized_keys muss der Key in einer einzelnen Zeile stehen, dh., es sind alle Zeilenvorschübe etc. zu entfernen. Vor dem eigentlichen Key muss ssh-rsa eingefügt werden, falls nicht vorhanden. Es sollte etwa so wie im Bild aussehen.

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "rsa-key-20170207"
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEApInMGIfA370....$
---- END SSH2 PUBLIC KEY ----

Falls bereits vorhanden, die authorized_keys Datei nach ~/.ssh/authorized_keys kopieren.
Der Eintrag in Putty kann kopiert werden, indem man eine bestehende Verbindung lädt und unter einem neuen Namen und den neuen Parametern wieder speichert.
Die beiden Dateien sind hier vorhanden auf data/media/putty.

SSHD Konfigurieren

~ $ sudo nano /etc/ssh/sshd_config

In der sshd_config folgenden Eintrag kontrollieren und eventuell vornehmen

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

und dann den sshd neu starten:

~ $ sudo /etc/init.d/ssh restart

Den Private Key an das Profil binden

PuTTY starten, das Profil laden und die Kategorie SSH/Auth aufrufen (CC) BY-SA

im Feld Connection / Data Auto-login username den User pi eintragen. (CC) BY-SA

Im Feld Private key file for authentication Ort und Name des Private Key Files eintragen, wieder zurück in die Katgorie Session und die Taste Save drücken.
Für ein Login am Raspberry nun PuTTY Starten und das entsprechende Profil auswählen.
(CC) BY-SA

Kennwortauthentifizierung auf dem Raspberry Pi deaktivieren

Nachdem wir nun eine Verbindung mit dem Raspberry Pi mithilfe von Schlüsseln herstellen können, kann die Kennwortauthentifizierung für zusätzliche Sicherheit vollständig deaktiviert werden. Damit kann man sich nur mehr von Rechnern mit dem PI verbinden, auf denen der Public Key gespeichert ist.

Dazu die SSHD Configuration öffnen

~ $ sudo nano /etc/ssh/sshd_config

und den Eintrag PasswordAuthentication yes auf PasswordAuthentication no ändern, und dann den sshd neu starten:

~ $ sudo /etc/init.d/ssh restart

Falls der RPi ohne Tastatur / Monitor betrieben wird, ist es empfehlenswert eine eigene Session von Putty für diesen Vorgang zu verwenden, um im Fehlerfall noch eine gültige Verbindung für Korrekturen offen zu haben.

Quelle: https://putty-ssh.com/

Hostname ändern

Um den Raspberry leichter zu identifiziern, wird ein aussagekräftiger Name eingetragen.
Dies wird über raspi-config erledigt:

sudo raspi-config

Punkt 2 - Network Options, N1 Hostname, RFC Regeln bestätigen, Name eingeben und mit ENTER bestätigen.

Danach aus dem Konfigurationstool aussteigen und den RPi im nächsten Fenster mit Yes neu booten, um den Hostnamen zu übernehmen.

Falls nicht neu gebootet wird, wird es zu Fehlermeldungen bei eingaben an der Konsole kommen.

Nach dem Reboot ist an der Konsole der neue Hostname zu sehen. In diesem Fall

pi@Dokuwiki:~ $

USB Festplatte am Raspberry installieren

Um größere Datenmengen unterzubringen, ist es notwendig, einen Datenträger zu installieren.
Nachdem die Festplatte am USB-Port angeschlossen wurde, müssen wir prüfen, ob sie gefunden wurde.

1. Festplatte erkennen

An der Konsole folgenden Befehl absetzen:

dmesg # für die komplette Liste, oder
dmesg | grep sda: # für eine Liste, die nur Zeilen druckt, welche ''**sda:**'' enthalten

Damit wird die Festplatte identifiziert. In diesem Fall ist es /dev/sda1

Siehe dritte Zeile von unten.

2. Partition erstellen

sudo fdisk /dev/sda

In weiterer Folge nachstehendes am fdisk-Prompt eingeben:

Command (m for help):

n – um eine neue Partition zu erstellen
p – für eine primäre Partition
1 – für die erste Partition
dann 2 x die vorgeschlagenen Werte übernehmen

Command (m for help):

w – um die Änderungen aud die Disk zu schreiben.

3. Festplatte formatieren:

sudo mkfs.ext4 /dev/sda1

4. Festplatte mounten:

sudo mkdir /mnt/ssd
sudo mount /dev/sda1 /mnt/ssd

Nun wurde im Ordner /mnt/ das Verzeichnis /ssd/ erstellt und die Festplatte in diesem Ordner gemountet.

Mit der Eingabe von:

df -l -h

können wir kontrollieren, ob die neue Platte gefunden wird.

Dateisystem Größe Benutzt Verf. Verw% Eingehängt auf
/dev/root 29G 4,0G 24G 15% /
devtmpfs 459M 0 459M 0% /dev
tmpfs 463M 0 463M 0% /dev/shm
tmpfs 463M 6,4M 457M 2% /run
tmpfs 5,0M 4,0K 5,0M 1% /run/lock
tmpfs 463M 0 463M 0% /sys/fs/cgroup
>/dev/sda1 118G 60M 112G 1% /mnt/ssd
/dev/mmcblk0p1 63M 21M 42M 33% /boot
tmpfs 93M 0 93M 0% /run/user/1000

Siehe 3. Zeile von unten

5. Automatisch beim Booten mounten

UUID feststellen:

sudo ls -l /dev/disk/by-uuid/

insgesamt 0
lrwxrwxrwx 1 root root 15 Feb 10 23:27 0EDC-9EC5 -> ../../mmcblk0p1
lrwxrwxrwx 1 root root 9 Feb 10 23:27 7d4bd715-1158-4a82-a235-b100038fb4b6 -> ../../sda
lrwxrwxrwx 1 root root 15 Feb 10 23:27 7f593562-9f68-4bb9-a7c9-2b70ad620873 -> ../../mmcblk0p2
lrwxrwxrwx 1 root root 10 Feb 10 23:27 f9b3a36b-64d2-412c-8218-0fc2d083dd8e -> ../../sda1

sudo nano /etc/fstab

Für unsere Festplatte folgende Zeile einfügen:

UUID=f9b3a36b-64d2-412c-8218-0fc2d083dd8e /mnt/ssd ext4 noauto,x-systemd.automount,x-systemd.idle-timeout=3600,defaults 0 0
Alternativ, da es beim letzten Release von Raspbian (2020-05-27) Probleme gab:
UUID=f9b3a36b-64d2-412c-8218-0fc2d083dd8e /mnt/ssd ext4 auto,nofail,sync,users,rw 0 0

Danach Rechte vergeben, dass alle auf die Disk schreiben können. Falls Bedenken bestehen, dass unberechtigte Zugriff haben, die Rechte entsprechend ändern:

sudo chmod -R 777 /mnt/ssd/

Raspbian verwendet das Init-System systemd. Dieses enthält einen Automounter, der auch durch einen Eintrag in fstab aktiviert werden kann. Trägt man in einem fstab-Eintrag die mount-Optionen noauto,x-systemd.automount ein, so wird die Partition bzw. Netzwerk-Freigabe nicht schon beim Systemstart, sondern erst bei einem Zugriffsversuch automatisch eingebunden. Fügt man noch zusätzlich die Option x-systemd.idle-timeout=60 ein, so wird die eingebundene Partition bzw. Freigabe nach einer Untätigkeit von 60 Sekunden wieder automatisch ausgehängt. Natürlich kann der Wert für das Timeout beliebig verändert werden.

Quelle: https://wiki.ubuntuusers.de/fstab/

Den Pi rebooten und kontrollieren, ob die Festplatte gefunden wird.

sudo reboot

WiringPi & die I²C Libary installieren

Logo WiringPi ist ein nützliches Framework um die GPIO Ein-und Ausgänge am Raspberry Pi zu schalten. Natürlich ist das Schalten der GPIO’s auch ohne WiringPi möglich, der Einsatz von WiringPi verein­facht die ganze Sache aber und ist zudem erweiterbar.

Falls GIT noch nicht installiert ist:

sudo apt install git-core -y

Falls die I²C Libary benötigt wird:

sudo apt install libi2c-dev -y

WiringPi aus dem Repository installieren:

sudo apt install wiringpi

Die Version der installierten Version ermitteln:

~ $ gpio -v
gpio version: 2.50
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Unknown17, Revision: 01, Memory: 0MB, Maker: Sony
* Device tree is enabled.
*--> Raspberry Pi 4 Model B Rev 1.1
* This Raspberry Pi supports user-level GPIO access.

Die Version 2.50 wird am Raspberry Pi 4 nicht oder nicht richtig funktionieren. Daher muß ein Update installiert werden:

cd /tmp
wget https://project-downloads.drogon.net/wiringpi-latest.deb
sudo dpkg -i wiringpi-latest.deb

~ $ gpio -v
gpio version: 2.52
Copyright (c) 2012-2018 Gordon Henderson
This is free software with ABSOLUTELY NO WARRANTY.
For details type: gpio -warranty
Raspberry Pi Details:
Type: Pi 4B, Revision: 01, Memory: 4096MB, Maker: Sony
* Device tree is enabled.
*--> Raspberry Pi 4 Model B Rev 1.1
* This Raspberry Pi supports user-level GPIO access.

Falls bereits eine alte Version von WiringPi installiert ist und diese entfernt werden soll, bevor die neue Version übertragen wird:

sudo apt purge wiringpi
hash -r

Damit ist WiringPi installiert. Wie man damit GPIO's schalten kann, wird im Kapitel "Mit WiringPi schalten" und Anschluss eines Summers erklärt.

Info:
Version kontrollieren ⇒ gpio -v
Status anzeigen ⇒ gpio readall
I²C-Treiber laden ⇒ gpio load i2c
weitere Schalter ⇒ gpio -h

Quellen:
Gordons Projects
WiringPi
WiringPi Update

Eine Status-LED beim Start des Pi einschalten

Um nicht nur zu sehen, ob der Pi am Strom angeschlossen, sondern dieser auch betriebsbereit ist, wird am Anschluss GPIO05, WPi21 eine LED mit einem Vorwiderstand angeschlossen. Die Größe des Vorwiderstandes sollte an die Stromaufnahme der LED angepasst werden. In diesem Projekt wird zur Ansteuerung der LED's ULN2803 verwndet, der mit 5V versorgt wird.

Für weitere Information siehe Schaltplan

WiringPi ist nicht unbedingt notwendig. Da aber WiringPi hier auch für andere Vorhaben notwendig ist, wird es auch zur Ausführung dieses Scripts verwendet.

Um die LED zum leuchten zu bringen, ist ein kleines Script notwendig. Dieses wird hier in C erstellt.

sudo nano statusled_on.c

#include <wiringPi.h> int main (void) { wiringPiSetup () ; pinMode (21, OUTPUT) ; { digitalWrite (21, HIGH) ; } return 0 ; }

Das Script wird kompiliert:

gcc -o statusled_on statusled_on.c -lwiringPi

und in die Verzeichnissse /etc/init.d/ und /bin/ kopiert:

sudo cp statusled_on /etc/init.d/statusled_on
sudo cp statusled_on /bin/statusled_on

Im Verzeichnis /etc/init.d/ wird eine Datei mit dem Namen local.statusled erstellt:

sudo nano /etc/init.d/local.statusled

Es wird die vereinfachte Vorlage /etc/init.d/skeleton verwendet.

#! /bin/sh ### BEGIN INIT INFO # Provides: local.autostart # Required-Start: $start # Required-Stop: $shutdown # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: schaltet die StatusLED ein # Description: Lange Bechreibung ### END INIT INFO # Author: ede # Aktionen /bin/statusled_on

Der Kopfteil ist sehr wichtig und muss vorhanden sein, denn er wird später vom Befehl update-rc.d verwendet. Er darf nicht gelöscht und sollte entsprechend angepasst werden. Unterhalb von # Aktionen steht der Befehl zur Ausführung des C-Scripts.

Da die GPIO Pins ohnehin beim Abschalten stromlos werden, kann die /etc/init.d/local.statusled einfach gehalten werden.

Die Datei wird nun ausführbar gemacht:

sudo chmod 755 /etc/init.d/local.statusled

Abschließend fügt man das Skript mit dem Befehl update-rc.d in die entsprechenden Runlevel ein.

sudo update-rc.d local.statusled defaults

Ab dem nächsten Reboot wird nun ab der Betriebsbereitschaft des Pi eine LED aktivert.

Quellen:

Autostartskript erstellen und einbinden
Raspberry Pi - run program at start-up

Ein- & Ausschalter aktivieren

Der Taster muss mit GPIO3 & Ground verbunden werden Ab dem Raspberry Pi3 genügt ein einfacher Taster, der an den GPIO-Pins 5 & 6 (GPIO3 & Ground) angeschlossen wird.
Der Taster muss mit GPIO3 & Ground verbunden werden. Damit der Ein- & Ausschalter funktioniert, muss eine neue Befehlszeile in die Datei /boot/config.txt in der Sektion [pi4] eingefügt werden.

sudo nano /boot/config.txt

dtoverlay=gpio-shutdown,gpio_pin=3, active_low=1,gpio_pull=up

[pi4]
# Enable DRM VC4 V3D driver on top of the dispmanx display stack
dtoverlay=vc4-fkms-v3d
max_framebuffers=2
# GPIO pin3 für Ein- Ausschalter überwachen
dtoverlay=gpio-shutdown,gpio_pin=3, active_low=1,gpio_pull=up

Nach der Änderung der config.txt muss der Raspberry rebootet werden:

sudo reboot

Falls diese Anwendung beim Raspberry Pi4 nicht funktionieren sollte, dann muss vermutlich ein neuer Bootloader auf den RPi aufgespielt werden.

Siehe dazu Bootloader wiederherstellen.

Der Ein- / Ausschalter funktioniert nur dann, wenn i2c nicht aktiviert ist. Der Pin 5 [GPIO 3 (SCL1)] ist Teil des I2C Anschlußes. Sobald über raspi-config I2C aktiviert ist, funktioniert die Anwendung nicht mehr. Man kann einen anderen Pin in der /boot/config.txt angeben. Über diesen kann der Raspberry zwar aus- aber nicht mehr eingeschaltet werden kann. Dies geht dann nur mehr durch unterbrechen der Stromversorgung oder mit einem Reset.