Disclosure: essa solução é a coisa mais porca e funcional que já fiz na minha vida em manutenção de sistemas.
Background
Eu tava tendo vários problemas com meu sistema operacional do computador de mesa, que além de ter um hardware já datado (10+ anos), possuí uma placa de vídeo nvidia (GT 240) que constantemente tem me dado dor de cabeça durante quase toda minha jornada com o Linux. Acho que a única distribuição Linux que não tive muitos problemas foi o Manjaro e o Artix.
Mas então, por questão de simplicidade multiusuário – outras pessoas tem usado esse computador agora – instalei o Linux Mint desde que perdi todos meus sistemas principais – resumo de uma longa história: (2019) artix random upgrade bug caused kernel panic at boot + (2020) ransomware no windows por causa de uma criança estúpida querendo baixar fortnite.
Real problem
De toda maneira, cortando o lenga-lenga – ou uma parte dele – tenho usado Linux Mint desde então (2020) depois de fugir por alguns anos de sistemas baseado em debian/ubuntu e systemd. Por alguma razão estranha, após alguns upgrades (distro version upgrade, pensa numa parada pra dar merda! rolling release rules) eu finalmente cheguei numa versão… mais bugada ainda pra minha felicidade.
Toda vez que eu reiniciava meu computador simplesmente não funcionava mais o driver de vídeo. O X11 entrava em loop e eu se quer conseguia acionar o console via Ctrl+Alt+FN, ficava tudo travado; minha única opção era reiniciar naquele ponto ou destruir essa desgraça – brincadeira, esse computador foi o início de tudo. No fim das contas, o fluxo padrão de uso desse computador funcionava da seguinte maneira: toda vez que eu desligava, ao ligar novamente percebia que tava tudo fudido, então eu reiniciava de NOVO para então entrar no modo de recuperação, dava um jeito de acionar os serviços de rede (que depois de um tempo fazendo manualmente percebi que tinha uma OPÇÃO pra ativar pra você) e reinstalar os drivers de vídeo da nvidia com o seguinte comando:
apt install --reinstall nvidia-340
Toda vez, toda santa vez, que reiniciava ou desligava eu tinha que fazer essa merda. Claro, depois de corrigir eu reiniciava de novo. Só nisso já foi três restarts (o que deu ruim, a correção e o sistema funcionando de novo).
Sabe o que pensei? Quer saber, bora vê aqui se nesse SystemDeus tem um jeito de usar um hook pra executar um comando antes de desligar/reiniciar. Afinal, se essa porra toda sempre acontece depois de desligar, eu corrigindo antes de desligar deve funcionar, não?
Master solution
Pois então, aí vamos lá. Eu fiz o seguinte, após uma breve pesquisa e verifiquei que quase ninguém sabe direito como faz pra isso funcionar, ou quando sabe fazer funcionar não sabe porque funciona, coletando os fragmentos de conhecimentos espalhados pelas threads encontradas, escrevi o seguinte serviço em /etc/systemd/system/reinstall-drivers.service
:
[Unit] Description=Reinstall Nvidia Drivers DefaultDependencies=no Before=shutdown.target reboot.target halt.target After=network.target network-online.target Wants=network.target network-online.target [Service] ExecStart=/usr/local/bin/apt install --reinstall nvidia-340 -y Type=oneshot [Install] WantedBy=shutdown.target reboot.target halt.target
Logo então, acionei os seguintes comandos:
sudo systemctl daemon-reload sudo systemctl enable reinstall-drivers
Fiz reboot e testei. Funcionou! Fiz reboot de novo e funcionou novamente. Espero que continue funcionando. A parte chata é só a demora de cerca de 3min agora pra desligar/reiniciar, afinal toda vez vai ser reinstalado o driver de vídeo, mas é muito melhor que fazer toda essa desgraça manualmente.
Invés de ser escravo de computador, prefiro que o computador seja escravo de si mesmo.
Edit: SystemDestroyed
Post atualizado em: <2020-09-04 Fri>
Na real, essa porra de ficar reinstalando não é muito confiável. Depois de um mês e meio usando essa solução, às vezes isso funciona, às vezes não. O systemd nunca foi muito confiável, mas eu supus que pelo menos pra fazer ativação correta dos serviços poderia se confiar. Nem isso.
Às vezes os drivers eram reinstalados quando o computador desligava, mas nem sempre – também não sei o porquê isso acontecia. Além disso, se o computador fosse desligado abruptamente já era, aí não funcionaria mesmo a reinstalação no desligamento. Tentei também deixar o serviço rodando na inicialização do sistema, embora demorasse muito o computador pra desligar, iria assegurar que iria pelo menos ligar. Mas também não funcionou muito bem. ÀS VEZES funcionava.
Por esse motivo, eu resolvi usar uma propriedade do sistema dos arquivos e simplesmente marcar o atributo de imutabilidade como ativo para os arquivos de driver da nvidia. Uma solução brutal, mas que funcionou bem. Nesse caso, precisei rodar os seguinte comandos com permissão de administrador:
sudo chattr +i /lib/modules/$(uname -r)/kernel/drivers/video/nvidia_uvm.ko sudo chattr +i /lib/modules/$(uname -r)/kernel/drivers/video/fbdev/nvidia/nvidiafb.ko
Para checar se a mudança teve efeito observa-se a inclusão do atributo de imutabilidade i
via lsattr
:
lsattr /lib/modules/$(uname -r)/kernel/drivers/video/nvidia_uvm.ko lsattr /lib/modules/$(uname -r)/kernel/drivers/video/fbdev/nvidia/nvidiafb.ko
Você deve receber uma resposta similar a:
----i--------------- /lib/modules/5.4.0-42-generic/kernel/drivers/video/nvidia_uvm.ko ----i--------------- /lib/modules/5.4.0-42-generic/kernel/drivers/video/fbdev/nvidia/nvidiafb.ko
O lado negativo dessa solução é que precisarei fazer esses comandos toda vez que o kernel for atualizado. Talvez uma solução definitiva seria assegurar que um script ativa os atributos de imutabilidade dos drivers assim que são reinstalados. Mas isso é papo pra outra história.
Edit2: Definitive Solution
Post atualizado em:
Instalei outra distribuição Linux mais decente neste computador: Artix. Já venho usando essa distribuição desde 2017 e tem sido muito bom. Não vem com SystemD e é considerado um mini-fork do Arch Linux, uma distribuição rolling-release com uma ótima documentação online e também um repositório de pacotes de usuários com muitas coisas úteis: AUR.
Apesar de não existir suporte oficial para placas de vídeo NVIDIA mais legadas como a minha – GT 240 (2010) – pois os últimos drivers que a suportam é a versão 340.xx
eu consegui ter uma versão funcional do meu sistema com a instalação dos seguintes pacotes via AUR:
yay -S lib32-nvidia-340xx-utils nvidia-340xx-dkms nvidia-340xx-utils
O lib32 é necessário pra rodar alguns softwares mais legados, como o da steam.