Diese Steuerung funktioniert, ist aber eigentlich veraltet, da nun das fanctl existiert. Hierzu gibt es einen entsprechenden Beitrag.
Leider schaltet sich der interne Lüfter des CH3SNAS trotz des Energiemanagements der Festplatten nicht ab und läuft daher stetig leise vor sich hin. Dieses “Feature” (“It’s not a Bug, it’s a Feature”) bringt mehrere Dinge mit sich. Zum einen habe ich dadurch eine stetige Lärmquelle in meinem Zimmer, die Nachts doch ein wenig nerven kann. Zum anderen spart die Abschaltung des Lüfters wieder einige Watt. Desweiteren wird so die Lebensdauer des Lüfters deutlich erhöht.
Diese Anleitung bedingt, dass das fun_plug (Artikel) korrekt installiert wurde. Zudem weise ich darauf hin, dass ich nicht für eventuelle Schäden, Datenverluste oder andere Probleme haften werden. Das Verwenden dieses Artikels geschieht auf eigene Gefahr!
Bitte beachtet meine Hinweise zu Release Candidates der Firmware 1.04!
Zur Erklärung des Codes der Lüftersteuerung:
Zunächst wird der alte Lüftercontroller gekillt, da dieser sonst dazwischenfunken würde. Darunter werden die Genzwerte konfiguriert. Mein Lüfter schaltet sich ab einer Temperatur von 96 Grad Fahrenheit ein und dreht dann mit 2700rpm. Im Bereich bis 110 Grad Fahrenheit dreht dann der Lüfter im Geschwindigkeitsbereich von 2700rpm bis 3500rpm (Maximal sind 6000rpm möglich ). Wenn die Festplatten sich ausschalten, wird geprüft ob das NAS bereits unter der Temperatur1 liegt (d.h. hier unter 96°F). Wenn ja, wird die Idle-Drehzahl gesetzt, die 0 ist, womit der Lüfter stehen bleibt. Wenn nein, dann dreht der Lüfter auf RPM1 (hier 2700rpm) weiter, bis das NAS kühl genug ist.
Eine Alternative, die nicht Festplattenabhängig ist, findet sich unter den folgenden drei Skripten.
#!/bin/sh
PATH=/usr/bin:/bin:/usr/sbin:/sbin:/mnt/HD_a2/fun_plug.d/bin/
# Converts Fahrenheit to Celciusf2c(){ /bin/echo `expr \(\($1 - 32\)\*10 + 9\)\/ 18`}# Converts Celcius to Fahrenheitc2f(){ /bin/echo `expr \($1\*9\)\/5\+ 32`}# Kill the old fan controllerPID=$(/bin/pidof fancontrol)if[ -n "$PID"]thenkill -9 $PIDfiupdate_interval=60#T1 and T2 in fahrenheit - convert if necessary using c2f functionT1=96T2=110IDLERPM=0RPM1=2700RPM2=3500while[1]do#Find out current temperatureT=`temperature g 0`T=${T##*=}C=`temperature g 0| grep -i -c centigrade `# Convert to Fahrenheit if output is in Celciusif[$C -gt 0]thenC=$TF=$(c2f $C)T=$FelseF=$TC=$(f2c $F)fi#Search dmesg for hard drive messagesDRIVE1_dmesg=`/bin/dmesg | /bin/grep HD1 | /bin/tail -1`DRIVE1_awake=`/bin/dmesg | /bin/grep HD1 | /bin/tail -1 | /bin/grep awake`# Calculate new fanspeed, depending on if drive is awake or notif[ -n "${DRIVE1_dmesg}"];then# True if dmesg contains status for driveif[ -n "${DRIVE1_awake}"];then# True if any of the drives are awake, keep fan runningnewRPM=`expr \(\($T2\<$F\)\*$RPM2\)\|\(\($RPM1 + \($RPM2 - $RPM1\)\*\($F - $T1\)\/\($T2 - $T1\)\)\&\($F\>=$T1\)\)`else# None of the drives is awake, now check if Temperature is above $T1if[$T -gt $T1];then#Keep the fan running until the NAS has cooled downnewRPM=$RPM1else#set speed to IDLE speednewRPM=$IDLERPMfifielse# dmesg does not yet contain the status the drive# (it has probably never powered down), keep fan runningnewRPM=`expr \(\($T2\<$F\)\*$RPM2\)\|\(\($RPM1 + \($RPM2 - $RPM1\)\*\($F - $T1\)\/\($T2 - $T1\)\)\&\($F\>=$T1\)\)`fi# Set the new fan speed fanspeed w $newRPM# Write some more to logfile# Wait for next cycle /bin/sleep $update_intervaldone
#!/bin/sh
PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Converts Fahrenheit to Celciusf2c(){ /bin/echo `expr \(\($1 - 32\)\*10 + 9\)\/ 18`}# Converts Celcius to Fahrenheitc2f(){ /bin/echo `expr \($1\*9\)\/5\+ 32`}# Kill the old fan controllerPID=$(/bin/pidof fancontrol)if[ -n "$PID"]thenkill -9 $PIDfiupdate_interval=60#T1 and T2 in fahrenheit - convert if necessary using c2f functionT1=96T2=110IDLERPM=0RPM1=2700RPM2=3500LOGDIR=/log
LOGFILE=${LOGDIR}/fan.txt
STATFILE=${LOGDIR}/fanstat.txt
mkdir -p ${LOGDIR}while[1]do#Find out current temperatureT=`temperature g 0`T=${T##*=}C=`temperature g 0| grep -i -c centigrade `# Convert to Fahrenheit if output is in Celciusif[$C -gt 0]thenC=$TF=$(c2f $C)T=$FelseF=$TC=$(f2c $F)fi#Search dmesg for hard drive messagesDRIVE0_dmesg=`/bin/dmesg | /bin/grep HD0 | /bin/tail -1`DRIVE1_dmesg=`/bin/dmesg | /bin/grep HD1 | /bin/tail -1`DRIVE0_awake=`/bin/dmesg | /bin/grep HD0 | /bin/tail -1 | /bin/grep awake`DRIVE1_awake=`/bin/dmesg | /bin/grep HD1 | /bin/tail -1 | /bin/grep awake`# Write some info to logfile/bin/echo "###############################################################"> $LOGFILE/bin/echo `date`>> $LOGFILE/bin/echo "Temp in Fahrenheit: $F" >> $LOGFILE/bin/echo "Temp in Celcius: $C" >> $LOGFILE# Calculate new fanspeed, depending on if drives are awake or notif[ -n "${DRIVE0_dmesg}"]&&[ -n "${DRIVE1_dmesg}"];then# True if dmesg contains status for both drivesif[ -n "${DRIVE0_awake}"]||[ -n "${DRIVE1_awake}"];then# True if any of the drives are awake, keep fan runningnewRPM=`expr \(\($T2\<$F\)\*$RPM2\)\|\(\($RPM1 + \($RPM2 - $RPM1\)\*\($F - $T1\)\/\($T2 - $T1\)\)\&\($F\>=$T1\)\)`if[ -n "${DRIVE0_awake}"];then# True if the first drive is awake/bin/echo "The first drive is awake">> $LOGFILEelse/bin/echo "The first drive is hibernating">> $LOGFILEfiif[ -n "${DRIVE1_awake}"];then# True if the second drive is awake/bin/echo "The second drive is awake">> $LOGFILEelse/bin/echo "The second drive is hibernating">> $LOGFILEfielse# None of the drives is awake, now check if Temperature is above $T1if[$T -gt $T1];then#Keep the fan running until the NAS has cooled downnewRPM=$RPM1 /bin/echo "Both drives are hibernating. Temperature still to high to switch fan off">> $LOGFILEelse#set speed to IDLE speednewRPM=$IDLERPM /bin/echo "Both drives are hibernating. Setting IDLE speed for fan">> $LOGFILEfifielse# dmesg does not yet contain the status for both drives# (at least one of the drives has never been powered down), keep fan runningnewRPM=`expr \(\($T2\<$F\)\*$RPM2\)\|\(\($RPM1 + \($RPM2 - $RPM1\)\*\($F - $T1\)\/\($T2 - $T1\)\)\&\($F\>=$T1\)\)`/bin/echo "Could not determine status for both drives, one of them is probably awake">> $LOGFILEfi/bin/echo `date`$C$F`fanspeed g`$newRPM>> $STATFILE# Set the new fan speedfanspeed w $newRPM# Write some more to logfile/bin/echo "Fanspeed: "$newRPM"rpm">> $LOGFILE/bin/echo "###############################################################">> $LOGFILE# Wait for next cycle/bin/sleep $update_intervaldone
#!/bin/sh
PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Converts Fahrenheit to Celciusf2c(){ /bin/echo `expr \(\($1 - 32\)\*10 + 9\)\/ 18`}# Converts Celcius to Fahrenheitc2f(){ /bin/echo `expr \($1\*9\)\/5\+ 32`}# Kill the old fan controllerPID=$(/bin/pidof fancontrol)if[ -n "$PID"]thenkill -9 $PIDfiupdate_interval=60#T1 and T2 in fahrenheit - convert if necessary using c2f functionT1=96T2=110IDLERPM=0RPM1=2700RPM2=3500while[1]do#Find out current temperatureT=`temperature g 0`T=${T##*=}C=`temperature g 0| grep -i -c centigrade `# Convert to Fahrenheit if output is in Celciusif[$C -gt 0]thenC=$TF=$(c2f $C)T=$FelseF=$TC=$(f2c $F)fi#Search dmesg for hard drive messagesDRIVE0_dmesg=`/bin/dmesg | /bin/grep HD0 | /bin/tail -1`DRIVE1_dmesg=`/bin/dmesg | /bin/grep HD1 | /bin/tail -1`DRIVE0_awake=`/bin/dmesg | /bin/grep HD0 | /bin/tail -1 | /bin/grep awake`DRIVE1_awake=`/bin/dmesg | /bin/grep HD1 | /bin/tail -1 | /bin/grep awake`# Calculate new fanspeed, depending on if drives are awake or notif[ -n "${DRIVE0_dmesg}"]&&[ -n "${DRIVE1_dmesg}"];then# True if dmesg contains status for both drivesif[ -n "${DRIVE0_awake}"]||[ -n "${DRIVE1_awake}"];then# True if any of the drives are awake, keep fan runningnewRPM=`expr \(\($T2\<$F\)\*$RPM2\)\|\(\($RPM1 + \($RPM2 - $RPM1\)\*\($F - $T1\)\/\($T2 - $T1\)\)\&\($F\>=$T1\)\)`else# None of the drives is awake, now check if Temperature is above $T1if[$T -gt $T1];then#Keep the fan running until the NAS has cooled downnewRPM=$RPM1else#set speed to IDLE speednewRPM=$IDLERPMfifielse# dmesg does not yet contain the status for both drives# (at least one of the drives has never been powered down), keep fan runningnewRPM=`expr \(\($T2\<$F\)\*$RPM2\)\|\(\($RPM1 + \($RPM2 - $RPM1\)\*\($F - $T1\)\/\($T2 - $T1\)\)\&\($F\>=$T1\)\)`fi# Set the new fan speedfanspeed w $newRPM# Wait for next cycle/bin/sleep $update_intervaldone
Leider funktionieren die Lüftersteuerungen bei einem RAID-System wohl nicht, da es keine Meldungen über die Abschaltung der Festplatten gibt (Ich fahre leider kein RAID, daher kann ich das noch nicht beurteilen). Ich habe daher eine zusätzliche Lüftersteuerung entwickelt, die den Lüfter unterhalb einer bestimmten Systemtemperatur abschaltet. Diese habe ich momentan auf 30°C festgesetzt. Darüber hinaus dreht der Lüfter mit 2700rpm bis 3500rpm (je nach Temperatur).
#!/bin/sh
PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Converts Fahrenheit to Celciusf2c(){ /bin/echo $(((($1-32)*10+9)/18))}# Converts Celcius to Fahrenheitc2f(){ /bin/echo $((($1*9)/5+32))}# Kill the old fan controllerPID=$(/bin/pidof fancontrol)if[ -n "$PID"]thenkill -9 $PIDfi# Checking interval in secondsupdate_interval=60# T1 and T2 in fahrenheit - convert if necessary using c2f function# Example: "T1=$(c2f 30)" will convert 30°C to FahrenheitT1=86T2=110# Idle-RPM. If you want the Fan to switch of, set this to zeroIDLERPM=0# Linearly interpolate the fan-speed between RPM1 and RPM2RPM1=2700RPM2=3500# Now loop, check status every $update_interval secondswhile[1]do# Find out current temperatureT=`temperature g 0`T=${T##*=}C=`temperature g 0| grep -i -c centigrade `# Convert to Fahrenheit if output is in Celciusif[$C -gt 0]thenT=$(c2f $T)fi# Check if Temperature is above $T1if[$T -gt $T1];then# Keep the fan runningnewRPM=$((($RPM1+($RPM2-$RPM1)*($T-$T1)/($T2-$T1))))else# Temp below T1 -> set fan to IDLE-SpeednewRPM=$IDLERPMfi fanspeed w $newRPM# wait for next cycle sleep $update_intervaldone
Das Script wid nicht im Ordner start abgelegt, sondern muss extra gestartet werden. Wenn das Skript einfach nur im Ordner start liegt, klappt die Steuerung nicht!
Die Installation kann stark vereinfachen, indem man das Skript direkt auf das NAS herunterlädt. Zunächst muss man sich einloggen, anschließend muss man je nach Festplattenanzahl den gewünschten Befehl eingeben:
Code für eine Festplatte ohne Logging:
wget http://wolf-u.li/u/167 -O /ffp/lueftersteuerung.sh
Code für zwei Festplatten mit Logging:
wget http://wolf-u.li/u/169 -O /ffp/lueftersteuerung.sh
Code für zwei Festplatten ohne Logging:
wget http://wolf-u.li/u/168 -O /ffp/lueftersteuerung.sh
Code für Temperaturabhängige Steuerung ohne Logging:
wget http://wolf-u.li/u/170 -O /ffp/lueftersteuerung.sh
Anschließend muss immer noch folgendes ausgeführt werden, sofern noch keine Lüftersteuerung installiert war. Kommt beispielsweise nur eine Festplatte hinzu oder wurden die untenstehenden Befehle bereits in das fun_plug eingefügt, sollten diese Befehle nicht mehr ausgeführt werden!
Wahlweise kann man übrigens auch den “old-school”-Weg gehen und es manuell ablegen:
Im folgenden Beispiel wird das Skript als lueftersteuerung.sh abgespeichert und über das fun_plug gestartet, daher wird folgendes am Ende des fun_plugs eingefügt: