Notas preliminares:i) A abreviatura
GPU significa
Graphics Processing Unit, que significa "Unidade de Processamento Gráfico". Trata-se de uma expressão genérica: pode referir-se a uma placa de vídeo PCI, ou a uma placa de vídeo AGP, ou a uma placa de vídeo ISA, ou a uma placa de vídeo PCI Express, ou referir-se a algum chip gráfico instalado diretamente na placa-mãe (
motherboard) do seu computador, ou mesmo referir-se a um pequeno circuito integrado, de processamento gráfico, que se encontre embutido no processador (CPU) do seu computador. Muitos dos recentes processadores da Intel possuem uma GPU embutida.
ii) O computador que possui duas ou mais GPU é denominado "computador híbrido" ou "computador com
gráficos híbridos". Os computadores híbridos geralmente têm uma GPU Intel no processador, mas além disso têm uma GPU (da marca AMD/ATI ou então da marca Nvidia) instalada na placa-mãe, o que pode ser ou um chip de uma GPU
onboard ou então uma placa GPU conectada a algum
slot da placa-mãe.
iii) Utilizarei a palavra
*Ubuntu para me referir a todas as (ou a qualquer uma das) versões do sistema operacional suportado pela empresa
Canonical:
Ubuntu,
XUbuntu,
KUbuntu etc.
iv) O
kernel é o núcleo do Linux. Sem o kernel, não existe sistema operacional. Durante o
boot (a inicialização do sistema operacional), o kernel Linux inicializa diversos
módulos do kernel (abreviadamente chamados de
módulos). Os módulos do kernel são essencialmente pequenos arquivos com extensão
.ko (abreviatura de
kernel object, que significa "objeto do kernel"). Os módulos que são ligados ao kernel complementam o kernel, tornando-o capaz de executar mais funções. Atualmente, muitos
drivers de dispositivo são módulos do kernel: esses
drivers são vinculados ao kernel durante o
boot, de modo que cada dispositivo do seu computador encontre o
driver necessário para poder funcionar (cada
driver possibilita a interação de um dispositivo com o kernel Linux).
A quem este pequeno tutorial pode interessar:Este tutorial provavelmente interessará a quem possua computador com ao menos uma GPU da fabricante AMD e esteja se deparando com um cenário no qual o *Ubuntu "congela" durante o processamento de gráficos 3D. Esse tipo de problema tem sido bastante recorrente em computadores híbridos em que a GPU embutida no processador é da fabricante Intel mas a GPU externa é da fabricante AMD.
O lançamento dos *Ubuntu 16.04, por exemplo, trouxe muitas novidades, inclusive a ausência de suporte dos kernels versão
4.4.X ao
driver gráfico proprietário
fglrx, desenvolvido pela
AMD. Por causa disso, nos *Ubuntu 16.04 iniciais (versão 16.04.1) o proprietário de um computador que possua ao menos uma GPU da AMD terá de utilizar um destes dois
drivers gráficos de código aberto:
amdgpu e
radeon. Esses
drivers são automaticamente instalados e ativados quando você instala o *Ubuntu 16.04 num computador que possua alguma GPU da AMD: durante o
boot, o kernel Linux automaticamente identifica qual GPU AMD seu computador possui e então seleciona o módulo que deve ser inicializado (o kernel inicializa
somente um dos dois
drivers: ou o
driver radeon, que foi desenvolvido para alguns modelos de GPU da AMD, ou então o
driver amdgpu, que foi desenvolvido para os demais modelos). No meu notebook, por exemplo (um Dell Inspiron 5548 com XUbuntu 16.04 de 64 bits), o módulo em execução é o arquivo
amdgpu.ko.
O problema:Embora o *Ubuntu 16.04.1 venha com kernel versão 4.4.X, que não dá suporte ao
driver fglrx (o que nos obriga a usar o módulo amdgpu/radeon, automaticamente instalado pelo *Ubuntu 16.04.1), os kernels das séries
4.4.X e
4.5.X possuem um
bug que faz com que o
driver amdgpu/
radeon seja inicializado de maneira errada: o kernel acaba apontando para um ponteiro inválido (porque não foi ainda criado) e daí surge um
kernel panic ("pânico do kernel") que provoca o completo travamento / congelamento do sistema operacional, e aí o jeito é desligar o computador "no dedo" (pressionando o botão
power / "liga-desliga").
Inclusive, há tópicos relacionados a este assunto em que usuários indicam ativar a função
nomodeset, no GRUB. No entanto, isso é
contraindicado porque tornará o desempenho gráfico em 3D extremamente lento, além de geralmente inutilizar as saídas HDMI. Há também quem proponha adicionar os
drivers amdgpu e
radeon à
blacklist ("lista negra" de módulos do kernel), o que fará com que esses
drivers não sejam inicializados pelo kernel, mas isso também é
contraindicado porque o
driver fglrx não funciona com esses kernels mais novos. Consequentemente, se o usuário desativar aqueles dois
drivers o sistema operacional ficará sem
driver para a GPU da AMD, o que resultará em "tela preta" e impossibilidade de usar o computador, além de que
o problema não está nos drivers amdgpu/radeon, mas sim nos kernels 4.4.X e 4.5.X.
Alguns
benchmarks (testes de desempenho) realizados com 5 diferentes GPU da AMD, para comparar a diferença de desempenho gráfico entre o *Ubuntu 14.04 com
driver fglrx e o *Ubuntu 16.04 com
driver amdgpu/radeon, indicaram que no uso cotidiano da interface gráfica do Linux os
drivers amdgpu/radeon apresentaram desempenho superior ao do
driver fglrx (fonte:
http://www.phoronix.com/scan.php?page=article&item=ubuntu-1604-amd&num=2), portanto não fique triste por ter de usar um
driver de código aberto no lugar do
driver proprietário.
A solução:A solução recomendada para acabar com os congelamentos / travamentos /
kernel panics consiste em
instalar um kernel estável¹ da série 4.6.X ou posterior, pois os kernels dessas séries não possuem esse bug. Neste tutorial, explicarei como instalar o kernel
4.14.14 (versão posterior à 4.6.X) , que é o que eu utilizo desde 15/12/2017 e recomendo por atualmente ser a mais recente versão estável do kernel Linux que eu já testei por várias semanas, no meu próprio computador, sem detectar problema nenhum. Além disso, neste tutorial eu também explico como instalar o kernel
4.7.10, já que ele é superestável e eu o usei por 14 meses, sem vivenciar problema nenhum.
Se o kernel 4.14.14 não ajudar você, experimente o kernel 4.7.10.
IMPORTANTE: SEU SISTEMA TRAVA/CONGELA ANTES QUE VOCÊ POSSA USAR ESTE TUTORIAL? Então primeiro
desabilite o KMS (e depois volte para cá).
Passo-a-passo para instalação do kernel 4.7.14:
1) O primeiro passo consiste em executar o supercomando abaixo. Esse supercomando² automaticamente identificará a arquitetura do seu sistema operacional (32 bits ou 64 bits) e o tipo de kernel atualmente utilizado pelo seu sistema (
generic/"genérico" ou
lowlatency/"baixa latência") e, com base nessas duas informações, obterá os arquivos do kernel 4.14.14 apropriados para seu computador e os instalarão, e em seguida
reiniciará o seu computador, portanto não se assuste quando seu computador reiniciar.
Enfim: abra uma janela do emulador de terminal do shell e execute este supercomando:
if [ `uname -a |grep -io generic` = "generic" ]; then meukernel=generic; else meukernel=lowlatency; fi; wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.14/linux-headers-4.14.14-041414_4.14.14-041414.201801201219_all.deb -O /tmp/41414all.deb; if [ `getconf LONG_BIT` == 64 ]; then sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.14/linux-headers-4.14.14-041414-`echo $meukernel`_4.14.14-041414.201801201219_amd64.deb -O /tmp/41414headers.deb; sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.14/linux-image-4.14.14-041414-`echo $meukernel`_4.14.14-041414.201801201219_amd64.deb -O /tmp/41414image.deb; else sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.14/linux-headers-4.14.14-041414-`echo $meukernel`_4.14.14-041414.201801201219_i386.deb -O /tmp/41414headers.deb; sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.14.14/linux-image-4.14.14-041414-`echo $meukernel`_4.14.14-041414.201801201219_i386.deb -O /tmp/41414image.deb; fi; sudo dpkg -i /tmp/41414*.deb; sudo update-grub ; sudo telinit 6
2) Agora que seu computador obteve e instalou o kernel 4.14.14, atualizou o GRUB (gerenciador de boot do Linux) e reiniciou o sistema, é hora de executar o comando abaixo para confirmar que seu sistema está executando o kernel
4.14.14:
uname -r
Caso o resultado do comando acima inicie com
4.14.14, parabéns: seu sistema está executando o kernel versão 4.14.14 e o GRUB está inicializando esse kernel por padrão.
Se o comando acima informar que seu sistema Linux continua, por padrão, executando um kernel cuja versão é
posterior à do kernel que você instalou com ajuda deste tutorial, leia
este post para aprender a definir
temporariamente o kernel deste tutorial como sendo o kernel que deverá ser usado pelo seu sistema. Após seu sistema executar ("boot" / inicializar) o kernel que foi instalado com auxílio deste tutorial, execute os testes explicados no
item 3 deste tutorial para verificar se o kernel que você instalou resolveu seu problema. Se o tal kernel
não resolveu o problema, ok: basta
reiniciar o computador que o sistema voltará a usar o kernel padrão, ao invés de usar o kernel que você instalou manualmente seguindo este tutorial...
...mas, caso o kernel instalado com ajuda deste tutorial resolva o seu problema, então leia
este outro post para saber como fazer para definir esse "kernel bom" como sendo o kernel padrão do seu sistema (kernel padrão = kernel que o seu sistema sempre inicializará, automaticamente).
3) Depois que você conseguir inicializar o Linux com o kernel que você instalou com ajuda deste tutorial, retorne ao emulador de terminal do shell e execute o comando abaixo:
DRI_PRIME=1 glxgears
Esse comando executa um programa que testa o processamento gráfico 3D. Se as engrenagens surgirem e ficarem girando, e se mesmo assim seu sistema não "congelar", eis aí uma confirmação de que o
bug não está mais presente. Mas você pode fazer outros testes: deixe as engrenagens girando lá e, enquanto isso, execute algum jogo que use gráficos em 3D, ou algum descanso de tela (alguma proteção de tela) que use gráficos em 3D. Observe o comportamento do seu computador e repare que o desempenho gráfico melhorou significativamente.
CASO VOCÊ PREFIRA INSTALAR O KERNEL 4.7.10......então
não execute o supercomando do item 1 e,
no lugar dele, execute este supercomando:
if [ `uname -a |grep -io generic` = "generic" ]; then meukernel=generic; else meukernel=lowlatency; fi; wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.10/linux-headers-4.7.10-040710_4.7.10-040710.201610220847_all.deb -O /tmp/4710all.deb; if [ `getconf LONG_BIT` == 64 ]; then sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.10/linux-headers-4.7.10-040710-`echo $meukernel`_4.7.10-040710.201610220847_amd64.deb -O /tmp/4710headers.deb; sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.10/linux-image-4.7.10-040710-`echo $meukernel`_4.7.10-040710.201610220847_amd64.deb -O /tmp/4710image.deb; else sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.10/linux-headers-4.7.10-040710-`echo $meukernel`_4.7.10-040710.201610220847_i386.deb -O /tmp/4710headers.deb; sudo wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.7.10/linux-image-4.7.10-040710-`echo $meukernel`_4.7.10-040710.201610220847_i386.deb -O /tmp/4710image.deb; fi; sudo dpkg -i /tmp/4710*.deb; sudo update-grub ; sudo telinit 6
...e, após seu computador reiniciar, execute as orientações dos itens
2 e
3.
Quando você se convencer de que está livre do
bug, feche a janela do emulador de terminal e retome sua rotina.
COMO DESINSTALAR O KERNEL:
IMPORTANTE:
seu sistema precisa ter ao menos um kernel instalado. Conforme explicado lá no início do tutorial, o kernel é o núcleo do sistema. Portanto, caso você desinstale
todos os kernels do seu sistema, não haverá mais sistema operacional! Enfim:
certifique-se de deixar ao menos um kernel instalado, para você poder continuar conseguindo inicializar o Linux do seu computador.
Caso queira ver quais são todos os kernels atualmente instalados em seu sistema, execute este comando, no terminal do shell:
ls -lx /lib/modules/
Ok: agora que o aviso foi dado, caso queira desinstalar um dos (ou mais) kernels que você instalou com ajuda deste tutorial, retorne ao terminal do shell e execute o(s) comando(s) abaixo, conforme sua necessidade:
D1) Para desinstalar o kernel versão
4.7.10, execute este comando:
sudo apt-get purge linux-*-4.7.10* -y
D2) Para desinstalar o kernel versão
4.14.14, execute este comando:
sudo apt-get purge linux-*-4.14.14* -y
D3) Regra geral, para desinstalar um kernel qualquer, da versão
A.B.C, execute este comando:
sudo apt-get purge linux-*-A.B.C* -y
...sendo que, no comando acima (mencionado no item D3), você obviamente deverá substituir as letras A, B e C pelos respectivos algarismos que compõem o número de versão do kernel que você deseja desinstalar.
Restou alguma dúvida? Publique um comentário neste tópico.
Notas de rodapé:¹ Por
kernel estável da série 4.6.X entenda isto: qualquer kernel do repositório
Mainline cuja numeração de versão inicie com
4.6 e não possua o texto
rc (abreviação de
release candidate ou "candidato ao lançamento", que significa que o kernel não é estável mas está em fase final de testes para o próximo lançamento). De acordo com o repositório Mainline, os kernels estáveis da versão 4.6 são estes:
4.6.7,
4.6.6,
4.6.5,
4.6.4,
4.6.3-yakkety,
4.6.2-yakkety,
4.6.1-yakkety e
4.6-yakkety.
² Um supercomando é uma concatenação (combinação) de vários comandos do shell em uma única linha de comando. Embora sejam "compridos", os supercomandos têm a vantagem de fazer "tudo de uma vez", deste modo economizando a execução de comandos individualmente, ao longo de diversas etapas que eventualmente podem acabar sendo cansativas. Um supercomando também é útil para automatizar algumas tarefas, e esse é o caso do supercomando utilizado neste tutorial: ele automaticamente identifica a arquitetura do seu sistema operacional e o tipo de kernel padrão em uso pelo seu sistema para, a partir daí, definir qual deverá ser o tipo e a arquitetura do kernel a ser obtido e instalado.