The short answer
Device: /dev/nvme0, Critical Warning (0x02): Temperature is one of the most alarming-looking lines a home server can email you, and one of the least dangerous. 0x02 is a single bit in a single byte. It means the drive’s composite temperature is currently outside its threshold band. Nothing more.
Three facts resolve almost every case:
- It is a live state, not a latched fault. The NVMe specification defines bit 1 as “temperature is above an over temperature threshold or below an under temperature threshold” — present tense. A drive reporting
0x00right now is not hot right now. - smartd remembers. The alert you are reading was generated by the smartd daemon, which keeps its own state and repeats the warning every 24 hours. A drive can be cool and still be emailed about.
- The truth is in two cumulative counters.
Warning Composite Temperature TimeandCritical Composite Temperature Timecount minutes spent above each threshold. They are the only evidence of an excursion you did not personally watch.
So the workflow is: read the current value, read the two counters, compare the two temperature sensors, then decide. Everything below is that workflow with real numbers attached.
1. Where the alert comes from
The message does not come from the drive. It comes from smartd, the monitoring daemon in the smartmontools package, which polls devices on a schedule and mails warnings through the exec hook configured in /etc/smartd.conf. The stock Debian and Proxmox configuration ships a single scan line:
DEVICESCAN -d removable -n standby -m root -M exec /usr/share/smartmontools/smartd-runnerThe full alert that reaches an administrator’s inbox looks like this:
This message was generated by the smartd daemon running on:
host name: pve
The following warning/error was logged by the smartd daemon:
Device: /dev/nvme0, Critical Warning (0x02): Temperature
Device info: Samsung SSD 980 1TB, S/N:xxxx, FW:2B4QFXO7, 1.00 TB
For details see host's SYSLOG.
The original message about this issue was sent at Tue Sep 6 12:25:29 2022 CEST
Another message will be sent in 24 hours if the problem persists.Two details in that text matter. The subject line reports the device path (/dev/nvme0), not a fault code. And the trailing line confirms the repeat behaviour: smartd will keep mailing until its remembered condition clears. That is why a one-off heat event from a failed air conditioner can generate weeks of mail after the room is cool again.
2. The Critical Warning bitmap
The Critical Warning field is byte 0 of the NVMe SMART/Health Information log (log identifier 02h). Each of the first five bits is an independent condition, and multiple bits can be set at the same time — 0x03 means spare and temperature together, because the values are OR-ed. The definitions below are identical across the Intel SSD 750 Series product specification, the Seagate Nytro 5000 product manual and the smartmontools source as explained by its maintainers on the project mailing list.
| Bit | Hex | Specification wording | Severity | First action |
|---|---|---|---|---|
| 0 | 0x01 | Available spare has fallen below the available spare threshold | High | Plan replacement, verify backups |
| 1 | 0x02 | Temperature is above an over temperature threshold or below an under temperature threshold | Low–medium | Read the temperature counters, check airflow |
| 2 | 0x04 | NVM subsystem reliability has been degraded | Critical | Back up immediately, replace |
| 3 | 0x08 | Media has been placed in read only mode | Critical | Migrate data now; the drive accepts no writes |
| 4 | 0x10 | Volatile memory backup device has failed | Critical | Replace; in-flight writes are at risk |
| 5–7 | 0x20–0x80 | Reserved | — | Treat as unknown, never guess |
The relative severity is the point. 0x02 is the only bit in that table that a fan can fix. Every other set bit describes physical degradation or a failed protection mechanism, where the correct response is evacuation rather than cooling.
One trap: a value that sets bit 5, 6 or 7 makes smartctl print “unknown critical warning(s)”. The byte is then genuinely unreadable by the tool, not merely unusual — capture the raw log rather than trusting the summary line.
3. Two temperatures, two counters, and one threshold pair
NVMe health reporting separates now from how long. Confusing the two is what makes 0x02 feel like a mystery.
| Field | Unit | What it measures | Tells you |
|---|---|---|---|
| Temperature | °C | Composite temperature at read time | Whether the drive is hot right now |
| Temperature Sensor 1 / 2 | °C | Individual sensor readings | Whether one sensor is lying |
| Warning Composite Temperature Time | minutes | Cumulative time at or above WCTEMP and below CCTEMP | Whether a real excursion happened |
| Critical Composite Temperature Time | minutes | Cumulative time at or above CCTEMP | Whether the drive ever hit its danger threshold |
| WCTEMP / CCTEMP | °C | Vendor warning and critical thresholds | Where the drive’s own limits actually sit |
Both time counters are cumulative over the life of the drive and are stored in the SMART log at bytes 192 and 196. They never reset on their own. A drive that spent one bad night in a hot room carries that number forever, which is exactly what makes them useful — and exactly why they cannot tell you whether the problem is ongoing.
WCTEMP and CCTEMP are set by the vendor, not by the specification, so you must read them from your own drive. A Samsung SSD 980 1TB reports Warning Comp. Temp. Threshold: 82 Celsius and Critical Comp. Temp. Threshold: 85 Celsius. A 3 °C band between the two is normal, and it explains why Critical Composite Temperature Time is frequently zero while Warning Composite Temperature Time is in the hundreds: drives throttle long before they reach the critical threshold.
4. A clean capture from our own test unit
This is the internal drive of our Beelink EQi12 test unit, captured with smartctl 7.5 on 2026-07-11. The full text is published in our measurement data repository under storage/EQi12_InternalSSD_SMART_2026-07-11.txt.
| Field | Value | Reading |
|---|---|---|
| Device | WD PC SN540 SDDPNPF-512G, 512,110,190,592 bytes, NVMe 1.4 | Entry-level OEM client drive |
| SMART overall-health | PASSED | Self-assessment only; it is not a warranty |
| Critical Warning | 0x00 | No condition set |
| Temperature | 38 °C | Comfortable, well under any client threshold |
| Temperature Sensor 1 / 2 | 38 °C / 38 °C | Zero spread — both sensors agree |
| Available Spare / Threshold | 100% / 10% | Untouched spare pool |
| Percentage Used | 0% | Endurance barely consumed |
| Data Units Read | 1,442,327 [738 GB] | — |
| Data Units Written | 1,433,247 [733 GB] | Heavy for 89 power-on hours — benchmarking, not production |
| Host Read / Write Commands | 11,224,216 / 15,737,413 | Write-heavy workload |
| Controller Busy Time | 46 minutes | Low duty cycle |
| Power Cycles / Power On Hours | 10 / 89 | Essentially new |
| Unsafe Shutdowns | 2 | Worth watching: 2 of 10 cycles lost power without notice |
| Media and Data Integrity Errors | 0 | The field that actually matters |
| Error Information Log Entries | 0 | No logged errors |
| Warning / Critical Composite Temperature Time | 0 / 0 | Never thermally stressed, ever |
Two honesty notes, because they are the difference between evidence and decoration. First, this archived capture does not contain WCTEMP or CCTEMP — our log line did not include the Identify Controller block, so we do not publish numbers we did not read. Second, the sustained 50 GiB transfer run performed minutes earlier recorded this explicitly:
Temperature/SMART detail: unavailable because Storage Reliability Counter access was denied; do not infer temperature.That is the discipline this site runs on. A missing counter is reported as missing. On that run the same drive measured 623.29 MiB/s sustained write and 468.2 MiB/s full read, details of which are on the EQi12 SSD and USB port evidence page.
The Unsafe Shutdowns: 2 line is the one item we would act on. Two unannounced power losses in ten cycles on a host that was only being benchmarked points at cabling, a loose adapter or an abrupt OS shutdown — not at the drive.
5. Two documented 0x02 alerts, two completely different causes
Neither of these is ours. Both are publicly documented cases, and together they cover the overwhelming majority of real 0x02 reports.
| Case A: latched alert | Case B: bad sensor | |
|---|---|---|
| Device | Samsung SSD 980 1TB, FW 2B4QFXO7 | Samsung SSD 980 500GB |
| Reported by | Proxmox forum thread, March 2024 | r/homelab community thread |
| Current Critical Warning | 0x00 | 0x02 |
| Current temperature | 43 °C | 84 °C (sensor 1) |
| Temperature Sensor 1 / 2 | 43 °C / 47 °C | 84 °C / 19 °C |
| Warning Composite Temp. Time | 748 minutes | — |
| Critical Composite Temp. Time | 0 minutes | — |
| Root cause | Real past excursion (HVAC failure); daemon state never cleared | Firmware defect in temperature reporting |
| Correct action | Restart smartd; no hardware change | Update drive firmware |
Case A is the classic false alarm that was once true. The room overheated, the drive spent 748 minutes above its 82 °C warning threshold, and cooling was restored. The drive is fine: 0x00, 43 °C, zero media errors, zero critical temperature minutes. But smartd’s remembered state survives reboots, so the mail kept arriving daily. The fix is a daemon restart, not a new SSD.
Case B is the more dangerous one, because the drive genuinely reports 0x02 continuously. The tell is the sensor spread: 84 °C on sensor 1 against 19 °C on sensor 2 is not a thermal gradient, it is a broken reading. No 65 °C delta exists across a 22 mm-wide M.2 module. The resolution reported in the community is a firmware update from the vendor’s support tool.
The general rule falls straight out of Case B: compare the sensors before you buy a heatsink. A spread beyond roughly 10–15 °C on a client M.2 drive is a reporting fault, not a cooling fault.
6. The triage decision tree
Run these in order. Stop as soon as a branch resolves.
1. Read Critical Warning
├─ 0x04, 0x08 or 0x10 set → STOP. Back up now. Replace the drive.
├─ 0x01 set → Check Available Spare vs threshold. Plan replacement.
└─ 0x02 only → continue
2. Read current Temperature
├─ At/above WCTEMP right now → Real, active thermal problem. Go to step 5.
└─ Below WCTEMP → Not hot now. Continue.
3. Read Warning & Critical Composite Temperature Time
├─ Both 0 → No excursion ever recorded.
│ → Suspect firmware or a transient read error. Check sensor spread (step 4).
├─ Warning > 0, Critical 0 → A past, non-critical excursion. Fix cooling, then clear daemon state.
└─ Critical > 0 → The drive exceeded CCTEMP. Treat as real. Check media errors.
4. Compare Temperature Sensor 1 vs Sensor 2
├─ Spread > ~15 °C → Reporting fault. Update firmware. Do not buy cooling.
└─ Spread small → The reading is trustworthy. Continue.
5. Read Media and Data Integrity Errors + Error Information Log Entries
├─ Both 0 → Cooling problem only. No data lost yet.
└─ Either > 0 → Thermal damage may have occurred. Back up and plan replacement.
6. Fix cause, then verify
├─ Restore airflow / move the drive out of a hot enclosure
├─ Restart smartd to clear remembered state
└─ Re-read after one full workload cycle. Warning time must stop climbing.Symptom-to-action, condensed:
| Symptom | Likely cause | Action |
|---|---|---|
0x02 but 0x00 on re-read, warning time > 0 | Past excursion, latched daemon state | Fix airflow, restart smartd |
0x02 continuously, both counters 0, sensor spread large | Firmware reporting defect | Update drive firmware |
0x02 continuously, temperature genuinely above WCTEMP | Active cooling failure | Improve airflow, add contact heatsink, re-measure |
| Critical Composite Temperature Time > 0 | Sustained over-threshold operation | Back up, then decide on replacement |
| Any of the above with media errors > 0 | Thermal or media damage | Replace; do not return to service |
7. Commands
Capture the full report. -x includes the NVMe log pages that -a may summarise:
sudo smartctl -x /dev/nvme0The vendor-neutral equivalent, useful when smartctl is not installed:
sudo nvme smart-log /dev/nvme0Extract only the fields this article depends on:
sudo smartctl -x /dev/nvme0 | grep -Ei \
'Critical Warning|Temperature|Available Spare|Percentage Used|Media and Data|Error Information Log|Power On Hours|Unsafe Shutdowns'Confirm thresholds for your specific drive — never assume another model’s numbers:
sudo smartctl -x /dev/nvme0 | grep -Ei 'Comp\. Temp\. Threshold'Clear a latched smartd alert on Debian, Ubuntu or Proxmox:
sudo systemctl restart smartd
sudo systemctl status smartd --no-pagerStop smartd from re-alerting on stale temperature history while keeping real failures monitored. Add an explicit device line to /etc/smartd.conf rather than relying on DEVICESCAN, and track temperature changes instead of absolute values:
/dev/nvme0 -a -W 5,55,70 -m root -M exec /usr/share/smartmontools/smartd-runner-W 5,55,70 reports raw temperature changes of 5 °C or more, logs at 55 °C, and escalates at 70 °C. Pick the last two against your own WCTEMP, not against ours.
Keep dated snapshots, because one report cannot show a trend:
# /etc/cron.weekly/smart-snapshot
#!/bin/sh
d=/var/log/smart; mkdir -p "$d"
for dev in /dev/nvme[0-9]; do
[ -e "$dev" ] || continue
smartctl -x "$dev" > "$d/$(basename "$dev")-$(date +%F).txt"
doneRedact serial numbers before posting any of this publicly. smartctl prints them by default, and they are the only field in a health report with no diagnostic value to the person reading it.
8. What this looks like on a healthy Mini PC
Mini PCs concentrate heat by design, so the question is not whether a home server NVMe runs warm, but where it settles. Our EQi12 unit sits at 38 °C on both sensors with zero cumulative warning minutes after sustained 50 GiB write and read passes — measured on a drive mounted inside a chassis smaller than a paperback. That is the result worth comparing against, and it is why we publish the raw log rather than a green health icon.
If your drive sits above 70 °C at idle, the fix is almost always physical: unblock the intake, move the unit off a heat-generating neighbour, or add an M.2 contact heatsink with actual thermal contact. Throttling will protect the drive long before 0x02 becomes a media error, but a drive that throttles is a drive that is not delivering the throughput you measured on day one.
For the other half of the picture — sustained throughput, port-by-port USB behaviour and how NVMe, USB and network compare for real workloads — see the NVMe vs USB SSD vs network share comparison. If your concern is redundancy rather than a single drive’s health, the ZFS and RAID capacity planning guide picks up where drive health ends. Long-run behaviour, including what to log over a 12-hour soak, is covered in the EQi12 stability test. And if throughput collapsed at the same time the temperature warning appeared, rule out the interface first with the USB SSD stuck at 40 MB/s fix.
Paste any report — yours or ours — into the SMART and NVMe health report explainer to extract the fields that matter. It runs entirely in your browser. Our measurement method documents how captures like the one above are taken, what is redacted, and why some counters are published as unavailable instead of estimated.