pve-m900-1, a Lenovo M900 Tiny, is one of the small Proxmox boxes in my
homelab — it runs dev/test workloads and the NetFlow collector VM. It has no
spinning disk (single SSD), so the only moving part worth monitoring is the
fan. sensors was already showing coretemp and PECI temperatures just
fine, but no fan RPM at all — not a zero, just absent, as if the box didn’t
have a fan sensor.
The dead end: no error, just nothing
The Super I/O chip on these Tiny-series boards is a Nuvoton NCT6683, and the
matching kernel driver is nct6683 (part of lm-sensors). Normally you
modprobe nct6683, run sensors-detect, and get fan1/fan2 readings for
free. Here, modprobe nct6683 returned cleanly, but sensors still showed no
fan entry:
modprobe nct6683
sensors
# coretemp-isa-0000 and peci entries present, no nct6683 block at all
dmesg | grep -i nct6683
# (nothing)
No error message, no log line, nothing in dmesg — the module just wasn’t
registering a device. That absence of any error is the tell: this isn’t a
missing-driver problem, it’s a driver that loaded and then quietly declined
to attach to the hardware.
The cause: an EC firmware/vendor check
The nct6683 driver does a sanity check against the embedded controller’s
firmware build ID before it will bind — it’s a safety measure, since writing
to the wrong registers on an unrecognized EC build can do bad things. This
M900 Tiny’s EC firmware build (1.0 build 12/30/15) isn’t in the driver’s
list of known-good builds, so the check fails and the driver bails out with
ENODEV before ever creating the sensor device — silently, since this is
treated as “unsupported hardware,” not an error condition.
The driver exposes an escape hatch for exactly this: a force module
parameter that skips the vendor/build check and binds anyway.
modprobe -r nct6683
modprobe nct6683 force=1
sensors
With force=1, sensors immediately reports a new block with fan2 reading
a baseline of roughly 980 RPM, alongside the existing coretemp/PECI
entries.
Making it persistent
A manual modprobe force=1 doesn’t survive a reboot, and doesn’t help if
nct6683 isn’t in the auto-loaded module list at all. Two small config
files fix both:
# Force the parameter every time the module loads
echo "options nct6683 force=1" > /etc/modprobe.d/nct6683.conf
# Make sure the module actually loads at boot
echo "nct6683" >> /etc/modules
update-initramfs -u
reboot
After the reboot, sensors shows fan2 without any manual intervention —
same as it would if the driver’s built-in check had recognized the board in
the first place.
Reference
| Item | Value |
|---|---|
| Hardware | Lenovo M900 Tiny (pve-m900-1) |
| Super I/O chip | Nuvoton NCT6683 |
| Driver | nct6683 (lm-sensors) |
| Symptom | modprobe succeeds, no fan entry in sensors, nothing in dmesg |
| Root cause | EC firmware build 1.0 build 12/30/15 fails the driver’s vendor/build check → silent ENODEV |
| Fix | force=1 module parameter |
| Persistence | /etc/modprobe.d/nct6683.conf (options nct6683 force=1) + nct6683 in /etc/modules |
| Result | sensors reports fan2, ~980 RPM baseline |
If a Super I/O sensor driver loads without error but produces zero fan/temp
entries and dmesg is silent, a vendor or firmware-build allowlist check
inside the driver — not a missing driver — is worth suspecting before
anything else.
This guide was written by Claude, an AI assistant made by Anthropic, based on a hands-on troubleshooting session working through this exact problem.