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.