FreeBSD provides modules for reading motherboard temperatures on late model Intel (Core Duo) and AMD CPUs. The modules can be found in /boot/kernel as coretemp.ko and amdtemp.ko respectfully. Use kdload to install the appropriate module and sysctl to access the temperature values.
$> kldload coretemp # amdtemp
$> sysctl -a | grep -i temperature
For my motherboard I need to go a little more old school and use mbmon (MotherBoard Monitor). pfSense does not include the mbmon package by default so we need to install it. Unfortunately I got the following error when I tried installing mbmon:
$> pkg_add -r mbmon
Error: Unable to get ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.1-release/Latest/mbmon.tbz: File unavailable (e.g., file not found, no access)
pkg_add: unable to fetch 'ftp://ftp.freebsd.org/pub/FreeBSD/ports/i386/packages-8.1-release/Latest/mbmon.tbz' by URL
Looks like 8.1-release is no longer maintained on the main FreeBSD package site. A little quick reading and I found the answer in the pfSense documentation.
$> pkg_add -r ftp://ftp-archive.freebsd.org/pub/FreeBSD-Archive/ports/i386/packages-8.1-release/Latest/mbmon.tbz
$> rehash
$> mbmon
ioctl(smb0:open): No such file or directory
No Hardware Monitor found!!
InitMBInfo: Bad file descriptor
The "No Hardware Monitor found!!!" indicates that I don't have some needed modules loaded for it to be able to read the hardware. I found the modules in /boot/kernel and loaded them.
$> kldload ichsmb
$> kldload smbus
$> kldstat
Id Refs Address Size Name
1 8 0xc0400000 117c18c kernel
3 2 0xc5350000 2000 smbus.ko
5 1 0xc5355000 3000 smb.ko
6 1 0xc535e000 4000 ichsmb.ko
$> mbmon -r -c1
Temp.= 21.0, 26.2, 22.5; Rot.= 0, 1380, 0
Vcore = 1.50, 1.48; Volt. = 3.36, 5.15, 12.07, 0.00, 0.00
Success!
To get the modules to load automatically on boot add the following to /boot/loader.conf.local. Using loader.conf.local will allow the changes to persist after a pfSense update.
ichsmb_load="YES"
smb_load="YES"
Searching through pfSense php files I noticed that the framework for handling temperature is already there, we just need to provide the implementation.
Open /usr/local/www/includes/functions.inc.php, search for the function has_temp() and modify it to return true.
Replace the contents of get_temp() with:
Now save the file and go to the pfSense dashboard in your browser
System Information widget w/ Temperature |
Not too shabby, but with a few modifications, we can show all the temperature values returned from mbmon.
Modify the get_temp() function to be
Then edit /usr/local/www/widgets/widgets/system_information.widget.php and search for where has_temp() is called. The code snippet will look similar to the following depending on your pfSense version:
Change it to be
I simply added a foreach to loop through the returned temperature array.
System Information widget w/ multiple Temperatures |
Enjoy!
nice article.. thanks for taking time to post this. i was able to use amdtemp, and version 2.1 just required returning true for 'has_temp'.
ReplyDeleteThanks for that tip!
ReplyDeletepfsense 2.2.* has "Thermal Sensors" widget. You can use it for display temperature information from mbmon with minimal change. You must change in file /usr/local/www/widgets/include/thermal_sensors.inc function for this:
function getThermalSensorsData() {
//$_gb = exec("/sbin/sysctl -a | grep temperature", $dfout);
$_gb = exec("/usr/local/bin/mbmon -r -c1 | grep TEMP", $dfout);
$thermalSensorsData = join("|", $dfout);
return $thermalSensorsData;
}
...and after that standard "Thermal Sensors" widget will show you temperature values from mbmon.