If you’re like me, you might live in close proximity to a lot of unracked servers and switches. I recently acquired a Dell R610 that was due for recycling, but found I couldn’t put it anywhere without the fans disturbing me. Some people claim theirs is nearly silent. They must have found a magic BIOS because I have had no luck using means provided by Dell.
There is a way to alter the fan speeds manually, despite what you’ll find on Dell forums. You can write fan speed percentages directly to the fan controller on these devices! As a server, these things might be outdated and inefficient, but as a homelab they can be a workhorse.
Before you start, you should know that this isn’t something you should do to a production server. I’m just some guy on the internet. Use your best judgement.
Make sure you’ve got access to the iDRAC, and have enabled IPMI over LAN during POST. I would also recommend installing lm-sensors for monitoring the temperatures OS side.
Starting with ipmitool
Search the repos of your favorite Linux distro for ipmitool. If you can’t find it, you can grab the latest release.
Every command you pass to IPMI over LAN will start with this as the prefix.
$ ipmitool -I lanplus -H [iDRAC IP] -U root -P [iDRAC password]
[command]
If you’re trying to control fans from the host, and not from a separate device, it’s a little simpler. You don’t need all the options, and can just use ipmitool.
$ ipmitool
[command]
Run the following to test your connection
$ ipmitool -I lanplus -H [iDRAC IP] -U root -P [iDRAC password] chassis status
or
$ ipmitool chassis status
Toggle Manual Fan Control
Manual fan control must first be enabled. Heed my warning though. If you manually set your fan speed, the server will no longer be able to manage the fan speed to keep an optimal temperature. By enabling this you have the potential to cause damage to your equipment.
Manual fan control enable:
raw 0x30 0x30 0x01 0x00
Manual fan control disable:
raw 0x30 0x30 0x01 0x01
Setting Static Speed
The last hexadecimal value is the fan’s speed measured in percent of max. 0x14 = 20%, 0x32 = 50%, etc.
20%:
raw 0x30 0x30 0x02 0xff 0x14
Monitoring Temperatures
It’s a good idea to monitor your temperatures when you make changes to your fan speed.
$ watch sensors
Bash Script
Now you’re able to control your fan speed. Congrats! Feel free to use this script to change it dynamically.
#!/bin/bash
TIMESTAMP="[`date +%Y-%m-%d_%H:%M:%S`]"
CPUTEMP=$(sensors -u | grep input | awk '{print $2}' | sort -r | head -1)
SYSTEMP=$(ipmitool sdr type temperature |grep Ambient |grep degrees |grep -Po '\d{2}' | tail -1)
CLIMIT=90
SLIMIT=35
FANHOST="Dell R610"
# determines fan speed based on CPUTEMP
fanSpeed() {
if [[ $CPUTEMP > $CLIMIT ]] || [[ $SYSTEMP > $SLIMIT ]]; then
# release fan control to server
ipmitool raw 0x30 0x30 0x01 0x01
echo "$TIMESTAMP CPUTEMP critical. Releasing fan controls to $FANHOST."
elif [[ $CPUTEMP > 80 ]]; then
setFans 50
elif [[ $CPUTEMP > 70 ]]; then
setFans 45
elif [[ $CPUTEMP > 60 ]]; then
setFans 30
elif [[ $CPUTEMP > 50 ]]; then
setFans 20
elif [[ $CPUTEMP > 40 ]]; then
setFans 15
elif [[ $CPUTEMP > 30 ]]; then
setFans 10
#elif [[ $CPUTEMP > 20 ]]; then
# setFans 10
else setFans 7
fi
}
# percentage -> fan speed
# receives appropriate fan speed, sends to fan controller as hexidecimal
setFans() {
ipmitool raw 0x30 0x30 0x01 0x00
echo "$TIMESTAMP Setting fans to $1%" >> ./log
ipmitool raw 0x30 0x30 0x02 0xff 0x$(echo "obase=16; $1" | bc)
}
# BEGIN
#echo "$TIMESTAMP Script Start" >> ./log
echo "$TIMESTAMP CPU $CPUTEMP°C - AMB $SYSTEMP°C" >> ./log
fanSpeed
# echo "$TIMESTAMP Script End" >> ./log