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. Nun müssen wir die Cache-Paltte den langsamen HDDs zur Verfügung stellen.
Lass dir die UUID der Cache-Platte ausgeben:

# bcache-super-show /dev/sda2 | grep cset

Nun “aktiviere” die SSD als Cache:

# echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache0/bcache/attach
# echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache1/bcache/attach

Falls du mehr als zwei Festplatten bestitzt, wiederhole dies eben X-fach.

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 😉


Weitere Informationen zu bcache und dessen Anpassungsmöglichkeiten, findest du HIER.

17 Kommentare

  1. Hallo,

    ich habe deinen Anleitung gelesen.
    Nur leider hab ich nicht ganz verstanden ob die man bereits vorab alle verwendeten Platten mit Btrfs filesystem verstehen haben muss.

    In meinem Fall will ich, auch wenn es nicht stable ist, ein RAID5 aufbauen und durch eine einzelne SSD als Cache verwenden.

    Kannst du mich das ein wenig aufschlauen?

    Danke und Gruß Robert

    • Hi Robert,
      ich empfehle die Festplatten davor 1x sauber mit einem einfachen Dateisystem zu formatieren.
      Wenn du nach der Anleitung gehst, werden in Schritt 3 die Festplatten mit BTRFS formatiert.
      Das erste “einfache” Formatieren, hat bei mir einen Fehler behoben, weil BTRFS den Superblock irgendwie nicht korrekt finden und setzen konnte. Kann also eventuell etwas Frust ersparen.
      Statt ... -m raid1 -f sollte bei dir ein … -m raid5 -f das Ganze erledigen.
      Im Internet steht aber des öfteren, das mit RAID5 das Ganze noch sehr experimentell ist. Wenn du es testen möchtest, nur zu. Bin auf Feedback gespannt! 🙂
      => Mein OpenMediaVault mit 2 Cache-SSDs und RAID1 läuft bisher ohne Probleme (inkl. dem Tool dduper).

  2. Also erst mal läuft das raid. Wir werden sehen wie lange.
    Mir ist aber ein Fehler in deinem tut aufgefallen.
    Ich hab vom Hand den Cache an den die raid Platten koppeln müssen.
    Das kann man wohl umgehen, wenn man das -C und -B zusammen aufruft. Zumindest war da bei mir der Fall.

    Gruß Robert

  3. Hi, danke für die Anleitung!!
    Ich musste aktuell kein Repo hinzufügen. bcache-tools war über die normale Repo erhältlich.

  4. Hallo Hoerli,

    ich wollte das ganze mal neu Aufbauen.
    Hast du dich schon mal damit beschäftigt, wie man das bcache komplett los wird?

    Danke und Grüße Robert

    • Es sollte reichen, die Platten auszuhängen und die Zuweisung (Bei “Nun “aktiviere” die SSD als Cache:”) wieder zu entfernen.
      Dann sollte bcache nicht mehr genutzt werden können und du kannst von vorne beginnen.
      Es ist ja nur eine Cache-Platte, kein permanennter Speicher.
      Ganz unten beim Artikel gibts ein Link, mit weiteren hilfreichen Befehlen, vielleicht wirds dann etwas klarer.

  5. Hab diese Anleitung unter OVM5 genutzt. Kann man das Upgrade auf OVM6 inplace ohne Anpassung an bcache oder BTRFS durchführen?

    • Hi Carlos,
      man kann ein Upgrade von Hand durchführen, aber es ist nicht empfehlenswert.
      Nach diversen Berichten im Forum, gibts danach des öfteren mehr Bugs als man gebrauchen kann.
      Aktuell wird zu einer Neuinstallation geraten.
      Falls du es dennoch versuchen willst, gibts hier die Infos: https://www.openmediavault.org/?p=3010

      bcache und brtfs sollte das in keinster weise betreffen.
      Ein Backup von allen Daten, solltest du aber am besten mal anlegen 🙂
      Mein Versuch (was schon eine Weile her ist), OMV5 zu OMV6 zu upgraden, hat in einem total kaputten Webinterface geendet.

  6. Hi, hab das Update gerade durchgeführt (nach Backup) und es lief reibungslos.
    Fairerweise muss ich aber auch sagen, dass die Changelogs bei den letzten OMV5 Updates voll sind mit Bugfixes für das Upgradetool.
    Das einzige, was ich gemacht habe, war „omv-release-upgrade“ in die CLI einzugeben und ein Mal neuzustarten, nachdem das Skript durch war. Alle Einstellungen wurden übernommen und ich kann aktuell keinen Fehler erkennen.

  7. Sehr schöner Bericht, vor allem weil ich auch nach Caching Optionen für OMV gesucht habe. Was mich allerdings in Schleudern bringt sind deine. Werte für Schreiben 400-500 MBit/sec das wären ja gerade mal ca. 62 MB/sec und das bei 10Gb Ethernet?

    • Hi Tuxoche,
      das habe ich versucht ebenfalls zu erklären.
      Bei meinem Testsystem war für eine sehr hohe Bandbreite die CPU zu schwach, da ich auch die best mögliche Komprimierung für BTRFS eingestellt hatte.
      Mit einer neueren CPU, welche deutlich mehr Leistung besitzt, sind die 3GBit/s problemlos möglich.
      Nimmt man die Komprimierung raus, geht da auch noch mehr.

  8. Danke fuer den Artikel!
    Ich bekomme beim Abschnitt

    Nun “aktiviere” die SSD als Cache:
    1 # echo f0e01318-f4fd-4fab-abbb-d76d870503ec > /sys/block/bcache0/bcache/attach
    die Fehlermeldung “-bash: echo: write error: No such file or directory”
    /sys/block/bcache0/bcache/attach existiert aber. Selbstverstaendlich habe ich meine UUID dort eingegeben.

    Ich benutze OMV 6.9.7-3 (Shaitan), ohne einen NVMe Cache bekomme ich nur ~80MB/s via NFS. Eine Idee was hier falsch laeuft?

    • Hi Thomas,
      spontan habe ich gerade keine Idee, was bei dir schief läuft.
      Hier müsste ich auch erst einmal den Server auf den Kopf stellen.
      Scheinbar ist aber was bei der Erstellung des Cache etwas schief gelaufen.
      Falls noch nichts produktives auf dem System läuft, versuch es einfach noch einmal von vorne. Kann ja nicht schaden 🙂

      • Ich habe den Prozess bereits einmal wiederholt, mit dem selben Ergebnis. Dabei hatte ich sogar OMV nochmal neu aufgesetzt.

        Ich werde mich heute aber nochmal besser in die Materie einlesen. Moeglicherweise liegt dies darin zugrunde, dass Dein Beitrag (nehme ich an) auf OMV 5 (Debian 10) beruht. So hat es bcache-tools z.B. ja in der aktuellen OMV Version 6 (Debian 11) mittlerweile auch schon in die Debian Repos geschafft.

        • Update: Ich habe das jetzt mit plain-old Debian 12 ohne OMV umgesetzt. Das funktionierte problemlos. OMV hat mich eher limitiert, zumindest fuer meinen Anwendungszweck.

Schreibe einen Kommentar

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.