# 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

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

### Laufwerke identifizieren

```bash
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**

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

Status prüfen:

```bash
cat /proc/mdstat
```

Konfiguration dauerhaft speichern:

```bash
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**

```bash
make-bcache -C /dev/sda
```

### 2) RAID als Backing-Device initialisieren

> ⚠️ **Alle Daten auf dem RAID werden gelöscht**

```bash
make-bcache -B /dev/md0
```

Prüfen, ob das bcache-Device existiert:

```bash
lsblk
ls /sys/block | grep bcache
```

Erwartet: `bcache0`

---

## D) bcache auf Writeback schalten & tunen

### Writeback aktivieren

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

Prüfen:

```bash
cat /sys/block/bcache0/bcache/cache_mode
```

### Für sequentielle Backups optimieren

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

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

Status:

```bash
cat /sys/block/bcache0/bcache/state
```

---

## E) Btrfs auf bcache erstellen

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

Prüfen:

```bash
df -h /mnt/storage
```

---

## F) Dauerhaftes Mounten (fstab)

UUID ermitteln:

```bash
blkid /dev/bcache0
```

`/etc/fstab`:

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

Test:

```bash
umount /mnt/storage
mount -a
```

---

## G) (Optional) I/O-Feinschliff

```bash
# 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

```bash
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:

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

---

## J) Nutzung in LXC (Mountpoints)

Beispiel:

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

---

## K) Funktionstest (Read/Write)

### Vorbereitung

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

### Write-Test (10 GiB)

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

### Read-Test

```bash
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

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

Wichtige Werte:
- `cache_hits`, `cache_misses`
- `dirty_data` (noch nicht geflusht)

### I/O Live

```bash
iostat -x 1
```

### SMART

```bash
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`:**
  ```bash
  modprobe bcache
  ```
- **Cache nicht auf Writeback:**
  ```bash
  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.
