bcache + btrfs für OpenMediaVault

Wer viele HDDs in seinem NAS nutzt, hat dort eventuell ein kleinen Flaschenhals.
Beschleunigen wir also unser NAS mit einem SSD-Cache, um die IO-Last und oft angeforderte Daten auf SSDs auszulagern, um die maximale Performance zu erhalten.
Dadurch greifen wir auch zuerst auf die SSDs zu und bcache lagert die Daten dann auf die HDDs aus. So können wir problemlos über 1Gbit/s an Bandbreite nutzen.
Haben wir langsame HDD-Festplatten verbaut, können wir unserem NAS mit einer SSD enorm auf die Sprünge helfen.

Wichtig: Ich habe HIER schon eine ausführliche Einrichtungsanleitung für BTRFS erstellt. Das Wissen dieser Anleitung, setze ich HIER nun voraus!

Hinweis: bcache ist noch immer in Entwicklung und sollte nicht in produktiven Umgebungen eingesetzt werden. Benutze das Tool also mit Bedacht!

Mein Tipp bevor wir starten: Sichere deine Daten irgendwohin weg, damit dein NAS leer ist. Es wird empfohlen, das ganze mit einem „frischen“ Setup umzusetzen. Bestehende Speicher sollten nicht mit einem Cache erweitert werden. Wir müssen die Platten eh frisch Formatieren.

Legen wir los!

0. Vorbereitung

1. Installiere OpenMediaVault und nehme das System in Betrieb. Eine ausführliche Anleitung dazu, gibt es HIER.
2. Formatiere ALLE vorhandenen Festplatten 1x mit z.B. ext4 und lösche diese dann wieder. Dies behebt einen Fehler, das unter Umständen deine Platten nicht korrekt von bcache erkannt werden.

1. Der Aufbau

Mein Aufbau sieht wie folgt aus:
— SSD1 = OpenMediaVault 5 → ext4-Formatierung → /dev/sda
— SSD2 = 128GB SATA SSD als Cache → btrfs-Formatierung → /dev/sdb
— HDDs = 2x 12TB SATA HDDs → btrfs-Formatierung mit Komprimierung → /dev/sdc + /dev/sdd

>> SSD2 (sdb) wird als Cache-Pool eingesetzt und lagert die Daten dann auf sdc und sdd aus. Beide HDDs werden im RAID1 laufen.

Alle Festplatten sind ganz normal per SATA mit dem System verbunden.
Ich verwende eine extra SSD als Cache, da sie gerade herum lag und nicht benötigt wird.
Man kann natürlich auch eine extra Cache-Partition auf der System-SSD anlegen und diese dann nutzen. Wollte ich aber nicht.

2. bcache installieren

brtfs ist bereits in Debian 10 enthalten, hier müssen wir nichts machen, aber bcache nicht.
Daher installieren wir uns bcache aus den Paketquellen.

# sudo add-apt-repository ppa:g2p/storage
# sudo apt-get update
# sudo apt-get install bcache-tools

3. bcache einrichten

1. Wir legen einen neuen Cache an. Hier wähle ich meine zweite SSD-Festplatte aus:

# make-bcache -C /dev/sdb

Wer lieber eine Partition der Systemplatte nutzen möchte, gibt diese an.
Als Beispiel:

# make-bcache -C /dev/sda2

2. Nun müssen wir bestimmen, welche Laufwerke durch den Cache profitieren sollen:

# make-bcache -B /dev/sdc /dev/sdd

Wenn du nur eine Festplatte hast, gebe nur die eine an. Wenn du noch mehr Festplatten hast, gebe einfach diese zusätzlich an. Die Angabe hier, hat erst einmal nichts mit RAID zu tun!
Es wird als Ausgabe eine Info erscheinen, das er nun die Festplatten eingelesen hat und die Superblöcke angelegt hat.
Zeitgleich wurden auch neue Festplatten-Dateien erstellt. Diese sind bei /dev/ mit der Bezeichnung bcache0, bcache1, …. zu finden.

3. Nun legen wir uns ein btrfs-RAID mit unseren HDD-Festplatten an. Ich wähle RAID1, um Datenverlust zu vermeiden.
Wir geben hier nun nicht die normalen Laufwerksbezeichnungen an, sondern arbeiten nun mit den bcache[N]-Laufwerken.
Gebe nun alle vorhandenen bcache-Partitionen hier an, welche aus deinem Pool stammen:

mkfs.btrfs -d raid1 /dev/bcache0 /dev/bcache1 -m raid1 -f

Tipp: Bei mehreren bcache-Platten wird es schnell unübersichtlich mit der Zuordnung. Nutze hierfür das Webinterface von OpenMediaVault, um besser zu erkennen, welche bcache-Festplatte zu welchem Pool gehört.

4. Mounte das bcache-RAID nun in OpenMediaVault!
Bei Dateisystemen sollte nun der Verbund auftauchen und gemountet werden können.
Die bcache-Laufwerke sollten bei „Laufwerke“ ebenfalls ersichtlich sein. Zur Not da 1x auf „Suchen“ drücken.
Nach dem Einhängen, sollte der maximale Speicher der HDDs angezeigt werden und der nutzbare Speicher. Die paar GB der SSD sollte nicht zu erkennen sein.

FERTIG!

Lege nun eine Freigabe auf dem Laufwerk an und berechtige einen Nutzer darauf. Du kannst nun dein Speicher mit SSD-Boost nutzen.


DOCH HALT!

Wie sieht es mit mehreren RAIDs und damit mit mehreren SSD-Festplatten aus?
Gut das du fragst! Das hat mich auch ein paar Nerven gekostet!
Kurze Antwort: Wir müssen die Cache-Pools per UUID einhängen, nicht mit dem Festplattennamen.

Die lange Antwort sieht so aus:
Lege einfach alle neuen RAIDs wie oben beschrieben an.
Lege einen neuen Cache-Pool an, füge erneut alle gewünschten HDDs dem neuen Cache-Pool hinzu und lass ihn einmal einhängen.
Das funktioniert soweit auch gut, bis du dein NAS einmal neu startest.
Ab dann gewinnt der stärkere … äääh schnellere Pool, weil die Dateinamen bcache[N] nicht fest sind, sondern komplett variabel vergeben werden.
Dadurch kann es passieren, das nur noch ein Cache-Pool online geht und deine restlichen Daten offline sind. Doof!

Wie lösen wir also das Problem?
Es ist (fast) einfach.
Gebe die BlockID aller aktuell vorhandenen Festplatten aus:

# blkid

Du erhälst eine Liste aller vorhandenen Festplatten inkl. der UUIDs.
Kopiere die UUIDs von jeweils einem Cache-Pool-Mitglied heraus.
Ein Beispiel:

/dev/bcache0: UUID="a0847124-5d28-4d99-9037-562b56263cf4" UUID_SUB="6cac4978-87dd-4f7c-b3fd-7fa3221c5821" TYPE="btrfs"
/dev/bcache1: UUID="fa47d8d2-f2e7-4335-ab8b-4ef34bbfde30" UUID_SUB="e6fe0cb6-470f-48a8-96f5-2d259ba3b172" TYPE="btrfs"
/dev/bcache2: UUID="fa47d8d2-f2e7-4335-ab8b-4ef34bbfde30" UUID_SUB="1093ea08-5d81-451a-b672-9e5a4ac9718c" TYPE="btrfs"
/dev/bcache3: UUID="a0847124-5d28-4d99-9037-562b56263cf4" UUID_SUB="70188d03-8751-4ae0-80e3-77bae03a2ae6" TYPE="btrfs"
/dev/bcache4: UUID="fa47d8d2-f2e7-4335-ab8b-4ef34bbfde30" UUID_SUB="5f94547d-c69b-4cdc-af9e-89e90560d18c" TYPE="btrfs"
/dev/bcache5: UUID="fa47d8d2-f2e7-4335-ab8b-4ef34bbfde30" UUID_SUB="cc92fa94-a2ff-4a95-8676-e16fb83c993b" TYPE="btrfs"
/dev/bcache6: UUID="fa47d8d2-f2e7-4335-ab8b-4ef34bbfde30" UUID_SUB="58da3111-99e1-46e5-83ed-42b52ec987a9" TYPE="btrfs"

Alle UUIDs mit „fa47d8d2-f2e7-4335-ab8b-4ef34bbfde30“ gehören zu Pool 1 und
alle UUIDs mit „a0847124-5d28-4d99-9037-562b56263cf4“ gehören zu Pool 2.
Daher kopiere ich diese zwei UUIDs heraus. Die UUID_SUB ist hier uninteresannt.
Es ist auch vollkommen egal von wechem bcacheX-Eintrag wir das ganze entnehmen, die sind ja alle gleich. Nur die UUID_SUB ist einzigartig.

Öffne nun die Mounting-Liste fstab:

nano /etc/fstab

Ersetze dort den Quellpfad /dev/bcacheX durch die UUID.
VOHER:

/dev/bcache2               /srv/dev-bcache2        btrfs   defaults,nofail,ssd      0 2

NACHHER:

UUID=fa47d8d2-f2e7-4335-ab8b-4ef34bbfde30               /srv/dev-bcache2        btrfs   defaults,nofail,ssd      0 2

Als nächstes passen wir noch die OpenMediaVault-Config an, damit die Mounting-Parameter nicht überschrieben werden.
Öffne dazu die Config:

nano /etc/openmediavault/config.xml

Suche dort nach „mntent“ und spring in die Zeile, mit den Mountinginformationen für den Cache.

Ersetze dort den Eintrag bei durch die UUID des Cache-Pools.
VORHER:

<fsname>/dev/bcache2</fsname>

NACHHER:

<fsname>fa47d8d2-f2e7-4335-ab8b-4ef34bbfde30</fsname>

Passe diesen Eintrag für alle vorhandenen Cache-Pools an und speichere die Datei dann ab.
Erstelle dann in OpenMediaVault z.B. eine neue Freigabe auf das RAID, damit OpenMediaVault seine Config zum einen neu einliest und zum anderen wieder sauber speichert. Wir haben ja diese gerade von Hand editiert.
(Einfach nur das alles sauber gespeichert und übernommen ist.)

SEHR WICHTIG: OpenMediaVault hat schon den Parameter „ssd“ in den Mountingbefehl gesetzt. Entferne diesen NICHT! Du hast zwar HDDs, die stehen aber nun unter der Verwaltung der SSD! Defragmentierungen schaden der SSD!

Tipp: Willst du die Komprimierung nutzen? Diese Parameter kannst du direkt zusätzlich mit angeben. Alle Infos dazu gibts HIER.

Starte nun das NAS noch einmal neu, damit die Festplatten inkl. SSD-Cache nun per UUID eingehängt werden.
Es sollte nun wie gewohnt funktionieren.


Etwas Feedback erwünscht?
Mit einem Intel Celeron J4005, 8GB RAM und einer 10GBit/s-Netzwerkkarte, komm ich auf folgende Werte:
Einfache BTRFS-Freigabe inkl. Komprimierungseinstellung von compress-force=zstd:15 → Lesen = 600-800Mbit/s – Schreiben = 300-400Mbit/s
Mit SSD-Cache → Lesen = 600-3000Mbit/s – Schreiben = 400-500Mbit/s.
=> Die sehr geringe Power der CPU, bremmst alles stark aus. Daher sind die Schreibraten nicht sonderlich gut, dafür die Leseraten, soweit die Daten im Cache liegen. Daher schwankt die Bandbreite ordentlich.
Bessere Hardware stand mir nicht zum testen zur Verfügung und ich sehe es aktuell nicht ein, da noch mehr Geld zu investieren. Für mich reicht es 😉

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

* Durch das Absenden dieses Kommentars werden deine angegebenen Daten auf dem Server gespeichert. Du stimmst dadurch den Datenschutzbedingungen zu.