Weltpremiere: Undervolting von AMD-CPU unter FreeBSD über ModelSpecificRegister
Willkommen in der Mk-Community › Foren › Energie & Stromspar – PC Systeme › Stromspar- und Messtechnik › Weltpremiere: Undervolting von AMD-CPU unter FreeBSD über ModelSpecificRegister
- Dieses Thema hat 8 Antworten und 6 Teilnehmer, und wurde zuletzt aktualisiert vor 15 Jahren, 5 Monaten von Obi Wan.
-
AutorBeiträge
-
-
21. Januar 2008 um 23:01 Uhr #727448ulvTeilnehmer
:respekt:, das ist ja mal eine Anleitung ganz nach meinem Geschmack.
Super Idee, das gleich in den powerd reinzuschreiben. :d:
Kann mir keine bessere Lösung denken. -
21. Januar 2008 um 23:01 Uhr #486355smaxTeilnehmer
EDIT: Der Powerd-Patch ist nun überflüssig, cpupowerd ab Version 0.2.0 unterstützt nun auch FreeBSD (Download hier).Meinen Windows-Stromsparrechner habe ich ja schon hier vorgestellt.Unter Linux habe ich Undervolting ebenfalls hier schon erfolgreich getestet.Jetzt wollte ich auch noch wissen, ob Undervolting unter FreeBSD möglich ist. Ich habe die gleichen Komponenten wie oben unter Windows verwendet, jedoch habe ich nur eine Festplatte angeschlossen (Samsung 2,5″ SpinPoint M5S 160GB SATA (HM160HI)) und das DVD-Laufwerk abgeklemmt (nach der Installation).ACHTUNG: Ausprobieren natürlich nur auf eigene Gefahr (Anleitung genau lesen!) – es besteht die Möglichkeit, die CPU zu zerstören (übernehme natürlich keine Haftung) :D!!!Undervolting mit diesen Patches wurde von mir unter einem AMD X2 3800 EE SFF getestet. Normalerweise sollten diese Patches auch unter jeden anderen AMD X2 bzw. Semprons ev. auch Turions funktionieren, jedoch wurde das noch nicht getestet. Auf keinen Fall funktionieren diese Patches mit einer Intel CPU, einem AMD Opteron (Barcelona) und einem AMD Phenom!Diese Patches sind ein erstes funktionierendes Konzept, wie Undervolting unter FreeBSD funktionieren könnte. Es fehlen Sicherheitsabfragen (z.B. ob Intel oder AMD CPU), die Erweiterung für Intel-Prouessoren und mehr. Die Erweiterungen wurden teilweise vom Kernel aus /usr/src/sys/i386/cpufreq/powernow.c herauskopiert und nur geringfügig ergänzt und verändert. Fürs Undervolting habe ich eine Standardinstallation von FreeBSD 7.0 RC1 amd64 verwendet. Es ist notwenig den Quellcode von zumindest /usr/sbin zu installieren und auch der Teil /usr/ports/sysutils/devcpu von den Ports muss vorhanden sein. Änderungen am Kernel wurden nicht vorgenommen.Da ich im Internet nichts über undervolting unter FreeBSD gefunden habe, blieb mir also nichts anderes übrig, als selbst etwas Hand anzulegen. Die Methode, undervolting über die ModelSpezificRegister (MSR) durchzuführen, hat mir schon unter Linux gut gefallen, da hier am Kernel nichts verändert werden muss. Daher war es für mich naheliegend, diesen Weg auch unter FreeBSD einzuschlagen. Dokumentationen für die AMD-CPUs und deren MSRs findet man unter http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/26094.PDF. Die speziellen Register die ich hier verwende sind auf den Seiten 382-385 dokumentiert.Zum Glück gibts in den Ports ein Kernelmodul, das den Zugriff auf diese MSR ermöglicht. In diesem Kernelmodul namens devcpu ist, in der von mir verwendeten Version 0.8.2, leider ein kleiner Fehler vorhanden, der einen schreibenden Zugriff auf die MSR verhindert. Ich habe den Portsmaintainer bereits benachrichtigt, weiss aber nicht wann er diesen Fehler behebt, und daher muss mann inzwischen folgenden Patch verwenden:UPDATE: Laut Nachricht vom Portsmaintainer ist der Patch inzwischen committed – beim Testen unbedingt die Versionsnummer von devcpu kontrollieren -> ab Version 0.8.3 von devcpu ist der Patch bereits enhalten![CODE]— cpu.orig/cpu.c 2007-07-20 00:30:18.000000000 +0200+++ cpu/cpu.c 2008-01-18 23:59:32.000000000 +0100@@ -230,7 +230,8 @@ (“[cpu,%d]: bad cpu number %d”, __LINE__, cpu)); /* Explicitly clear cpuid data to avoid returning stale info */- data->data = 0;+ if (cmd == CPU_RDMSR)+ data->data = 0; DPRINTF(“[cpu,%d]: operating on MSR %#0x for %d cpu
“, __LINE__, \ data->msr, cpu);[/CODE]Der erste Schritt ist nun, diesen devcpu-Port als root unter der Anwendung des obigen Patch zu installieren. Ich habe das folgendermassen durchgeführt:cd /usr/ports/sysutils/devcpu/filestouch patch-cpu -> obigen Patch reinkopierenmake installNun ist devcpu kompiliert und eingespielt und wir können das Modul mittels “kldload cpu” laden.Um den Aufwand gering zu halten, habe ich einfach den powerd hergenommen und ihn um die Fähigkeit fürs undervolting einer AMD-CPU mit folgendem Patch erweitert:[CODE]— powerdO/powerd.c 2007-06-13 21:05:11.000000000 +0200+++ powerd/powerd.c 2008-01-20 23:00:21.000000000 +0100@@ -46,6 +46,8 @@ #include#include +#include “cpu.h”+ #ifdef USE_APM #include #endif@@ -66,6 +68,14 @@ SRC_UNKNOWN, } power_src_t; +typedef struct {+ int fid; /* fid */+ int vid; /* Originale vid */+ int uvvid; /* vid fuers untervolten */+} uvtab_t;++uvtab_t uvtabs_t[2];+ const char *modes[] = { “AC”, “battery”,@@ -77,6 +87,13 @@ #define DEVDPIPE “/var/run/devd.pipe” #define DEVCTL_MAXBUF 1024 +#define MSR_AMDK7_FIDVID_CTL 0xc0010041+#define MSR_AMDK7_FIDVID_STATUS 0xc0010042++#define PN8_STA_CFID(x) ((x) & 0x3f)+#define PN8_STA_CVID(x) (((x) >> 32) & 0x1f)+#define PN8_STA_PENDING(x) (((x) >> 31) & 0x01)+ static int read_usage_times(long *idle, long *total); static int read_freqs(int *numfreqs, int **freqs, int **power); static int set_freq(int freq);@@ -99,6 +116,7 @@ static int cpu_idle_mark; static int poll_ival; static int vflag;+static int uflag; static volatile sig_atomic_t exit_requested; static power_src_t acline_status;@@ -190,14 +208,218 @@ } static int+init_undervolting(void)+{+ // fid, originale vid, und vid fuers undervolten+ uvtabs_t[0].fid = 2; /* 1000 MHz */+ uvtabs_t[0].vid = 22; /* 1.000V */+ uvtabs_t[0].uvvid = 28; /* 0.850V */+ uvtabs_t[1].fid = 10; /* 1800 MHz */+ uvtabs_t[1].vid = 20; /* 1.050V */+ uvtabs_t[1].uvvid = 24; /* 0.950V */+ uvtabs_t[2].fid = 12; /* 2000 MHz */+ uvtabs_t[2].vid = 18; /* 1.100V */+ uvtabs_t[2].uvvid = 22; /* 1.000V */++ return 0;+}++static int+get_vid(int typ, int fid, int *vid)+{+ int i;++ for(i=0;i<3;i++) {+ if (uvtabs_t[i].fid == fid) {+ if (typ == 1)+ *vid = uvtabs_t[i].vid;+ else+ *vid = uvtabs_t[i].uvvid;+ return 0;+ }+ }++ if (vflag)+ printf("No VID found for FID %d!
“, fid);++ return (-1);+}++static int+get_msr_value(unsigned long address, uint64_t *value)+{+ int fd;+ int result;+ cpu_msr_args_t msr_args;++ msr_args.msr = address;++ fd = open(“/dev/cpu0”, O_RDONLY);+ if (fd < 0) {+ printf("Can't open /dev/cpu0! Please load kernelmodul devcpu with kldload cpu.
“);+ return (-1);+ }++ result = ioctl(fd, CPU_RDMSR, &msr_args);++ close(fd);++ if (result < 0) {+ printf("Error: ioctl in function get_msr_value <%d>!
“, result);+ return (-1);+ }++ *value = msr_args.data;++ return (0);+}++static int+set_msr_value(unsigned long address, uint64_t *value)+{+ int fd;+ int result;+ cpu_msr_args_t msr_args;++ msr_args.msr = address;+ msr_args.data = *value;++ fd = open(“/dev/cpu0”, O_RDWR);+ if (fd < 0) {+ printf("Can't open /dev/cpu0! Please load kernelmodul devcpu with kldload cpu.
“);+ return (-1);+ }++ result = ioctl(fd, CPU_WRMSR, &msr_args);++ close(fd);++ if (result < 0) {+ printf("Error: ioctl in function set_msr_value <%d>!
“, result);+ return (-1);+ }++ return 0;+}++static int+pn8_read_pending_wait(uint64_t *status)+{+ int i = 10000;++ do {+ if (get_msr_value(MSR_AMDK7_FIDVID_STATUS, status) != 0)+ return (-1);+ }+ while (PN8_STA_PENDING(*status) && –i);++ return (i == 0 ? -1 : 0);+}++static int+pn8_write_fidvid(u_int fid, u_int vid, uint64_t ctrl, uint64_t *status)+{+ int i = 100;+ uint64_t value;++ value = (((ctrl) << 32) | (1ULL << 16) | ((vid) << 8) | (fid));++ // Bei mir funktionieren beide Varianten, die erste gefällt mir besser.++ // Variante 1+ if (set_msr_value(MSR_AMDK7_FIDVID_CTL, &value) != 0)+ return (-1);++ while (pn8_read_pending_wait(status) && --i);+ usleep(1000);++ // Variante 2+ //do {+ // if (set_msr_value(MSR_AMDK7_FIDVID_CTL, &value) != 0)+ // return (-1);+ // //usleep(1000);+ //}+ //while (pn8_read_pending_wait(status) && --i);++ return (i == 0 ? -1 : 0);+}++static int+restore_vid(void)+{+ int rv;+ int vid;+ int cfid, cvid;+ uint64_t status;++ // Hole aktuelle FID und VID+ rv = pn8_read_pending_wait(&status);+ if (rv)+ return (rv);+ + cfid = PN8_STA_CFID(status);+ cvid = PN8_STA_CVID(status);++ // Hole aus struct die originale VID+ if (get_vid(1, cfid, &vid) == 0) {+ if (vflag)+ printf("Original VID %d for FID %d would be restored.
“, vid, cfid);+ if (pn8_write_fidvid(cfid, vid, 1ULL, &status) != 0)+ return (-1);+ cvid = PN8_STA_CVID(status);+ }++ return 0;+}++static int set_freq(int freq) {+ int rv;+ int vid;+ int cfid, cvid;+ uint64_t status;+ + if (uflag) // Undervolting Aktiv+ restore_vid(); if (sysctl(freq_mib, 4, NULL, NULL, &freq, sizeof(freq))) { if (errno != EPERM) return (-1); } + if (uflag) { // Undervolting Aktiv+ // Hole aktuelle FID und VID+ rv = pn8_read_pending_wait(&status);+ if (rv)+ return (rv);+ + cfid = PN8_STA_CFID(status);+ cvid = PN8_STA_CVID(status);+ + // Hole aus struct die undervolting VID+ if (get_vid(0, cfid, &vid) == 0) {+ if (vflag)+ printf(“Undervolting VID %d for FID %d would be adjusted.
“, vid, cfid);+ if (pn8_write_fidvid(cfid, vid, 1ULL, &status) != 0)+ return (-1);+ cvid = PN8_STA_CVID(status);+ }+ }++ if (vflag) {+ // Hole aktuelle FID und VID+ rv = pn8_read_pending_wait(&status);+ if (rv)+ return (rv);+ + cfid = PN8_STA_CFID(status);+ cvid = PN8_STA_CVID(status);+ + printf(“VID: %d, FID: %d
“, cvid, cfid);+ }+ return (0); } @@ -357,7 +579,7 @@ { fprintf(stderr,-“usage: powerd [-v] [-a mode] [-b mode] [-i %%] [-n mode] [-p ival] [-r %%] [-P pidfile]
“);+”usage: powerd [-v] [-u] [-a mode] [-b mode] [-i %%] [-n mode] [-p ival] [-r %%] [-P pidfile]
“); exit(1); } @@ -375,6 +597,8 @@ uint64_t mjoules_used; size_t len; + init_undervolting();+ /* Default mode for all AC states is adaptive. */ mode_ac = mode_battery = mode_none = MODE_ADAPTIVE; cpu_running_mark = DEFAULT_ACTIVE_PERCENT;@@ -382,12 +606,13 @@ poll_ival = DEFAULT_POLL_INTERVAL; mjoules_used = 0; vflag = 0;+ uflag = 0; /* User must be root to control frequencies. */ if (geteuid() != 0) errx(1, “must be root to run”); – while ((ch = getopt(argc, argv, “a:b:i:n:p:P:r:v”)) != EOF)+ while ((ch = getopt(argc, argv, “a:b:i:n:p:P:r:vu”)) != EOF) switch (ch) { case ‘a’: parse_mode(optarg, &mode_ac, ch);@@ -427,6 +652,9 @@ case ‘v’: vflag = 1; break;+ case ‘u’:+ uflag = 1;+ break; default: usage(); }@@ -498,6 +726,7 @@ /* If the user requested we quit, print some statistics. */ if (exit_requested) {+ restore_vid(); if (vflag && mjoules_used != 0) printf(“total joules used: %u.%03u
“, (u_int)(mjoules_used / 1000),[/CODE]Patch einspielen (als root):cd /usr/src/usr.sbintouch powerd.patch -> obigen Patch reinkopierenpatch -p0 < powerd.patchDas Headerfile "cpu.h" vom devcpu-Modul unter /usr/local/include wird fürs kompilieren benötigt. Ich habe cpu.h einfach in den Ordner von /usr/src/user.sbin/powerd hineinkopiert -> es gibt da natürlich noch andere Wege.Nach dem “make all install” im Ordner “/usr/src/user.sbin/powerd” ist nun der gepachte powerd fertig für den ersten Test. Alle folgenden Operation muss man natürlich als root ausführen.Falls das devcpu-Kernelmodul noch nicht geladen ist, muss man das nun mittels “kldload cpu” durchführen.Um herauszufinden, welche FIDs und VIDs vom powerd benutzt werden, muss man den powerd nun mittels “powerd -v” starten und auf keinen Fall den neuen Parameter -u verwenden!Es gibt nun zusätzliche Meldungen, die die verwendeten VIDs ausgeben. Ein Beispiel:[CODE]test# powerd -vpowerd: unable to determine AC line statusidle time < 65%, increasing clock speed from 1000 MHz to 2000 MHzVID: 18, FID: 12idle time > 90%, decreasing clock speed from 2000 MHz to 1800 MHzVID: 20, FID: 10idle time > 90%, decreasing clock speed from 1800 MHz to 1000 MHzVID: 22, FID: 2idle time < 65%, increasing clock speed from 1000 MHz to 2000 MHzVID: 18, FID: 12idle time > 90%, decreasing clock speed from 2000 MHz to 1800 MHzVID: 20, FID: 10idle time > 90%, decreasing clock speed from 1800 MHz to 1000 MHzVID: 22, FID: 2[/CODE]Umrechnungen VID <-> Spannung (in mV) und FID <-> Frequenz (in MHz):Frequenz zu FID: FID = (Frequenz – 800) / 100FID zu Frequenz: Frequenz = (FID * 100) + 800Spannung zu VID: VID = (1550 – Spannung) / 25VID zu Spannung: Spannung = 1550 – (VID * 25)ACHTUNG: Mit dieser Methode kann man den Prozessor bis zur minimalen Spannung von 0.8V (VID = 30) undervolten. Niemals eine höhere VID als 30 benutzen!In powerd.c gibt es nun unter der Funktion init_undervolting(void) die Möglichkeit die VID für 3 FIDs einzustellen.fid; /* fid */vid; /* Originale vid */uvvid /* vid fürs untervolten */Hier die fid und vid der Ausgabe von “powerd -v” verwenden.Die uvvid kann man nur durch Ausprobieren (vid ausgehend vom Standardwert schrittweise erhöhen (Spannung senken), dann mehrere Stunden Stabilitätstest mit Hilfe von z.B. mprime) herausfinden oder man übernimmt Werte die man z.B. unter Windows mit CrystalCPUID ermittelt hat. Beim Ausprobieren sollte man die vid nur in kleinen Schritten erhöhen (also die Spannung erniedrigen). Die bei mir unter Windows ermittelten vid Werte musste ich leicht erniedrigen (also die Spannung erhöhen), damit ein stabiler Betrieb gewährleistet war (z.B. bei FID 2 (1000MHz) habe ich unter FreeBSD eine vid von 28 (0.85V) verwendet, unter Windows funktionierte auch eine vid von 30 (0.8V)). Um die Spannung zu erniedrigen muss man die uvvid höher wählen als die vid!ACHTUNG: Wenn man die uvvid niedriger als die vid wählt, kann man die CPU zerstören, weil dann die CPU mit einer höhere Spannung versorgt wird!!Nach einem neuerlichen “make all install” im Ordner “/usr/src/user.sbin/powerd” ist nun der gepachte und richtig eingestellte powerd aktiv.Nach dem Start des powerd mittels “powerd -v -u” oder “powerd -u” (startet dann als daemon) ist nun das Undervolting aktiv. Bei mir brachte das Undervolting im Idle ca. 2.5 W Ersparniss, weitaus mehr kann man bei voller CPU-Auslastung sparen.Mit der oben angegebenen Hardware und 100MBit Netzwerkspeed erreiche ich unter KDE im Idle 20.4 W:Unter der Konsole ohne X erreiche ich 19.3 W:Den powerd habe ich im Adaptive Mode verwendet, die beiden anderen Modes (Min und Max) habe ich noch nicht getestet, aber ich vermute mal das zumindest der Max-Mode nicht funktioniert, da es immer eine Änderung der CPU-Frequenz benötigt, damit das Undervolting aktiv wird. Der Min-Mode könnte funktionieren, wenn die CPU beim Start von powerd noch mit der höchsten möglichen Frequenz arbeitet und dann die Frequenz auf den niedrigsten Werte eingestellt wird (hier erfolgt also eine Frequenzänderung). Um eine bewusste Frequenzänderung herbeizuführen habe ich den Benchmark ubench verwendet.Im BIOS von meinem Motherboard habe ich unter C’n Q AUTO eingestellt.Zusätzlich habe ich auch noch die Netzwerkgeschwindigkeit von 1GBit auf 100MBit mittels “ifconfig nfe0 media 100basetx mediaopt full-duplex” gedrosselt, brachte mit etwa 2.5 W gleich viel wie das Undervolting im Idle. Was mir auch noch aufgefallen ist, das sich der Verbrauch unter KDE und unter der Konsole ohne KDE nur ca. 1 W unterscheidet – bei Linux waren es ca. 2.5 W.Das Undervolting lässt sich relativ leicht auch auf Intel-CPUs erweitern. Die benötigten MSR-Adressen lassen sich aus dem Kernelsource unter /usr/src/sys/i386/cpufreq/est.c rauslesen.FreeBSD 7.0 RC1 amd64 erkennt meine ganze Hardware (bis auf Sound – habe aber nicht geschaut, ob ich den zum laufen bringe) und startet ohne Probleme. Leider unterstützt der freie Grafiktreiber nv den im Chipsatz integrierten GForce 7050 auch noch nicht. Für die amd64 Variante gibts meines Wissens auch noch keinen Treiber von NVidia der den 7050 unterstützt und so musste ich vesa mit 1280×1024 verwenden, obwohl mein Monitor 1680×1050 unterstützt.Edit: Falls jemand weitere Patches (z.B. für die Intel-CPUs) schreibt oder den Patch weiterentwickelt, dann möchte ich bitten, den Code oder zumindest einen Link hier anzugeben. -
22. Januar 2008 um 18:01 Uhr #727619-ElektroMOD-Teilnehmer
echter :respekt: geht raus =D>
als Windows Nutzer wirkt das nochmal so heftig 🙂
-
23. Januar 2008 um 12:01 Uhr #727735MuttiTeilnehmer
8-[\D/=D>
WOW, na da habe ich mal genau das gefunden was ich seit MONATEN suche ❗
Werde, sobald meine Komponenten da sind, gleich auch Hand anlegen und testen :d:
Chris
-
26. Januar 2008 um 22:01 Uhr #728474smaxTeilnehmer
ulv;279782 said:
:respekt:, das ist ja mal eine Anleitung ganz nach meinem Geschmack.Super Idee, das gleich in den powerd reinzuschreiben. :d:Kann mir keine bessere Lösung denken.Danke, ich kann mir derzeit auch keine bessere und einfachere Lösung denken :D.
-ElektroMOD-;279970 said:
echter :respekt: geht raus =D>als Windows Nutzer wirkt das nochmal so heftig 🙂Vielen Dank, es ist eigentlich gar nicht so schwierig. Ich glaube das Undervolting unter CrystalCPUID/Windows ziemlich ähnlich funktioniert ;).
Mutti;280110 said:
8-[\D/=D>WOW, na da habe ich mal genau das gefunden was ich seit MONATEN suche :!:Werde, sobald meine Komponenten da sind, gleich auch Hand anlegen und testen :d:ChrisDas wäre wirklich super, wenn du diese Patches testen könntest. Hast du irgendwas (brauchbares) in diesen Monaten gefunden?Ich habe bereits eine Nachricht vom Portsmaintainer bekommen, das der Patch für cpu.c (devcpu Kernelmodul) schon committed ist – also beim testen unbedingt auf die Versionsnummer vom devcpu schauen, der patch ist ab der Version 0.8.3 bereits enthalten:!:Durch eine Hardwareänderung (2x1GB DDR2 800 Crucial Value Ram (double sided) ersetzt durch 1x2GB DDR2 800 Transcend (double sided), da DualChannel bei modernen Systemen praktisch nichts bringt -> siehe z.B. hier) ist der Verbrauch des Rechners unter KDE auf knapp unter 19 W gesunken.
-
2. November 2008 um 16:11 Uhr #781979smaxTeilnehmer
Der powerd-patch im ersten Posting ist nun überflüssig.
Habe soeben cpupowerd in der Verson 0.2.0 released.
Diese bringt neben kleinen Änderungen für Linux nun auch FreeBSD-Support mit.
Getestet wurde unter FreeBSD 7.0 und FreeBSD 7.1BETA1.
Für die Installation Bitte das README-File genau lesen.
cpupowerd wird wahrscheinlich auch bald im Portstree verfügbar sein.
Mehr Informationen über cpupowerd bekommt man hier und den Download gibts hier. -
10. November 2008 um 23:11 Uhr #783126Der_EismannTeilnehmer
habe mir gerade einen System mit FreeNas gebaut.
Läuft soweit auch gut.
Nun möchte ich das System auch möglichst sparsam halten!da kommt cpupowerd gerade recht!
nur ich hab mit unix/freebsd noch nicht so viel zu tun gehabt!
deshalb die frage: wie bekomme ich cpupowerd in freenas zum laufen?komme bei der install nicht weiter :
[CODE]
freenas:/tmp/cpupowerd-0.2.0/src# make
make: Command not found.[/CODE]🙄
-
11. November 2008 um 21:11 Uhr #783273Obi WanAdministrator
-closed-
-
11. November 2008 um 21:11 Uhr #783270smaxTeilnehmer
Der_Eismann;340241 said:
habe mir gerade einen System mit FreeNas gebaut.Läuft soweit auch gut.Nun möchte ich das System auch möglichst sparsam halten!da kommt cpupowerd gerade recht!nur ich hab mit unix/freebsd noch nicht so viel zu tun gehabt!deshalb die frage: wie bekomme ich cpupowerd in freenas zum laufen?Dir ist schon klar, das cpupowerd eher für erfahrene User gedacht ist!?Leider kenne ich mich mit FreeNAS nicht so gut aus.Dir fehlt anscheinend die komplete Buildumgebung – ich weiß aber nicht, ob es die bei FreeNAS überhaupt gibt. Falls FreeNAS den Portstree nutzen kann, warte noch etwas, den dann kannst du hoffentlich bald ein Binärpackage herunterladen (brauchst nicht selber kompilieren).Wenn du mir deine verwendete Version von FreeNAS mitteilst, könnte ich das selber mal probieren und mir FreeNAS einmal anschauen.Bitte den nächsten Post im Thread über cpupowerd schreiben, da dieser eigentlich geschlossen werden könnte.
-
-
AutorBeiträge
- Du musst angemeldet sein, um auf dieses Thema antworten zu können.