Das Fahrrad

Das Fahrrad, das eigene Fahrrad ist und bleibt ein Stück Freiheit!

… sagt der Friedi zur IAA 2025 und der muss es ja wissen.

Verwaltungshandeln

Verwaltungshandeln muss stehts rechtmäßig, jedoch nicht unbedingt sinnvoll sein!
– Ja, das Gefühl kenne ich 🤡🤣

Verwaltungshandeln muss immer rechtmäßig sein („Gesetzmäßigkeit der Verwaltung“).
Es muss nicht immer sinnvoll im Sinne von zweckmäßig oder optimal erscheinen, solange es sich im Rahmen des Gesetzes bewegt.
Die Kontrolle der Sinnhaftigkeit (Zweckmäßigkeit) ist in der Regel keine Aufgabe der Gerichte, sondern der politischen oder verwaltungsinternen Kontrolle.

Duplicati-Backup auf dem Raspi mit SFTP speichern

🧰 Voraussetzungen

  • Raspberry Pi läuft mit SSH-Server (`openssh-server`)
  • SSD ist bereits gemountet unter `/media/san2tb`
  • Dein Client (der Duplicati ausführt) ist Linux

🔐 1. SSH-Schlüsselpaar auf dem Client erstellen

Auf dem Rechner, auf dem Duplicati läuft, wird ein Schlüsselpaar erstellt

ssh-keygen -t ed25519 -f ~/.ssh/sftpusr_key -N ""

Ergebnis:
Private Key: `~/.ssh/sftpusr_key`
Öffentlicher Key: `~/.ssh/sftpusr_key.pub`

Der Parameter `-N „“` sorgt für kein Passwort.

👤 2. Neuen Benutzer auf dem Raspberry Pi erstellen

Optional: Verhindere SSH-Login mit Passwort:

sudo adduser --disabled-password --gecos "" sftpusr
sudo passwd -l sftpusr 
# sudo usermod -d /home/sftpusr sftpusr 
sudo usermod -s /usr/sbin/nologin sftpusr

🔑 3. SSH-Zugang mit Schlüssel einrichten

1. Verzeichnisse erstellen:

sudo mkdir -p /home/sftpusr/.ssh
sudo chown sftpusr:sftpusr /home/sftpusr/.ssh
sudo chmod 700 /home/sftpusr/.ssh

2. Öffentlichen Schlüssel auf Pi übertragen:

ssh-copy-id -i ~/.ssh/sftp_user_key.pub sftp-user@raspi

Oder manuell:

cat ~/.ssh/sftpusr_key.pub | ssh pi@ "sudo tee /home/sftpusr/.ssh/authorized_keys"
sudo chown sftpusr:sftpusr /home/sftpusr/.ssh/authorized_keys
sudo chmod 600 /home/sftpusr/.ssh/authorized_keys

📁 4. Schreibrechte auf externe SSD einrichten

Angenommen, das Backup-Ziel ist: `/media/san2tb/backup_x13g3`

Ordner erstellen und Besitzerrechte auf `sftpusr` ändern:

sudo mkdir -p /media/san2tb/backup_x13g3
sudo chown -R sftpusr:sftpusr /media/san2tb/backup_x13g3

`sftpusr` braucht Schreibrechte in diesem Ordner – ohne Zugriff auf andere SSD-Bereiche.

🔐 5. Optional: Nur SFTP (kein SSH-Terminal)

Den User auf reines SFTP einschränken. Das ist empfohlen für Backup-Ziele. SSH-Konfiguration auf dem Pi anpassen:

sudo nano /etc/ssh/sshd_config

Am Ende einfügen:

Match User sftpusr
    ForceCommand internal-sftp
    ChrootDirectory /home/sftpusr
    PermitTTY no
    AllowTcpForwarding no
    X11Forwarding no

Das sperrt `sftpusr` in `/home/sftpusr`. Dann muss das Backup-Verzeichnis darin sein.

⚠️ WICHTIG:
`ChrootDirectory` muss root gehören, sonst funktioniert SFTP nicht.

sudo chown root:root /home/sftpusr
sudo chmod 755 /home/sftpusr

sudo mkdir -p /home/sftpusr/backup
sudo chown sftpusr:sftpusr /home/sftpusr/backup

Temporär zum testen:

sudo mount --bind /media/san2tb/backup_x13g3 /home/sftpusr/backup

sudo systemctl restart ssh

Mount dauerhaft via /etc/fstab einbinden.
Am Ende der Datei einfügen:

/media/san2tb/backup_x13g3 /home/sftpusr/backup none bind 0 0

🔄 6. In Duplicati einrichten

Neues Backup erstellen

  1. Zieltyp: `SFTP (SSH)`
  2. Server und Pfad:
    Server: IP des Raspberry Pi
    Pfad:
    Wenn `ChrootDirectory` gesetzt: /backup
    Sonst (z. B. ohne Chroot): /home/sftpusr/backup
  3. Authentifizierung:
    Benutzername: sftpusr
    Passwort: bleibt leer
    SSH Private Key (ohne Passphrase):
    Lade `/source/.ssh/sftpusr_key` hoch oder kopiere den Inhalt rein.
  4. Testverbindung klicken

✅ Fertig!

Netzwerkmanager bookworm

Mit dem Raspberry Pi OS Bookworm kommt der Netzwerkmanager.
Neben einer CLI-Version gibt es auch eine grafische Version die mit sudo nmtui aufgerufen werden kann.

Hier ein paar Befehle für die CLI-Version die Helfen können:

Zeige eine Liste der Geräte

nmcli -o device show

Zeige eine Liste mit den angelegten Verbindungen an:

sudo nmcli -p connection show

Zum Anlegen einer statischen Verbindung:

sudo nmcli c mod "Wired connection 1" ipv4.addresses 192.168.130.11/24 ipv4.method manual
sudo nmcli con mod "Wired connection 1" ipv4.gateway 192.168.130.1
sudo nmcli con mod "Wired connection 1" ipv4.dns 192.168.130.1

Wenn mehrere IP-Adressen angebunden werden sollen:

sudo nmcli c mod "Wired connection 1" ipv4.addresses "192.168.130.11/24, 192.168.130.12/24, 192.168.130.13/24" ipv4.method manual

Zum Altivieren der Verbindung:

sudo nmcli c down "Wired connection 1" && sudo nmcli c up "Wired connection 1"

Dabei ist aber zu beachten, sollte man per ssh verbunden sein, wird die Verbindung hierdurch natürlich beendet…

Neuer Massespeicher im Laptop

So langsam aber sicher wird der Speicherplatz für den Massespeicher auf dem Laptop zu klein, das ganze KI-Zeug braucht relativ viel Speicherplatz.
Da wir mit LVM / LUKS arbeiten, sind ein paar Schritte mehr notwendig…

  • Booten mit CloneZilla und Festplatte auf externe HDD klonen
  • neue SSD einbauen
  • Booten mit CloneZilla und Image zurück auf Festplatte spielen, Partitionen wie im Original belassen und nicht prozentual anpassen.
  • Live-USB stick booten und mit gparted die LVM-Partition entsperren und vergrößern. Gparted sieht nur die LVM-Partition und nicht die darin enthaltenen ‚logischen Volumen‘
  • Live-System beenden und ins normale System booten

Einen Überblick über die einzelnen Volume erhalten wir mit lvdisplay

Zunächst entfernen wir die Swap-Partition:

# Swap deaktivieren
swapoff -a
# mit lvremove die die logische Partionion 
lvremove /dev/vgmint/swap_1

Ermittel nun den freien Platz in der Partition: vgdisplay. Wenn die Einheit nicht ganz passt, kann sie mit vgdisplay --unit G angepasst werden.

Nachdem der Versuch das ganze mit GB anzugeben wegen Umrechnungsungenauigkeiten nicht geklappt hat, rechnen wir das ganze in Extends aus:

1 Extent = 4 MiB = 0,00390625 GB
32 GB / 0.00390625 ≈ 8192 Extents

715128 (verfügbar) - 8192 (für Reserve) = 706936 Extents

# Befehl zur Vergrößerung des Volumens
lvextend -l +706936 /dev/vgmint/root

Anschließend muss noch das Dateisystem vergrößert werden:

resize2fs /dev/vgmint/root

Und die Swap-Partion wieder hergestellt (es wird der komplette leere Platz verwendet) werden:

lvcreate -l 100%FREE -n swap_1 vgmint
mkswap /dev/vgmint/swap_1
swapon /dev/vgmint/swap_1

# Zum Überprüfen ob alles läuft:
swapon --show
free -h

Virtuelle Python Umgebungen

Die Einrichtung erfolgt im Verzeichnis in dem das Script liegt/ von dem das Script aus gestartet wird.
python3 -m venv NAME

Der NAME ist durch den zu verwenden Name zu ersetzten. Sinnvoll ist es die Umgebung gleich zu benennen wie das Script, damit später die Zuordnung klar ist.

Die Umgebung wird aktiviert mit:
source NAME/bin/activate

Nach dem aktivieren können fehlende bzw. spezielle Bibliotheken installiert werden. z.B.:
pip3 install pillow pyexiftool langchain-ollama

Lokale LLM im Docker

Wir verwenden Ollama (https://ollama.com/)

Installation über docker compose.

docker-compose.yaml

services:
  ollama:
    image: docker.io/ollama/ollama:rocm
    container_name: ollama
    volumes:
      - ollama:/root/.ollama
    ports:
      - 11434:11434
    devices:
      - /dev/kfd:/dev/kfd
      - /dev/dri:/dev/dri
#    environment:
#      - OLLAMA_KEEP_ALIVE=1h
#      - OLLAMA_HOST=127.0.0.1
    pull_policy: always
    tty: true
    restart: unless-stopped

volumes:
  ollama:
    driver: local

Umgang mit Models:

# Modell installieren
docker exec -it ollama ollama pull llava:v1.6
# Modell entfernen
docker exec -it ollama ollama rm llava:v1.6
# Modell aus dem Speicher entladen
docker exec -it ollama ollama stop llava:v1.6
# Modell auflisten
docker exec -it ollama ollama list

Multimodal-Model (die sich u.a. für die Bildanalyse eignen)

  • llava:v1.6; llava:13b : LLaVA is a novel end-to-end trained large multimodal model that combines a vision encoder and Vicuna for general-purpose visual and language understanding.
  • DeepSeek-Janus-Pro-7B

Modelle für Übersetzungen: