#
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/sdbund/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:
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_missesdirty_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
- Keine Proxmox-Snapshots auf VMs, die aktiv auf diesem Storage schreiben.
- Nicht als einzige Datenkopie verwenden (RAID0 + Writeback).
- USV regelmäßig testen.
- Cache-Zustand überwachen (
dirty_data,state).
#
N) Troubleshooting
Kein
/dev/bcache0:modprobe bcacheCache nicht auf Writeback:
cat /sys/block/bcache0/bcache/cache_modeGeringe 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.