Il controllo della ventola è una funzionalità esposta dal kernel, non un hack. Serve solo sapere che esiste.

Stai girando un modello LLM locale. Il processore sale di temperatura, il firmware attiva il throttling, le frequenze scendono. Il lavoro pesante viene fatto più lentamente proprio quando ti serve il massimo.

La soluzione è forzare la ventola al massimo per tutta la sessione. Su Linux il kernel lo permette già — basta sapere dove mettere le mani.


Il file che controlla tutto#

Il modulo thinkpad_acpi espone il controllo della ventola in un file:

/proc/acpi/ibm/fan

Leggerlo mostra lo stato attuale:

cat /proc/acpi/ibm/fan
status:         enabled
speed:          2156
level:          auto
commands:       level <level> (<level> is 0-7, auto, disengaged, full-speed)

Scriverci cambia il comportamento. Il livello disengaged toglie il controllo al firmware e porta la ventola a piena velocità — circa 800 RPM in più rispetto al massimo controllato. Su sessioni AI sostenute, quei giri fanno la differenza: la temperatura si stabilizza invece di salire lentamente.


Il problema del crash ogni 120 secondi#

Se provi a impostare level disengaged e lasciarlo lì, su Ubuntu il sistema va giù ogni ~120 secondi.

Il BIOS del T480 ha un watchdog termico: se non riceve segnali di vita dal modulo entro ~120 secondi, interpreta il silenzio come un guasto e forza un reset del subsistema thermal.

La soluzione è un loop che rinnova il comando ogni 60 secondi — abbastanza frequente da tenere vivo il watchdog.


La soluzione#

Tre righe:

echo "level disengaged" | sudo tee /proc/acpi/ibm/fan
while true; do
  echo "level disengaged" | sudo tee /proc/acpi/ibm/fan > /dev/null
  sleep 60
done

Per fermare e ripristinare il controllo automatico:

echo "level auto" | sudo tee /proc/acpi/ibm/fan

Versione comoda — il comando ice#

Per non riscrivere ogni volta, questa funzione va aggiunta al ~/.bashrc:

ice() {
    echo "level disengaged" | sudo tee /proc/acpi/ibm/fan > /dev/null
    echo "Ventola al massimo — premi Esc per fermare"
    while true; do
        echo "level disengaged" | sudo tee /proc/acpi/ibm/fan > /dev/null
        if read -r -s -n 1 -t 60 key && [[ "$key" == $'\x1b' ]]; then
            break
        fi
    done
    echo "level auto" | sudo tee /proc/acpi/ibm/fan > /dev/null
    echo "Ventola → auto"
}
# Aggiunge la funzione e ricarica la configurazione
cat ice_alias.sh >> ~/.bashrc && source ~/.bashrc

Da quel momento:

  • ice — ventola al massimo, refresh automatico ogni 60s
  • Esc — ripristino auto, sessione terminata

Prerequisito: fan_control=1#

Per funzionare, il modulo thinkpad_acpi deve essere caricato con fan_control=1. Verifica:

cat /sys/module/thinkpad_acpi/parameters/fan_control

Se risponde Y sei a posto. Se risponde N:

# Configurazione permanente
echo "options thinkpad_acpi fan_control=1" | sudo tee /etc/modprobe.d/thinkpad.conf

# Ricarica il modulo nella sessione corrente
sudo rmmod thinkpad_acpi && sudo modprobe thinkpad_acpi fan_control=1

Se rmmod fallisce per dipendenze, basta riavviare — al prossimo boot il modulo si carica già con il parametro corretto.