4 extra 2.5GbE-interfaces toevoegen aan de GMKtec NucBox G9

Achtergrond

Een paar maanden geleden schreef ik over het gebruik van een Intel n150-gebaseerde mini-PC als thuisrouter waarop OpenWrt draait. Sindsdien kan ik melden dat deze perfect betrouwbaar is¹, al is er één uitzondering.

De NucBox G9 wordt berucht heet wanneer er NVMe-schijven zijn geïnstalleerd. Zelfs zonder hete NVMe-schijven zou ik de algemene thermische situatie omschrijven als "niet geweldig, maar ook niet verschrikkelijk". Ik heb geen specifieke problemen ervaren, aangezien OpenWrt een van de lichtste workloads is die ik zou kunnen draaien. Mijn unit blijft rond de 50°C, wat uitstekend is. Waar ik me echter zorgen over maakte, is de 64GB aan ingebouwd eMMC-opslaggeheugen.

Voor zover ik weet, is eMMC in feite een opgevoerde SD-kaart die op het moederbord is gesoldeerd. Mijn ervaring met het opstarten van computers vanaf SD-kaarten leert me dat dit niet erg betrouwbaar is. Mijn angst werd bevestigd door de ervaring van een gebruiker wiens eMMC na zes maanden defect raakte. Natuurlijk zou ik kunnen opstarten vanaf een NVMe- of SATA m.2 SSD, of zelfs een USB-stick. Maar de router is de hoofdader van mijn gehele netwerk; het idee dat ik끔 een OS moet downloaden en flashen terwijl mijn netwerk plat ligt, is een horrorscenario dat ik liever vermijd.

De NucBox is voor mij ook een slachtoffer van zijn eigen succes. Ik ben er dol op en hij is perfect als thuisrouter. Het probleem is dat fabrikanten van mini-PC's een productlevenscyclus van ongeveer twee weken hebben, en de G9 is inmiddels meer dan een jaar oud. In andere woorden: het is prehistorie. In mei, toen ik hem kocht, waren er nog een paar beschikbaar op eBay, maar sindsdien is het aanbod volledig opgedroogd. Er zijn vervangende modellen beschikbaar, maar door de huidige marktsituatie ("RAMpocalypse") zijn de prijzen absurd en is geen enkele een exacte vervanging voor de N150 G9 met zijn Intel NIC's.

Ik besloot daarom proactief een reserve-G9 te bemachtigen om hardwarestoringen voor te zijn. Ik stelde een eBay-alert in en vergat het grotendeels. Op een ochtend werd ik wakker met een e-mail dat er een G9 was geplaatst voor $150, inclusief verzending. Dat was zelfs minder dan de $180 die ik voor mijn originele unit had betaald. De verkoper gaf aan dat het toestel gebruikt was als NVMe NAS, maar dat dit niet houdbaar was. Voor mijn doeleinden was hij perfect.

Het toevoegen van de NIC's

Zodra ik het vervangende toestel in handen had, was het eerste wat ik deed het verwijderen van de problematische USB-C voedingsadapter die niet aan de standaarden voldeed.

Daarna richtte ik me op mijn droom om een paar extra 2.5GbE NIC's (Network Interface Cards) toe te voegen. Waarom? Hoewel redundante ISP-verbindingen iets zijn wat ik in de toekomst zou kunnen doen, was de eerlijke reden vooral dat ik dacht dat het cool zou zijn. Bij een prijs van $25 per stuk met snelle levering, belandde dit project in het gevaarlijke gebied van impulsaankopen en de sunk cost fallacy.

Ik kocht twee m.2 B+M key I226-V adapters en plugde ze in, waarbij de ethernetpoorten aan de achterkant naar buiten staken. Ik startte een verse kopie van Alpine Linux op en was blij te zien dat ze "gewoon werkten". Na enkele basisdoorvoertesten tussen de NIC's bleek dat ik nagenoeg de volledige 2.5Gb throughput behaalde.

De volgende stap was het bedenken van een montage-oplossing. Omdat mijn 3D-ontwerpvaardigheden minimaal zijn, stopte het project daar voor een paar weken. Ik liet alles op mijn bureau liggen en vroeg me af hoe dit technisch opgelost kon worden.

De G9 bestaat in essentie uit een aluminium middenrail met plastic boven- en onderplaten. De schroeven zijn Philips en liggen volledig bloot. De m.2-slots bevinden zich aan de onderkant, wat de eerste plaat is die verwijderd moet worden om het toestel te demonteren. Eenmaal verwijderd, besefte ik dat de geometrie vrij eenvoudig was en dat een vervangende bodemplaat ontworpen zou kunnen worden die op dezelfde manier als de originele plaat wordt vastgeschroefd. De montage-schroeven voor de m.2-schijven zijn echter geïntegreerd in de originele bodemplaat, wat het ingewikkelder maakt. Toch leek het simpel, maar het was voor mij onbereikbaar omdat de gedachte aan het downloaden van Fusion (CAD-software) me afschrikt.

Claude CAD

Op een dag realiseerde ik me dat iemand waarschijnlijk al een bodembehuizing had ontworpen. Hoewel het een niche is, is de motivatie groot omdat de standaardbehuizing en koeling onvoldoende zijn. Via een Google-zoekopdracht vond ik een uitstekende kit op de site Printables van gebruiker "sleeeeeepy". Dit was precies wat ik zocht: een volledige vervanging van de bodembehuizing met variaties voor verschillende ventilatorgroottes die direct op de NVMe-schijven blazen. Dit was 90% van wat ik nodig had.

Omdat ik nog steeds Fusion niet wilde gebruiken en de printbestanden in 3MF-formaat waren (wat ik niet kende), vroeg ik Claude (een LLM) om een uitleg. Ik leerde dat een 3MF-bestand in feite een zip-bestand is met XML-tekst. Aangezien LLM's goed zijn in het verwerken van tekst, vroeg ik me af of Claude het 3D-bestand voor mij kon aanpassen. Ondanks de waarschuwingen dat LLM's niet goed zijn in wiskunde, ging dit verbazingwekkend soepel.

Ik mat zaken met mijn digitale schuifmaat en voerde de afmetingen stap voor stap in Claude in:

  1. Eerst voegde ik vier gaten toe voor de jacks.
  2. Daarna voegde ik een monteringsrail toe zodat ik de jack-PCB's kon vastschroeven met heat-set threaded inserts.
  3. Vervolgens liet ik bevestigingspunten toevoegen voor twee 40mm Noctua-ventilatoren.
  4. Ten slotte liet ik de voorkant van de behuizing "afsnijden" zodat ik een testprint kon maken om te verifiëren of de jacks pasten.

Er was een klein probleem met de ruimte voor sommige through-hole componenten, dus liet ik Claude het ontwerp aanpassen voor meer speling. Na een tweede testprint was het ontwerp definitief.

3D-printen en de Prusa MK3

Ik realiseerde me dat er waarschijnlijk niet genoeg ruimte was om de threaded inserts te plaatsen zonder de voorkant te smelten. De oplossing was om de monteringsrail apart te laten printen, de inserts toe te voegen en deze vervolgens in de behuizing te lijmen.

Ik stapte over van PLA naar PETG, omdat PETG beter bestand is tegen warmere omgevingen zoals in een computer. De uiteindelijke print van de behuizing duurde ongeveer 8 uur.

Terzijde: Een review van de Prusa MK3 na 8 jaar Vanwege mijn gebrek aan CAD-vaardigheden is mijn 3D-printreis vrij rudimentair geweest. Acht jaar geleden kocht ik een Prusa i3 MK3 kit voor ongeveer $750. In het begin printte hij slecht, totdat ik besefte dat het printbed niet waterpas was. Door nylon borgmoeren op de bedschroeven te gebruiken en een Octoprint-plugin voor visualisatie, kon ik het bed perfect afstellen. Sindsdien is de printer van een hobby-object veranderd in een betrouwbaar instrument.

Ik heb de Prusa gebruikt voor het maken van jigs (mallen) om PCB's handmatig te assembleren met soldeerpasta, wat me uren tijd bespaarde. De laatste jaren staat de printer 99% van de tijd in de kast, maar hij werkt nog steeds perfect zonder enig onderhoud, zelfs met filament dat jaren oud is. Mijn conclusie na 8 jaar: gebruik nylon moeren voor het bed, zorg dat het waterpas staat, en hij is perfect voor eenvoudige, custom onderdelen zoals een bodemplaat voor een NucBox G9.

De uiteindelijke assemblage

Ik installeerde de threaded inserts en lijmde de monteringsrail op zijn plek met industriële CA-lijm (secondelijm) en activator. Vervolgens schroefde ik de ethernet-jack PCB's vast.

De laatste lastige stap was het aanpassen van de Noctua-ventilatoren aan de 4-pins SH1.0 JST-connectoren die de standaardventilatoren gebruiken. Hoewel ik liever draden aan een PCB soldeer dan draden aan elkaar, is het uiteindelijk gelukt. Ik heb ook geverifieerd dat de PWM- en RPM-sensoren werken. In theorie zou je alleen de 5V en GND pinnen kunnen gebruiken, waardoor de ventilator constant op volle snelheid draait, maar dat zou de levensduur verkorten.

De NIC's hebben kabels die de m.2 PCB verbinden met de jack-PCB. Het was een uitdaging om alle kabels en ventilatordraden netjes op te rollen zodat ze de ventilatoren niet hinderden, maar het is gelukt.

Het originele ontwerp van "sleeeeeepy" bevatte pootjes voor luchtstroom. Omdat ik de box met command strips aan de wand van mijn netwerkkast wil bevestigen, liet ik Claude twee voetrails ontwerpen die zowel ruimte bieden voor de ventilatoren als voor de bevestigingsstrips.

Het resultaat is een schoon project dat volledig omkeerbaar is; als ik de NucBox zou willen verkopen, kan ik de originele bodemplaat gewoon weer terugplaatsen.

Softwarematige redundantie

Mijn doel was om een hot spare klaar te hebben staan. Ik wil in staat zijn om de WAN-, LAN- en stroomkabel uit één box te trekken, ze in de nieuwe box te plaatsen en binnen een minuut weer online te zijn.

Aanvankelijk liet ik de actieve router elke nacht configuratiebestanden back-uppen naar mijn NAS. Dat was echter niet snel genoeg bij een calamiteit. Nu ik een reserve-unit heb, heb ik een robuustere methode geïmplementeerd:

  1. De actieve router maakt een volledige back-up van het bestandssysteem met dd.
  2. Deze back-up wordt gecomprimeerd met gzip en opgeslagen op de NAS.
  3. Omdat OpenWrt slechts ongeveer 128MB van de schijfruimte gebruikt (wat comprimeert tot circa 17MB), is dit zeer efficiënt. Ik bewaar dagelijkse back-ups van de afgelopen week, wekelijkse van de laatste maand en maandelijkse van het afgelopen jaar. Deze worden ook via rsync naar een offsite locatie gekopieerd.

Voor het herstel heb ik Alpine Linux op een USB-stick geïnstalleerd met een script dat bij boot automatisch de nieuwste back-up van de NAS haalt en deze naar de interne eMMC-schijf flasht. Dit hele proces duurt ongeveer 2 minuten vanaf een koude start in Alpine tot een koude start in de herstelde OpenWrt. Omdat de BIOS eerst van de USB-stick boot, kan de reserve-unit zichzelf updaten tot een kopie van de actieve router.

Een klein detail: om ervoor te zorgen dat de WAN-poort altijd op dezelfde fysieke locatie blijft (aangezien Linux-interface-namen zoals eth0 niet altijd deterministisch zijn tussen verschillende installaties), gebruik ik een OpenWrt-bootscript dat de WAN-poort toewijst op basis van het MAC-adres van de specifieke box.

Slotgedachten

Dit was een leuk project. Een rotsvast thuisnetwerk is voor mij een interessante hobby, zeker omdat stabiel internet essentieel is voor mijn werk. Ik slaap nu een stuk rustiger, wetende dat ik een uitstekend rampenherstelplan heb.

Als ik het opnieuw zou doen, zou ik overwegen om de m.2 SATA SSD-slot als bootdrive te gebruiken en de ingebouwde m.2 A+E key WiFi-kaart te vervangen door een extra NIC. Ik twijfel hier echter over, omdat de mogelijkheid om een WiFi-netwerk uit te zenden of verbinding te maken met een mobiele hotspot voor WAN-failover toch aantrekkelijk is.

***

¹ Behalve die ene keer na een OpenWrt-upgrade, toen de WAN-poort bij herstart slechts op 100MbE synchroniseerde en ik dat een week lang niet merkte. Het herstarten van de interface loste het probleem op.