# Linux - ZFS

# Rollback

## 1 | Snapshots anzeigen

Ein *Snapshot* ist eine schreibgeschützte Momentaufnahme Ihres Dateisystems.   
Liste aller vorhandenen Snapshots anzeigen:

```bash
zfs list -t snapshot
```

Beispielausgabe (mit ausgedachten Namen &amp; Größen):

```bash
NAME                                 USED  AVAIL  REFER  MOUNTPOINT
poolalpha/data@2025-07-14_06-04-31   248M      -   1.3T  -
poolalpha/data@2025-07-16_00-39-41   253M      -   1.4T  -
tank/media@2025-07-02_23-13-47        25G      -    13T  -
tank/media@2025-07-16_00-39-40        1T      -    19T  -
```

---

## 2 | Rollback (zu einem Snapshot zurückkehren)

1. Kopieren Sie den vollständigen Snapshot-Namen aus der Liste (`pool/dataset@datum_uhrzeit`).
2. Führen Sie den Rollback-Befehl aus:  
    ```bash
    zfs rollback poolalpha/data@2025-07-14_06-04-31
    ```
3. **Tipp für Fortgeschrittene:**  
    Mit `-r` (*recursive*) werden automatisch alle neueren Snapshots entfernt, bevor der Rollback ausgeführt wird.  
    ```bash
    zfs rollback -r poolalpha/data@2025-07-14_06-04-31
    ```

---

## 3 | Snapshot manuell erstellen (heutiges Datum)

Einfach im Terminal einen Einzeiler eingeben:

```bash
# Zeitstempel-Variable im Format YYYY-MM-DD_HH-MM-SS
TS=$(date +"%Y-%m-%d_%H-%M-%S")

# Snapshot für ein einzelnes Dataset
zfs snapshot poolalpha/data@$TS

# Rekursiv für einen gesamten Dataset-Baum
zfs snapshot -r tank@$TS

```

- 💾 Snapshots belegen nur den Platz für geänderte Datenblöcke.

---

## 4 | Häufige Fragen &amp; praktische Tipps

<details id="bkmrk-was-passiert-beim-ro"><summary>Was passiert beim Rollback mit meinen neueren Daten ?</summary>

Alle Blöcke, die *nach* dem gewählten Snapshot erzeugt wurden, gehen verloren. Sichern Sie daher wichtige Dateien zuerst oder testen den Snapshot mit einem **Clone**:

```bash
zfs clone poolalpha/data@2025-07-14_06-04-31 poolalpha/data-test
```

</details><details id="bkmrk-kann-ich-einen-snaps"><summary>Kann ich einen Snapshot gegen Löschen schützen ?</summary>

Ja – mit einem sogenannten *Hold*:

```bash
zfs hold keep poolalpha/data@2025-07-14_06-04-31
# Aufheben:
zfs release keep poolalpha/data@2025-07-14_06-04-31
```

</details><details id="bkmrk-wie-schiebe-ich-eine"><summary>Wie schiebe ich einen Snapshot auf einen Backup-Server ?</summary>

```bash
zfs send -vP poolalpha/data@$TS | \
ssh backuphost zfs recv -uF backuppool/data
```

</details>

# ZFS modules cannot be auto-loaded

# ZFS-DKMS – Schritt-für-Schritt-Anleitung für Debian 13 (Trixie)

Diese Anleitung fasst die notwendigen Schritte zusammen, um OpenZFS als DKMS-Modul auf Debian 13 zu installieren, nach Kernel-Updates neu zu bauen und typische Fehler zu beheben. Besonders wichtig ist der Fall, dass ZFS zwar erfolgreich für einen neuen Kernel gebaut wurde, das System aber noch mit einem alten Kernel läuft.

---

## 0 Wichtig: Laufender Kernel und DKMS-Modul müssen zusammenpassen

DKMS baut Kernelmodule immer für bestimmte Kernelversionen. `modprobe` lädt Module aber nur für den aktuell laufenden Kernel. Der aktuell laufende Kernel wird so angezeigt:

```bash
uname -r
```

Der DKMS-Status wird so angezeigt:

```bash
dkms status
```

<div class="note" id="bkmrk-wichtigster-hinweis">**Wichtig:** Wenn `uname -r` einen anderen Kernel zeigt als `dkms status`, dann ist ZFS nicht für den aktuell laufenden Kernel installiert. In diesem Fall hilft oft kein weiterer Build, sondern ein Neustart in den Kernel, für den DKMS das Modul bereits gebaut hat.</div>Beispiel:

```bash
uname -r
```

```text
6.12.74+deb13+1-amd64
```

```bash
dkms status
```

```text
zfs/2.3.2, 6.12.90+deb13.1-amd64, x86_64: installed
```

In diesem Beispiel läuft das System noch mit Kernel `6.12.74+deb13+1-amd64`, ZFS wurde aber für `6.12.90+deb13.1-amd64` gebaut. `modprobe zfs` muss dann fehlschlagen, weil es im falschen Modulverzeichnis sucht.

---

## 1 Voraussetzungen

- Root-Zugriff, entweder direkt als `root` oder über eine Root-Shell.
- Netzwerkzugang zu den Debian-Repositories.
- Aktiviertes `contrib`-Repository, da ZFS in Debian dort liegt.
- Optional bei Secure Boot: MOK-Schlüssel müssen importiert und bestätigt werden.

---

## 2 Repositories einrichten

ZFS liegt in Debian in `contrib`. Stelle daher sicher, dass `contrib` aktiv ist. Optional können `non-free` und `non-free-firmware` ergänzt werden, wenn das System entsprechende Firmware benötigt.

Beispiel für `/etc/apt/sources.list` oder eine passende Datei unter `/etc/apt/sources.list.d/`:

```bash
deb http://deb.debian.org/debian trixie main contrib non-free non-free-firmware
deb http://security.debian.org/debian-security trixie-security main contrib non-free non-free-firmware
deb http://deb.debian.org/debian trixie-updates main contrib non-free non-free-firmware
```

Optional für Backports:

```bash
deb http://deb.debian.org/debian trixie-backports main contrib non-free non-free-firmware
```

Danach die Paketlisten aktualisieren:

```bash
apt update
```

---

## 3 Benötigte Pakete installieren

Empfohlen ist die Installation der Kernel- und Header-Metapakete. Dadurch werden Kernel und Header gemeinsam aktuell gehalten, statt dass man irgendwann mit einem Kernel ohne passende Header herumsteht. Das ist ungefähr so sinnvoll wie ein Fahrrad ohne Vorderrad, nur mit mehr Fehlermeldungen.

```bash
apt install linux-image-amd64 linux-headers-amd64
```

Danach ZFS und die Build-Werkzeuge installieren:

```bash
apt install build-essential dkms zfs-dkms zfsutils-linux
```

Falls DKMS wegen `pahole` oder BTF-Erzeugung fehlschlägt:

```bash
apt install dwarves
```

<div class="note" id="bkmrk-custom-kernel-hinweis">**Hinweis:** Wenn kein Debian-Standardkernel verwendet wird, müssen die passenden Header oder Build-Verzeichnisse vorhanden sein: `/lib/modules/$(uname -r)/build` und `/lib/modules/$(uname -r)/source`.</div>---

## 4 Nach Kernel- oder Header-Update neu starten

Wenn ein neuer Kernel installiert wurde, läuft das System nicht automatisch mit diesem Kernel. Der neue Kernel wird erst nach einem Neustart verwendet.

Vor dem Neustart kann man prüfen, welche Kernelmodul-Verzeichnisse vorhanden sind:

```bash
ls /lib/modules
```

Außerdem den DKMS-Status prüfen:

```bash
dkms status
```

Wenn ZFS für einen neuen Kernel gebaut wurde, aber `uname -r` noch den alten Kernel zeigt:

```bash
reboot
```

Nach dem Neustart erneut prüfen:

```bash
uname -r
dkms status
```

Der laufende Kernel aus `uname -r` sollte jetzt zu einem ZFS-Eintrag aus `dkms status` passen.

---

## 5 ZFS-Modul laden und prüfen

Wenn der laufende Kernel und der DKMS-Eintrag zusammenpassen, kann das ZFS-Modul geladen werden:

```bash
modprobe zfs
```

Danach prüfen:

```bash
lsmod | sed -n '/^zfs/p'
zpool status -v
```

<div class="note" id="bkmrk-zpool-status-hinweis">**Hinweis:** Wenn noch kein ZFS-Pool existiert, kann `zpool status` melden, dass keine Pools vorhanden sind. Das ist dann kein Fehler des Kernelmoduls.</div>---

## 6 ZFS gezielt für den laufenden Kernel bauen

Diesen Schritt nur verwenden, wenn `dkms status` keinen installierten ZFS-Eintrag für den aktuell laufenden Kernel zeigt.

ZFS-Version aus dem installierten Paket ermitteln:

```bash
ZFS_VER="$(dpkg-query -W -f='${Version}\n' zfs-dkms | sed 's/-.*//')"
echo "$ZFS_VER"
```

ZFS für den aktuell laufenden Kernel bauen und installieren:

```bash
dkms install -m zfs -v "$ZFS_VER" -k "$(uname -r)"
```

Danach laden:

```bash
modprobe zfs
```

Wenn der Build fehlschlägt, das DKMS-Log ansehen:

```bash
less /var/lib/dkms/zfs/"$ZFS_VER"/build/make.log
```

---

## 7 Häufiger Fehler: Header für den aktuell laufenden Kernel fehlen

Typisches Fehlerbild:

```bash
apt install linux-headers-$(uname -r)
```

```text
Fehler: Paket linux-headers-6.12.74+deb13+1-amd64 kann nicht gefunden werden.
Fehler: Mittels des Musters »linux-headers-6.12.74+deb13+1-amd64« konnte kein Paket gefunden werden.
```

Das bedeutet meistens: Der aktuell laufende Kernel ist nicht mehr der Kernel, für den die Repositories aktuell Header anbieten. Statt ewig nach alten Headern zu suchen, sollte man die Kernel- und Header-Metapakete installieren:

```bash
apt install linux-image-amd64 linux-headers-amd64
```

Wenn DKMS dabei ZFS erfolgreich für den neuen Kernel baut, danach neu starten:

```bash
reboot
```

Nach dem Neustart:

```bash
uname -r
dkms status
modprobe zfs
```

---

## 8 Backports nur bei Bedarf verwenden

Backports sind sinnvoll, wenn ein neuerer Kernel verwendet wird oder wenn die ZFS-Version aus Stable zu alt für den verwendeten Kernel ist.

ZFS aus Backports installieren:

```bash
apt install -t trixie-backports zfs-dkms zfsutils-linux
```

Wenn auch der Kernel aus Backports verwendet werden soll:

```bash
apt install -t trixie-backports linux-image-amd64 linux-headers-amd64
```

Danach neu starten:

```bash
reboot
```

Nach dem Neustart prüfen:

```bash
uname -r
dkms status
modprobe zfs
zpool status -v
```

<div class="note" id="bkmrk-backports-warnung">**Hinweis:** Nicht Stable-Kernel, Backports-Header und Stable-ZFS wild mischen, außer der Grund ist klar. APT ist kein Smoothie-Mixer.</div>---

## 9 Secure Boot prüfen

Wenn Secure Boot aktiv ist, können nicht korrekt signierte oder nicht akzeptierte Module blockiert werden.

Typische Fehlermeldungen:

```text
modprobe: ERROR: could not insert 'zfs': Key was rejected by service

Required key not available
```

Secure-Boot-Status prüfen:

```bash
mokutil --sb-state
```

Wenn Secure Boot aktiv ist, gibt es zwei saubere Möglichkeiten:

- Secure Boot im UEFI deaktivieren.
- Den DKMS/MOK-Schlüssel importieren und beim nächsten Boot bestätigen.

Beim DKMS-Build sieht man häufig Hinweise wie:

```text
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub
```

Dann kann der öffentliche Schlüssel importiert werden:

```bash
mokutil --import /var/lib/dkms/mok.pub
```

Danach neu starten und im MOK-Menü bestätigen.

---

## 10 Alte Kernel nicht vorschnell entfernen

Alte Kernel sollten erst entfernt werden, wenn ZFS mit dem neuen Kernel erfolgreich geladen wurde.

```bash
uname -r
dkms status
modprobe zfs
zpool status -v
```

Wenn alles funktioniert, können alte nicht mehr benötigte Pakete später bereinigt werden:

```bash
apt autoremove
```

---

## 11 Problemlösung und häufige Stolperfallen

<table id="bkmrk-troubleshooting-table"><thead><tr><th>Symptom</th><th>Wahrscheinliche Ursache</th><th>Lösung</th></tr></thead><tbody><tr><td>`modprobe: FATAL: Module zfs not found in directory /lib/modules/<kernel>`</td><td>ZFS wurde nicht für den aktuell laufenden Kernel gebaut.</td><td>`uname -r` und `dkms status` vergleichen.</td></tr><tr><td>`linux-headers-$(uname -r)` kann nicht gefunden werden.</td><td>Der laufende Kernel ist älter oder stammt nicht mehr aus den aktuell verfügbaren Repositories.</td><td>`linux-image-amd64` und `linux-headers-amd64` installieren, danach neu starten.</td></tr><tr><td>DKMS zeigt ZFS für einen neueren Kernel als `uname -r`.</td><td>Der neue Kernel wurde installiert, aber noch nicht gebootet.</td><td>System neu starten und danach erneut prüfen.</td></tr><tr><td>DKMS-Build schlägt wegen `pahole` fehl.</td><td>Das Paket `dwarves` fehlt.</td><td>`apt install dwarves`</td></tr><tr><td>Modul wird wegen Schlüssel abgelehnt.</td><td>Secure Boot blockiert das Modul.</td><td>Secure Boot deaktivieren oder MOK-Schlüssel enrollen.</td></tr><tr><td>Build bricht mit Kernel-API-Fehlern ab.</td><td>Die installierte ZFS-Version passt nicht zum verwendeten Kernel.</td><td>ZFS aus `trixie-backports` nutzen oder auf den Debian-Stable-Kernel wechseln.</td></tr></tbody></table>

---

## 12 Schnellreferenz

### Standardfall Debian 13 Stable

```bash
apt update
apt install linux-image-amd64 linux-headers-amd64
apt install build-essential dkms zfs-dkms zfsutils-linux
reboot
```

Nach dem Neustart:

```bash
uname -r
dkms status
modprobe zfs
zpool status -v
```

### Wenn ZFS für den laufenden Kernel fehlt

```bash
ZFS_VER="$(dpkg-query -W -f='${Version}\n' zfs-dkms | sed 's/-.*//')"
dkms install -m zfs -v "$ZFS_VER" -k "$(uname -r)"
modprobe zfs
```

### Wenn ein neuerer Backports-Kernel genutzt wird

```bash
apt install -t trixie-backports linux-image-amd64 linux-headers-amd64
apt install -t trixie-backports zfs-dkms zfsutils-linux
reboot
```

Danach:

```bash
uname -r
dkms status
modprobe zfs
zpool status -v
```

---

## 13 Praxisbeispiel: ZFS wurde gebaut, aber der alte Kernel läuft noch

Ausgangslage:

```bash
uname -r
```

```text
6.12.74+deb13+1-amd64
```

Die Header für diesen Kernel sind nicht installierbar:

```bash
apt install linux-headers-6.12.74+deb13+1-amd64
```

```text
Fehler: Paket linux-headers-6.12.74+deb13+1-amd64 kann nicht gefunden werden.
Fehler: Mittels des Musters »linux-headers-6.12.74+deb13+1-amd64« konnte kein Paket gefunden werden.
```

Danach werden die Metapakete installiert:

```bash
apt install linux-image-amd64 linux-headers-amd64
```

DKMS baut ZFS erfolgreich für den neuen Kernel:

```text
Autoinstall of module zfs/2.3.2 for kernel 6.12.90+deb13.1-amd64 (x86_64)
Building module(s)................................................. done.
Installing /lib/modules/6.12.90+deb13.1-amd64/updates/dkms/zfs.ko.xz
Autoinstall on 6.12.90+deb13.1-amd64 succeeded for module(s) zfs.
```

Trotzdem schlägt `modprobe zfs` fehl:

```text
modprobe: FATAL: Module zfs not found in directory /lib/modules/6.12.74+deb13+1-amd64
```

Der Grund ist simpel: Das System läuft noch mit `6.12.74+deb13+1-amd64`. ZFS wurde aber für `6.12.90+deb13.1-amd64` gebaut. Der Build ist also erfolgreich, aber der falsche Kernel ist aktiv.

Korrekte Lösung:

```bash
reboot
```

Nach dem Neustart:

```bash
uname -r
dkms status
modprobe zfs
```

Wenn `uname -r` jetzt `6.12.90+deb13.1-amd64` oder einen anderen Kernel mit passendem ZFS-DKMS-Eintrag zeigt, sollte `modprobe zfs` funktionieren.

<div class="note" id="bkmrk-bootloader-hinweis">**Hinweis:** Wenn nach dem Neustart weiterhin der alte Kernel läuft, muss die Bootloader-Auswahl geprüft werden. Dann ist nicht ZFS das Problem, sondern das System bootet schlicht nicht den Kernel, für den das Modul gebaut wurde.</div>---

<footer id="bkmrk-stand">Stand: Juni 2026

</footer>