Da mein alter Heimserver auf HP Microserver N40L Basis schon seit mehr als 10 Jahren zuverlässig seinen Dienst verrichtet, habe ich mir in letzter Zeit oft Gedanken über eine Ablösung gemacht.
Kriterien wie ausreichend ECC-Ram und eine zeitgemäße Rechenleistung standen dabei von vorneherein fest, da ich weiterhin bei FreeNAS bzw. mittlerweile "TrueNAS" bleiben möchte.
Ursprünglich habe ich eigentlich mit einem System auf Basis eines Intel i3 oder Xeon E3 geliebäugelt und hier die Preise beobachtet. Leider fangen brauchbare Mainboards mit genügend Festplattenanschlüssen preislich erst bei ca. 250-350€ an und einen passenden Prozessor benötigt man dann auch noch. Eine separate PCIe HBA (PCIe SATA Controller) wollte ich vermeiden da dies direkt ab Werkszustand schon einen erhöhten Strombedarf bedeutet und das Gerät eigentlich 24/7 laufen soll.
Durch Zufall bin ich darauf aufmerksam geworden dass ein deutscher Händler wiederaufbereitete Mainboards (Gigabyte MJ11-EC1) für knapp 70€ anbietet, welche wie perfekt auf meine Anforderungen passen. Ursprünglich kommen diese Mainboards wohl von Gigabyte G431-MM0 Server Systemen, welche eigentlich für GPU-Rechencluster eingesetzt werden. Durch die nativ vorhanden 8 SATA/SAS Ports eignet es sich allerdings auch super als Basis für eine NAS bzw. einen Heimserver.
Das besondere an diesem Gigabyte MJ11-EC1 Mainboard ist dass es von Haus aus folgendes bietet:
Alles in allem mit ~ 406€ (zzg. SSDs/HDDs) ein hervorragender Preis für einen Heimserver der folgende Erwartungen erfüllen soll:
Das Board kommt zunächst mit dem ATX24 Adapterstecker und dem Original Server Lüfter (nicht unbedingt Leise). Nach Sichtprüfung und provisorischen Anschluss an ein Netzteil, folgt erstmal der obligatorische Memtest über ein USB Stick.
Zu beachten ist dass die blauen Bänke immer zuerst bestückt werden müssen. Steht so auch in der Mainboard Anleitung.
Erfreulicherweise sind bei diesem Board die SATA Anschlüsse so durchnummeriert wie sie auch verbaut sind. Aus Richtung der RAM Bänke aus gesehen nummerisch aufsteigend.
Eine M.2 in voller 80mm Länge passt direkt aufs Board.
Leider passt die Belegung der Front Panel Anschlüsse des Jonsbo N3 Gehäuse nicht direkt zum Mainboard, so dass man hier eigene PIN Header basteln muss.
Momentan ist noch provisorisch ein übrig gebliebener 120mm Lüfter mit nur einer Schraube befestigt.
Ich werde mir hier noch überlegen ob ich einen passenderen Lüfter und vielleicht einen 3D-gedruckten Lüfteradapter (60mm auf 120mm) umbaue.
Eigentlich ist der 120er auch mit nur einer Schraube ziemlich fest drauf da er hinten auf den Ports zufälligerweise absolut Plan aufliegt und kühlt so auch noch gut die SSD mit.
Für das IPMI / BMC hingegen gibt es eine aktualisierte Version (12.61.17). Den download direkt von Gigabyte findet man hier
Im entpackten Archiv einfach die Datei "rom.ima_enc" aus dem Ordner "fw" über IPMI unter Maintenance > Firmware Update hochladen.
Für das BIOS gibt es leider kein Update auf der Herstellerseite. Auf meinen beiden gekauften Mainboards war die Version F09 aufgespielt.
Ich habe diese vorsichtshalber mal gesichert und hier bereitgestellt: Original BIOS MJ11-EC1 Version F09
In den Werkseinstellungen ist SMT (Multithreading) deaktiviert (nur 4 physische CPU-Kerne aktiv).
Unter AMD CBS die Option SMTEN auf Enabled aktiviert SMT. Damit lassen sich alle 8 logischen CPU-Kerne/Threads nutzen.
Gegebenenfalls nicht benötigte Netzwerkkarten lassen sich deaktivieren
C-States (automatisches runter-takten von CPU Kernen) aktivieren (nur C1 bis C3 vorhanden)
Nicht benötigte Optionen und Optionen für die das Board gar keine Anschlüsse verbaut hat deaktivieren
SDKarte MMC
Ich habe mich dazu entschlossen die M.2 SSD sowohl für das FreeNAS System als auch Datenpool für spätere Applikationen/VMs zu nutzen. Dazu habe ich folgende Anleitung benutzt.
Zusammengefasst ruft man vor Installation die Shell auf und modifiziert das Installationsskript so dass es nur 16GB statt 100% des vorhandenen Platzes nutzt. und führt dieses Skript anschließend aus.
sed -i 's/sgdisk -n3:0:0/sgdisk -n3:0:+16384M/g' /usr/sbin/truenas-install
/usr/sbin/truenas-install
Im Anschluss an die Installation kann man dann mit parted, oder einem grafischem Tool wie gparted eine zusätzliche ZFS Partition Partition erstellen, und in TrueNAS als Datenpool nutzen.
TrueNAS läuft auf dem Board erstmal nicht ganz fehlerfrei. Dazu müssen zunächst zwei mit der Epyc Plattform zusammenhängende Probleme behoben werden:
Die Konsole wird mit mutmaßlichen PCI-E Fehlern vollgemüllt. (Advanced Error Reporting) (Details siehe Thomas Krenn Wiki und TrueNAS Forum)
AER: Multiple Corrected error received: 0000:00:1c.4 AER: PCIe Bus Error: severity=Corrected, type=Physical Layer, (Receiver ID) ....
midclt call system.advanced.update '{ "kernel_extra_options": "pci=noaer" }'
midclt call system.advanced.update '{"kernel_extra_options": "ahci.mobile_lpm_policy=0"}'
Zum setzen beider Optionen gleichzeitig:
midclt call system.advanced.update '{"kernel_extra_options": "pci=noaer ahci.mobile_lpm_policy=0"}'
Anschließend Neustart. Die so gesetzen Kernel Optionen sind in TrueNAS persistent und überstehen Neustarts!
Damit das System so wenig Energie wie möglich unnötig verbraucht habe ich verschiedene Stromsparoptionen ausprobiert.
Mit den folgenden Optionen auf einen Idle Verbrauch von 22 bis 22,9W gekommen.
Dabei waren insgesamt drei 12V Lüfter am System angeschlossen, eine 1TB PM981a M.2 nvme SSD sowie die 32GB ECC RAM aus der Einkaufsliste verbaut.
ahci.mobile_lpm_policy=2
erlaubt die höchsten Stromspareinstellungen an den SATA Anschlüssen, welche die EPYC Embedded Plattform beherrscht.pcie_aspm=force
erzwingt die Aktivierung von "Active-state power management" für alle PCIE Verbindungen.pcie_aspm.policy=powersave
setzt die powersave policy für alle PCIE Verbindungen.Um alle Optionen mit dem Fix von weiter Oben unter Truenas Scale zu setzen:
midclt call system.advanced.update '{"kernel_extra_options": "pci=noaer ahci.mobile_lpm_policy=2"}'
Zusätzlich habe ich mehrere Kommandos in TrueNAS unter Init Scripts hinterlegt die nach Systemstart ausgeführt werden:
cpupower frequency-set -g powersave
setzt den CPU gouverner auf powersave, was maximale Einsparung bringt. Möchte man etwas dynamischer auf stärkere Lasten reagieren empfielt sich allerdings der ondemand
gouverner!powertop -c --auto-tune
ermittelt nach systemstart automatisch mögliche Optimierungen und setzt diese/root/ZenStates-Linux-master/zenstates.py -p 2 -f 24 -d 8 -v 94 && /root/ZenStates-Linux-master/zenstates.py -p 1 -f 30 -d 8 -v 80
wget "https://github.com/r4m0n/ZenStates-Linux/zipball/master/" -O temp.zip && unzip temp.zip && rm temp.zip