Ollama unter Ubuntu 24.04 installieren

Ollama, ein Werkzeug um Large Language Models lokal auszuführen, kann auch auf einem Server z. B. unter Ubuntu 24.04 genutzt werden. Zur Installation wird das Installationsskript auf dem Server ausgeführt:

curl -fsSL https://ollama.com/install.sh | sh

Dieses Skript legt einen Nutzer ollama auf dem System an und installiert Ollama:

curl -fsSL https://ollama.com/install.sh | sh
>>> Installing ollama to /usr/local
>>> Downloading ollama-linux-amd64.tar.zst
######################################################################## 100.0%
>>> Creating ollama user...
>>> Adding ollama user to render group...
>>> Adding ollama user to video group...
>>> Adding current user to ollama group...
>>> Creating ollama systemd service...
>>> Enabling and starting ollama service...
Created symlink /etc/systemd/system/default.target.wants/ollama.service → /etc/systemd/system/ollama.service.
>>> The Ollama API is now available at 127.0.0.1:11434.
>>> Install complete. Run "ollama" from the command line.

Anschließend kann Ollama über das Kommando ollama gesteuert werden. Ein erstes Modell könnte mittels:

ollama run gpt-oss

heruntergeladen und ausgeführt werden. Soll das Modell wieder gestoppt werden, so kann der Befehl:

ollama stop gpt-oss

genutzt werden. Soll ein Modell nur heruntergeladen werden, kann hierfür das Subkommando pull genutzt werden:

ollama pull gpt-oss

Die Daten von Ollama werden im Ordner /usr/share/ollama/ gespeichert. Dort finden sich auch die Modelle im Unterordner .ollama/models. Wer die aktuell laufenden Modelle sehen möchte, kann dies mit dem Befehl:

ollama ps

bewerkstelligen. Das Kommando:

ollama list

hingegen listet alle installierten Modelle auf. Ollama selbst stellt unter 127.0.0.1:11434 eine API bereit, die bei einem sinnvoll konfigurierten Server allerdings nicht von außen erreichbar sein sollte.

Wer diese API von außen erreichbar machen möchte, kann Nginx als Reverse Proxy nutzen. Dazu muss die Datei /etc/systemd/system/ollama.service angepasst und dort kann das Interface auf welchen gehört werden soll, sowie die erlaubten Origins konfiguriert werden:

Environment="OLLAMA_HOST=0.0.0.0"
Environment="OLLAMA_ORIGINS=*"

Danach muss die SystemdUnit neu gestartet werden:

systemctl daemon-reexec
systemctl daemon-reload
systemctl restart ollama

Anschließend kann die eigentliche Nginx-Konfiguration erstellt werden:

map $http_authorization $allow_ollama {
  default 0;
  "Bearer secret123" 1;
  "Bearer secret345" 1;
}

server {

  server_name api.example.org;

  ...

  # Ollama
  location ^~ /ollama/ {

    # Auth
    if ($allow_ollama = 0) { return 401; }

    # Proxy pass
    proxy_pass http://localhost:11434/;
    proxy_http_version 1.1;

    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_connect_timeout 60s;  # Upstream TCP connect timeout
    proxy_send_timeout    60s;  # Upstream request send timeout
    proxy_read_timeout    300s; # Upstream response read timeout
    send_timeout          60s;  # Client response send timeout

    # Do not forward the token to the backend
    proxy_set_header Authorization "";
  }
}

In dieser wird eine Map mit Bearern definiert, die der Authentifizierung dienen und die API wird über eine ReverseProxy-Konfiguration nach außen gegeben. Ein Beispiel-Aufruf könnte dann wie folgt aussehen:

curl https://api.example.org/ollama/api/chat \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer secret123" \
  -d '{
    "model": "gpt-oss",
    "messages": [
      { "role": "user", "content": "Schreibe einen Haiku über den Frühling." }
    ],
    "stream": false
  }'

Und schon läutet das Ergebnis den Frühling ein:

Frühling ruft leise,
Bäume wachen, Sonne lacht,
Träume fliegen hoch.

Datenträger im Terminal unter macOS formatieren

Ab und an, bietet es sich an einen Boot-Stick, z.B. für die Linux-Distribution seiner Wahl zu erstellen. Problematisch wird es, wenn versucht wird diesen über das Festplattendienstprogramm unter macOS wieder zu formatieren. Dann kann es durchaus zu Fällen kommen, in denen dies nicht mehr möglich ist. Hier bietet es sich dann an den Datenträger im Terminal zu formatieren. Im ersten Schritt muss dazu ermittelt werden, wie der konkrete Datenträger angesprochen werden muss:

diskutil list

Im Normalfall wird ein Gerät mit den Attributen external und physical gesucht:

/dev/disk14 (external, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *62.9 GB    disk14
   1:       Microsoft Basic Data                         6.3 GB     disk14s1
   2:                        EFI ESP                     5.2 MB     disk14s2
   3:       Microsoft Basic Data                         307.2 KB   disk14s3
   4:           Linux Filesystem                         56.6 GB    disk14s4

Wurde das Gerät gefunden, kann der Datenträger ausgehängt werden:

diskutil unmountDisk /dev/disk14

Anschließend kann die eigentliche Formatierung gestartet werden:

diskutil eraseDisk ExFAT USB GPT /dev/disk14

Mit ExFAT wird in diesem Fall das Dateisystem, mit USB der Name und mit GPT das Partitionsschema definiert. Nach einer kurzen Wartezeit sollte die Formatierung dann abgeschlossen sein:

Started erase on disk14
Unmounting disk
Creating the partition map
Waiting for partitions to activate
Formatting disk14s2 as ExFAT with name USB
Volume name      : USB
Partition offset : 411648 sectors (210763776 bytes)
Volume size      : 122466304 sectors (62702747648 bytes)
Bytes per sector : 512
Bytes per cluster: 131072
FAT offset       : 2048 sectors (1048576 bytes)
# FAT sectors    : 4096
Number of FATs   : 1
Cluster offset   : 6144 sectors (3145728 bytes)
# Clusters       : 478360
Volume Serial #  : 697b38bb
Bitmap start     : 2
Bitmap file size : 59795
Upcase start     : 3
Upcase file size : 5836
Root start       : 4
Mounting disk
Finished erase on disk14

Maus-Probleme in Minecraft unter Ubuntu

In einer Minecraft-Installation unter Ubuntu kann es zu Problemen kommen, das die Mausevents innerhalb des Spieles nicht korrekt verarbeitet werden. Dies kann unter anderem zu dem Effekt führen, dass Mausklicks, wie z.B. der Klick mit der rechten Maustaste nicht richtig erkannt werden und die Maustaste dann als dauerhaft gedrückt angenommen wird. Bei dieser Art von Problemen wird dann oft von Problemen mit Wayland ausgegangen oder mit der Einstellung Raw Input in den Mouse Settings von Minecraft versucht das Problem zu lösen.

Mit fehlerhaften Mausevents vergeht in Minecraft schnell der Spielspaß

Im vorliegenden Fall lag es aber an der Minecraft-Installation selbst, welche als Snap-Paket installiert war. Durch das Sandboxing kam es zu den Problemen bei der Erkennung der Mausklicks. Hier half es am Ende die Snap-Version zu deinstallieren und das Debian-Paket des Minecraft-Launchers zu installieren. Anschließend funktionierten die Mausklicks wie gewohnt.

Aktualisierungsskript für Ubuntu-Rechner

Für Ubuntu-Rechner habe ich es mir seit vielen Jahren angewöhnt ein Skript upgrade.sh zu erzeugen, welches installierte Pakete auf den aktuellen Stand bringt:

#!/bin/sh
apt autoremove -y && apt autoclean -y && apt update && apt full-upgrade -y && apt autoremove -y && apt autoclean -y
snap refresh

Bei apt wird autoremove und autoclean vor und nach dem Upgrade aufgerufen, um bei Systemen mit wenig Speicherplatz für möglichst viel freien Platz zu sorgen. Technisch unspektakulär, aber eine zuverlässige kleine Routine, die die Systempflege deutlich erleichtert.

ELV Fibonacci-Uhr unter Linux ansprechen

Bei der ELV Fibonacci-Uhr handelt es sich um einen Bausatz für eine Fibonacci-Uhr. Diese kann über serielle Terminal-Befehle gesteuert werden. Auf der offiziellen Webseite werden allerdings nur Möglichkeiten angeboten das Ganze über Windows zu bewerkstelligen.

Die ELV Fibonacci-Uhr

Damit es unter Linux funktioniert, müssen ein paar kleinere Hürden genommen werden. In dem Gerät steckt ein CP210x-Chip für die serielle Kommunikation. Allerdings wird dieser auf Anhieb unter Linux nicht erkannt. Ein Aufruf von:

dmesg | tail -n 20

zeigt folgendes:

[   99.803450] usb 1-1: new full-speed USB device number 7 using xhci_hcd
[   99.928828] usb 1-1: New USB device found, idVendor=18ef, idProduct=e037, bcdDevice= 1.00
[   99.928865] usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[   99.928883] usb 1-1: Product: Fibonacci-Clock FC1
[   99.928898] usb 1-1: Manufacturer: ELV
[   99.928911] usb 1-1: SerialNumber: 162b12d76ceeec11bd1331f90f611c40

Allerdings taucht kein Gerät unter /dev/tty* auf. lsusb zeigt ebenfalls, dass ein USB-Gerät entdeckt wurde:

Bus 001 Device 007: ID 18ef:e037 ELV Elektronik AG Fibonacci-Clock FC1

Damit das Gerät nun über das serielle Interface angesprochen werden kann, wird im ersten Schritt der Treiber in den Kernel geladen:

modprobe cp210x

Danach wird temporär ein neues Gerät erstellt:

echo 18ef e037 | sudo tee /sys/bus/usb-serial/drivers/cp210x/new_id

Nun kann sich über Screen (alternativ kann auch Picocom genutzt werden) mit dem Gerät verbunden werden:

screen /dev/ttyUSB0 115200

Zum Test kann dort das Kommando v abgesetzt werden. Kommandos wie das Zeitkommando (T12:01:01) sollten am besten am Stück eingefügt werden, da sie sonst automatisch als t-Kommando erkannt werden, welches die Zeit nur anzeigt.