The SMART attribute ID 194 (Temperature_Celsius) often causes confusion when it reports values that contradict physical observations. In your case, while the drive feels cool at 70°F ambient temperature, SMART shows:
194 Temperature_Celsius 0x0002 150 150 000 Old_age Always - 40 (Min/Max 20/49)
The key components in this output are:
- VALUE/WORST (150): Normalized values (manufacturer-specific scaling)
- RAW_VALUE (40): Actual temperature in Celsius
- THRESH (000): Indicates no threshold for warning
Different manufacturers implement SMART attributes differently. Western Digital drives, for example, often report temperature as:
VALUE = 255 - (actual_temp_in_C * scaling_factor)
While your Hitachi drive shows direct correlation between VALUE and RAW_VALUE.
To confirm actual temperature, use alternative tools:
# hddtemp /dev/sdb
/dev/sdb: Hitachi HDS722020ALA330: 40°C
# sudo smartctl -A -d sat /dev/sdb | grep -i temp
194 Temperature_Celsius 0x0002 150 150 000 Old_age Always - 40
While 40°C is within normal operating range (most HDDs tolerate 0-60°C), monitor these patterns:
- Sudden spikes >10°C without load changes
- Consistent readings above 55°C
- Discrepancies between multiple monitoring tools
For proactive monitoring, create a cron job with this script:
#!/bin/bash
THRESHOLD=50
TEMP=$(smartctl -A /dev/sdb | awk '/194/{print $10}')
if [ "$TEMP" -gt "$THRESHOLD" ]; then
echo "WARNING: Drive temperature $TEMP°C exceeded threshold" | mail -s "HDD Alert" admin@example.com
fi
Common causes for inaccurate readings:
- eSATA/SATA controller firmware bugs
- Drive sleep state misreporting
- SMART tool version incompatibilities (especially with older CentOS 6.x)
When SMART reports Attribute 194 (Temperature_Celsius) showing 150 while the physical drive feels cool and raw_value displays 40, we're dealing with a common interpretation issue in smartmontools. The confusion stems from how different manufacturers implement SMART attributes.
Western Digital drives often use this particular encoding scheme where:
Reported value = (100 - actual_temp) + calibration_offset
Raw_value = actual temperature in Celsius
In your case, the raw_value of 40°C makes perfect sense for an eSATA drive in a 70°F (21°C) environment.
To get the true temperature reading, always check the RAW_VALUE column:
# Alternative commands for verification:
hdparm -H /dev/sdb
smartctl -A /dev/sdb | grep -i temperature
The raw value of 40 matches physical observations, while the normalized value of 150 is meaningless in this context.
For proper monitoring scripts, always parse the raw value:
#!/bin/bash
TEMP=$(smartctl -A /dev/sdb | awk '/Temperature_Celsius/ {print $10}')
echo "Actual drive temperature: ${TEMP}°C"
This prevents false alerts from normalized values.
The older smartctl version (5.43) in CentOS 6.6 doesn't automatically decode manufacturer-specific implementations. Newer versions (6.0+) include better vendor-specific interpretation:
# On modern systems:
smartctl -d sat -A /dev/sdb
The '-d sat' flag helps with proper SATA/SAS interpretation.
Legitimate temperature warnings would show:
- RAW_VALUE exceeding 55°C for consumer drives
- Consistent upward temperature trends
- Correlated with other SMART warnings
Your drive shows none of these red flags.
For proper enterprise monitoring, use this Nagios-compatible check:
#!/bin/bash
WARN=50
CRIT=60
TEMP=$(smartctl -A /dev/$1 | awk '/Temperature_Celsius/ {print $10}')
if [ $TEMP -ge $CRIT ]; then
echo "CRITICAL: Drive $1 at ${TEMP}°C"
exit 2
elif [ $TEMP -ge $WARN ]; then
echo "WARNING: Drive $1 at ${TEMP}°C"
exit 1
else
echo "OK: Drive $1 at ${TEMP}°C"
exit 0
fi