Como Habilitar as Ventoinhas (Fans) da NVIDIA na Inicialização (GNOME + X11)
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! ❤️🍻