# Btrfs mit Write-Cache (bcache) auf Proxmox – A bis Z

Diese Anleitung beschreibt, wie man auf einem Proxmox-Host ein performantes Storage-Backend mit Btrfs und einem echten Write-Cache mittels bcache (Writeback) aufsetzt.
Das Storage wird anschließend als Directory-Storage in Proxmox eingebunden und von VMs (virtuelle Disks) sowie LXC (Mountpoints) genutzt.

Kurzfassung

  • HDDs → RAID (mdadm)
  • SSD → bcache Cache-Device (Writeback)
  • RAID → bcache Backing-Device
  • Dateisystem → Btrfs auf /dev/bcache0
  • Nutzung → Proxmox Directory-Storage

Ergebnis: SSD-Write-Performance auf HDDs bei geringem RAM-Bedarf.


# Zielarchitektur

Proxmox Host
 └── /dev/bcache0   (bcache: HDD-RAID + SSD Writeback)
       └── /mnt/storage (Btrfs)
             ├── VM-Disks (raw/qcow2)
             └── LXC-Mountpoints

# Voraussetzungen

  • Proxmox VE (Debian-basiert)
  • Mindestens:
    • 2× HDD (für RAID0 oder anderes mdadm-Layout)
    • 1× SSD (als Cache)
  • Optional: USV (empfohlen für Writeback)
  • Root-Zugriff auf den Host

Hinweis zur Sicherheit

  • RAID0 + Writeback = hohe Performance, aber keine Redundanz.
  • Nicht als einzige Kopie produktiver Daten verwenden.
  • Writeback ohne Power-Loss-Protection (PLP) auf der SSD ist mit Restrisiko verbunden.

# A) Vorbereitung

# Pakete installieren

apt update
apt install -y mdadm bcache-tools btrfs-progs

# Laufwerke identifizieren

lsblk -o NAME,SIZE,TYPE,MODEL

Merke dir:

  • HDDs: z. B. /dev/sdb und /dev/sdc
  • SSD: z. B. /dev/sda

# B) HDDs zu RAID bündeln (mdadm)

Beispiel: RAID0 aus zwei HDDs

mdadm --create /dev/md0 --level=0 --raid-devices=2 /dev/sdb /dev/sdc

Status prüfen:

cat /proc/mdstat

Konfiguration dauerhaft speichern:

mdadm --detail --scan >> /etc/mdadm/mdadm.conf
update-initramfs -u

# C) bcache einrichten

# 1) SSD als Cache-Device initialisieren

⚠️ Alle Daten auf der SSD werden gelöscht

make-bcache -C /dev/sda

# 2) RAID als Backing-Device initialisieren

⚠️ Alle Daten auf dem RAID werden gelöscht

make-bcache -B /dev/md0

Prüfen, ob das bcache-Device existiert:

lsblk
ls /sys/block | grep bcache

Erwartet: bcache0


# D) bcache auf Writeback schalten & tunen

# Writeback aktivieren

echo writeback > /sys/block/bcache0/bcache/cache_mode

Prüfen:

cat /sys/block/bcache0/bcache/cache_mode

# Für sequentielle Backups optimieren

# Auch sequentielle Zugriffe cachen
echo 0 > /sys/block/bcache0/bcache/sequential_cutoff

# Sofortiges Flushen erlauben
echo 0 > /sys/block/bcache0/bcache/writeback_delay

Status:

cat /sys/block/bcache0/bcache/state

# E) Btrfs auf bcache erstellen

mkfs.btrfs -f /dev/bcache0
mkdir -p /mnt/storage
mount /dev/bcache0 /mnt/storage

Prüfen:

df -h /mnt/storage

# F) Dauerhaftes Mounten (fstab)

UUID ermitteln:

blkid /dev/bcache0

/etc/fstab:

fstab
UUID=XXXX-XXXX  /mnt/storage  btrfs  noatime,compress=zstd,space_cache=v2,ssd_spread  0  0

Test:

umount /mnt/storage
mount -a

# G) (Optional) I/O-Feinschliff

# IO-Scheduler
echo none > /sys/block/bcache0/queue/scheduler

# Readahead erhöhen
blockdev --setra 4096 /dev/bcache0

# H) Storage in Proxmox einbinden (Directory)

# Web-UI

Datacenter → Storage → Add → Directory

  • ID: z. B. btrfs-cache
  • Directory: /mnt/storage
  • Content: Disk image, Container
  • Shared: deaktiviert

# CLI

pvesm add dir btrfs-cache --path /mnt/storage --content images,rootdir
pvesm status

# I) Nutzung in VMs

Empfehlung für I/O-intensive Workloads:

  • Disk-Format: raw
  • Cache: none
  • Discard: on
  • IO-Thread: on

Beispiel:

qm set 100 -scsi1 btrfs-cache:200G,cache=none,discard=on,iothread=1

# J) Nutzung in LXC (Mountpoints)

Beispiel:

pct stop 101
pct set 101 -mp0 /mnt/storage/appdata,mp=/data
pct start 101

# K) Funktionstest (Read/Write)

# Vorbereitung

mkdir -p /mnt/storage/test
cd /mnt/storage/test
sync
echo 3 > /proc/sys/vm/drop_caches

# Write-Test (10 GiB)

dd if=/dev/zero of=write_test.img bs=1G count=10 oflag=direct status=progress
sync

# Read-Test

dd if=write_test.img of=/dev/null bs=1G iflag=direct status=progress

Erwartung:

  • Write: SSD-ähnliche Geschwindigkeit (Writeback)
  • Read (zweiter Lauf): deutlich schneller (Cache + RAM)

# L) Monitoring

# bcache-Status

cat /sys/block/bcache0/bcache/stats_total/*

Wichtige Werte:

  • cache_hits, cache_misses
  • dirty_data (noch nicht geflusht)

# I/O Live

iostat -x 1

# SMART

smartctl -a /dev/sda
smartctl -a /dev/sdb
smartctl -a /dev/sdc

# M) Best Practices

  1. Keine Proxmox-Snapshots auf VMs, die aktiv auf diesem Storage schreiben.
  2. Nicht als einzige Datenkopie verwenden (RAID0 + Writeback).
  3. USV regelmäßig testen.
  4. Cache-Zustand überwachen (dirty_data, state).

# N) Troubleshooting

  • Kein /dev/bcache0:

    modprobe bcache
  • Cache nicht auf Writeback:

    cat /sys/block/bcache0/bcache/cache_mode
  • Geringe Performance:

    • sequential_cutoff=0
    • VM-Disk: raw, cache=none
    • IO-Thread aktivieren

# O) Wiederherstellung (Kurzüberblick)

  • HDD-Ausfall (RAID0): Daten verloren → Restore aus anderer Kopie.
  • SSD-Ausfall: Cache weg, Datenstand = zuletzt geflusht.
  • Stromausfall: Mit USV i. d. R. sauber.

# Fazit

Mit bcache (Writeback) + Btrfs auf dem Proxmox-Host erhältst du:

  • Sehr hohe Write-Performance (SSD-Tempo)
  • Geringe RAM-Last
  • Einfache Integration in Proxmox
  • Ideal für Backup-, Objekt-Storage- und I/O-intensive Workloads

Für Umgebungen mit Bedarf an maximaler Datenintegrität oder Redundanz sollte ein redundantes Layout (z. B. RAID1/10) und ggf. Enterprise-SSDs mit PLP in Betracht gezogen werden.