Como Habilitar as Ventoinhas (Fans) da NVIDIA na Inicialização (GNOME + X11)

10/05/2026   •   Hardware, Linux, Debian

O Problema a ser resolvido!

Se você utiliza o driver proprietário da NVIDIA no Linux e tenta definir a velocidade das ventoinhas (fans) automaticamente durante a inicialização do sistema, é muito comum se deparar com o seguinte erro no log do sistema:

ERROR: Error assigning value 1 to attribute 'GPUFanControlState' (Ryzen:0[gpu:0]) as specified in assignment '[gpu:0]/GPUFanControlState=1' (Operation not permitted for the current user).

Esse erro ocorre em ambientes desktop (como o GNOME 48 rodando sob X11) porque o comando nvidia-settings precisa se comunicar com o servidor gráfico. Durante o boot, ou quando executado através de um serviço em background como root, as variáveis de ambiente necessárias (DISPLAY e XAUTHORITY) ainda não estão devidamente configuradas ou acessíveis.

A solução? Criar um script inteligente que aguarda o servidor gráfico inicializar, captura essas variáveis e, em seguida, um serviço do systemd para orquestrar essa execução de forma automática.

1º Passo: Criando o script de ativação

Vamos criar o script e salvá-lo em um local apropriado do sistema (/usr/local/bin/). Ele ficará encarregado de verificar ativamente quando o Xorg está pronto.

Abra o terminal e crie o arquivo:

sudo nano /usr/local/bin/enable-nvidia-fans.sh

Cole o seguinte conteúdo dentro do arquivo:

#!/bin/bash
set -euo pipefail

# Tempo máximo de espera (segundos) para o X aparecer
MAX_WAIT=360
SLEEP_INTERVAL=1
elapsed=0

# Função para tentar descobrir DISPLAY e XAUTHORITY
function find_display_and_xauth() {
  # Procura processos Xorg ou X que pertençam a um usuário gráfico
  for pid in $(pgrep -x Xorg || true); do
    # tenta ler DISPLAY e XAUTHORITY do ambiente do processo Xorg
    if [ -r /proc/$pid/environ ]; then
      env=$(tr '\0' '\n' < /proc/$pid/environ)
      display=$(echo "$env" | awk -F= '/^DISPLAY=/{print $2; exit}')
      xauth=$(echo "$env" | awk -F= '/^XAUTHORITY=/{print $2; exit}')
      if [ -n "$display" ]; then
        echo "$display|$xauth"
        return 0
      fi
    fi
  done

  # fallback: procura sessões X em /run/user/*/gdm or user's .Xauthority
  for xauthfile in /run/user/*/gdm/Xauthority /home/*/.Xauthority /var/run/gdm/auth-for-*/database; do
    if [ -e "$xauthfile" ]; then
      # assume DISPLAY :0 por fallback
      echo ":0|$xauthfile"
      return 0
    fi
  done

  return 1
}

# Espera até o X aparecer ou timeout
while [ $elapsed -lt $MAX_WAIT ]; do
  if result=$(find_display_and_xauth); then
    DISPLAY_VAL=${result%%|*}
    XAUTH_VAL=${result#*|}
    
    # Se XAUTH_VAL for vazio, tenta caminhos comuns
    if [ -z "$XAUTH_VAL" ] || [ "$XAUTH_VAL" = "$DISPLAY_VAL" ]; then
      # tenta localizar .Xauthority do usuário que tem sessão ativa
      user=$(who | awk '/:0/{print $1; exit}' || true)
      if [ -n "$user" ] && [ -e "/home/$user/.Xauthority" ]; then
        XAUTH_VAL="/home/$user/.Xauthority"
      fi
    fi

    # Se ainda vazio, tenta /run/user/1000/gdm/Xauthority
    if [ -z "$XAUTH_VAL" ] && [ -e "/run/user/1000/gdm/Xauthority" ]; then
      XAUTH_VAL="/run/user/1000/gdm/Xauthority"
    fi

    # Exporta e executa o comando
    export DISPLAY="$DISPLAY_VAL"
    if [ -n "$XAUTH_VAL" ]; then
      export XAUTHORITY="$XAUTH_VAL"
    fi

    # Comando real (ajuste velocidades conforme necessário)
    /usr/bin/nvidia-settings -a [gpu:0]/GPUFanControlState=1 \
                             -a [fan:0]/GPUTargetFanSpeed=50 \
                             -a [fan:1]/GPUTargetFanSpeed=50

    exit 0
  fi

  sleep $SLEEP_INTERVAL
  elapsed=$((elapsed + SLEEP_INTERVAL))
done

echo "enable-nvidia-fans: timeout waiting for X server" >&2
exit 1

Salve o arquivo. É imprescindível transformar esse script num executável para que o sistema consiga rodá-lo:

sudo chmod +x /usr/local/bin/enable-nvidia-fans.sh

2º Passo: Registrar o Serviço no Systemd

Para automatizar o processo, criaremos um serviço no systemd. Esse serviço vai garantir que o nosso script seja chamado na hora exata — logo após o gerenciador de exibição (Display Manager, como o GDM3) subir.

Crie o arquivo de configuração do serviço:

sudo nano /etc/systemd/system/fan.service

E cole o seguinte conteúdo:

[Unit]
Description=Enable Nvidia fan control after display manager
After=display-manager.service
Wants=display-manager.service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/enable-nvidia-fans.sh
TimeoutStartSec=120
RemainAfterExit=yes

[Install]
WantedBy=graphical.target

Salve e feche o arquivo.

3º Passo: Habilitar o Serviço

Por fim, precisamos dizer ao sistema operacional que esse novo serviço existe e que ele deve ser iniciado automaticamente junto com o PC.

Execute a seguinte sequência de comandos no terminal:

# Recarrega as configurações do systemd para encontrar o novo arquivo
sudo systemctl daemon-reload

# Habilita o serviço para iniciar no boot
sudo systemctl enable fan.service

# (Opcional) Inicia o serviço agora sem precisar reiniciar o computador
sudo systemctl start fan.service

Se quiser confirmar se deu tudo certo e se o script rodou sem erros, basta verificar o status do serviço:

sudo systemctl status fan.service

Finalizando

Pronto! Agora o erro Operation not permitted não vai mais ocorrer durante a incialização. Seu script aguarda tranquilamente em background até o servidor X11 liberar as variáveis de ambiente necessárias e, de forma transparente, ajusta as velocidades das ventoinhas para manter a temperatura da sua GPU sob controle.

Abraços! ❤️🍻


Voltar para o Blog