Respeitável público do Viva o
Linux, aqui começa mais uma Dica do Dino®, trazendo entretenimento para toda a família!
Hoje, nós vamos aprender a corrigir um erro razoavelmente irritante que pode acontecer ao atualizar o kernel do seu verdadeiro
GNU/Linux via
slackpkg.
Já vi isso acontecendo duas vezes e nas duas, a solução demandou um pouco de trabalho manual para resolver. Para tanto, você precisa apenas de um disco de inicialização do verdadeiro GNU/Linux.
Cenário do problema
Após atualizar pacotes que possuam novos arquivos de configuração, o
slackpkg pergunta ao usuário se ele pretende manter os arquivos de configuração antigos, atualizá-los com os novos ou decidir mais tarde.
Normalmente, é seguro manter as configurações antigas, mas quando o assunto é kernel, a coisa muda de figura. Basicamente, como já ensinou
"Bob" Dobbs:
"Não se pode inicializar kernels novos com configurações antigas, pois as configurações antigas quebrarão o kernel novo e a inicialização se derramará pelo chão" (exceto de "O mundo vai acabar amanhã e você pode morrer", sem tradução para o português, escrito pelo maior vendedor de todos os tempos, J. R. "Bob" Dobbs)."
Entretanto, o
slackpkg, às vezes, ignora que o usuário escolheu usar as novas configurações e o resultado é um sistema que inicializa até a tela de login, mas sem nenhum módulo levantado, sendo impossível usar o teclado até mesmo para um "three finger salute" (
Ctrl+Alt+Del nas palavras do Cara).
Resumindo: você está com um sistema quebrado.
Para resolver o problema você precisará de:
- O DVD ou o CD1 de instalação do Slackware;
- Algum conhecimento de terminal;
- Alguma intimidade com o vi (seja o elvis, o vi padrão do Slack, seja com o Vim mesmo);
E, sacrificar um bode e uma galinha preta em homenagem ao Dino®, caso você seja um clicador assumido.
Modo de fazer
Inicie o seu computador pelo DVD de instalação do Slackware. Na tela em que o ISOLINUX pergunta qual kernel você quer usar para inicializar, dê
Enter normalmente.
Escolha o teclado que seja de acordo com a sua situação (
querty-br-abnt2 para teclados brasileiros, ou
querty-us-acentos para teclados padrão americano) e faça login como root. Até aqui, você apenas seguiu as instruções escritas na tela, então, não deve ter experimentado maiores problemas.
O próximo passo é montar todas as suas partições em
/mnt, conforme elas seriam montadas caso o sistema inicializasse normalmente. Por exemplo, no meu Dell Inspiron (aquele que já quebrou meu pé, que meus gatos já usaram como banheiro e ainda assim funciona virado no capeta com uptimes médios de sete semanas), o particionamento está assim:
- /dev/sda1 para SWAP;
- /dev/sda2 montado em /boot;
- /dev/sda3 montado em /;
- /dev/sda5 montado em /home.
A primeira coisa sempre, é montar o
/, então, o primeiro comando no meu cenário, é:
# mount /dev/sda3 /mnt
Depois, monte as demais partições. No meu cenário, fica assim:
# mount /dev/sda2 /mnt/boot
# mount /dev/sda5 /mnt/home
Pelos exemplos, é evidente que você deverá montar seu
/ em
/mnt e as demais partições em seus respectivos pontos de montagem.
Hora de ativar a SWAP. No meu cenário, fica assim:
# swapon /dev/sda1
É interessante notar que todos os comandos aqui, devem ser passados sem opções, visto que no ISOLINUX eles são versões simplificadas daqueles aos quais estamos acostumados.
Após montar todas as partições, vamos ao começo do trabalho que separa um verdadeiro GNU/Linuxer dos usuários das demais distros.
Para editar as configurações do sistema instalado, use primeiramente o comando:
# chroot /mnt
O terminal vai compreender que você está usando o Slackware instalado no seu disco rígido e não o instalador do ISOLINUX. Isso é extremamente importante para os próximos passos, principalmente na hora de reinstalar o LILO. Agora, vamos acertar as configurações do seu verdadeiro GNU/Linux.
O primeiro passo é saber qual é o kernel instalado de fato. Esta distinção é importante para o segundo passo. Para tanto, o comando:
# ls -l /boot
Basta. No meu cenário ele retorna:
-rw-r--r-- 1 root root 512 Jul 26 16:47 boot.0800
-rw-r--r-- 1 root root 137 Jul 26 16:46 boot_message.txt
-rw-r--r-- 1 root root 220070 Set 11 20:22 catboot.bmp
lrwxrwxrwx 1 root root 19 Set 14 13:19 config -> config-huge-3.14.18
-rw-r--r-- 1 root root 142496 Set 9 00:46 config-generic-3.14.18
-rw-r--r-- 1 root root 142496 Set 9 00:52 config-huge-3.14.18
-rwxr-xr-x 1 root root 217646 Jan 10 2011 elilo-ia32.efi*
-rwxr-xr-x 1 root root 250510 Jan 10 2011 elilo-x86_64.efi*
-rw-r--r-- 1 root root 5590032 Set 14 13:23 initrd.gz
drwxr-xr-x 14 root root 4096 Set 14 13:23 initrd-tree/
-rw-r--r-- 1 root root 22578 Out 27 2013 inside.bmp
drwx------ 2 root root 16384 Jul 26 15:37 lost+found/
-rw------- 1 root root 397312 Set 15 18:25 map
-rw-r--r-- 1 root root 6878 Out 27 2013 onlyblue.bmp
lrwxrwxrwx 1 root root 37 Jul 26 15:43 README.initrd -> /usr/doc/mkinitrd-1.4.8/README.initrd
-rw-r--r-- 1 root root 15634 Mar 27 2011 slack.bmp
lrwxrwxrwx 1 root root 23 Set 15 18:25 System.map -> System.map-huge-3.14.18
-rw-r--r-- 1 root root 2418149 Set 9 00:46 System.map-generic-3.14.18
-rw-r--r-- 1 root root 3617277 Set 9 00:52 System.map-huge-3.14.18
-rw-r--r-- 1 root root 33192 Out 27 2013 tuxlogo.bmp
lrwxrwxrwx 1 root root 20 Set 14 13:20 vmlinuz -> vmlinuz-huge-3.14.18
lrwxrwxrwx 1 root root 23 Set 14 13:24 vmlinuz-generic -> vmlinuz-generic-3.14.18
-rw-r--r-- 1 root root 3681296 Set 9 00:46 vmlinuz-generic-3.14.18
lrwxrwxrwx 1 root root 20 Set 14 13:19 vmlinuz-huge -> vmlinuz-huge-3.14.18
-rw-r--r-- 1 root root 6705024 Set 9 00:52 vmlinuz-huge-3.14.18
Se você tiver mais de um kernel instalado, vai ver mais de um
config-generic,
config-huge, etc. Os números após os diversos config e vmlinuz, indicam a versão do kernel instalado.
Vamos acertar as configurações começando por aqui, recriando os vínculos simbólicos corretos. No meu cenário os comandos, em que uso o kernel 3.14.18, os comandos ficam:
# cd /boot
# ln -sf System.map-huge-3.14-18 System.map
# ln -sf config-huge-3.14.18 config
# ln -sf vmlinuz-huge-3.14.18 vmlinuz
# ln -sf vmlinuz-huge-3.14.18 vmlinuz-huge
# ln -sf vmlinuz-generic-3.14-18 vmlinuz-generic
O segundo passo é acertar o
rc.modules. Localizado em
/etc/rc.d, este script é o responsável por carregar os módulos apropriados ao kernel instalado em seu sistema. Para verificar como a situação está, rode o comando:
# ls -l /etc/rc.d/rc.modules*
Você deve ter uma saída similar a essa:
lrwxrwxrwx 1 root root 18 Set 14 13:21 /etc/rc.d/rc.modules -> rc.modules-3.14.18*
-rwxr-xr-x 1 root root 35406 Out 23 2013 /etc/rc.d/rc.modules-3.10.17*
-rwxr-xr-x 1 root root 35406 Jul 23 15:42 /etc/rc.d/rc.modules-3.14.13*
-rwxr-xr-x 1 root root 35406 Ago 8 01:04 /etc/rc.d/rc.modules-3.14.16*
-rwxr-xr-x 1 root root 35406 Ago 25 16:11 /etc/rc.d/rc.modules-3.14.17*
-rwxr-xr-x 1 root root 35406 Set 9 00:47 /etc/rc.d/rc.modules-3.14.18*
Lembrando que esse é o meu cenário, o retorno desse comando no seu computador pode variar. Você precisa criar o vínculo simbólico correto correspondendo à versão do kernel que você escolheu usar anteriormente.
Assim, no meu cenário o comando fica:
# cd /etc/rc.d/
# ln -sf rc.modules-3.14.18 rc.modules
O próximo passo é obrigatório, apenas se você usa o kernel genérico. Será preciso recriar o
/boot/initrd.gz. No meu cenário, o comando:
# mkinitrd -c -k 3.14.18 -f ext4 -r /dev/sda3 -m usbhid:hid_generic:mbcache:jbd2:ext4:ext2 -u -o /boot/initrd.gz
Resolve, visto que meu
/boot é formatado em
ext2 por questões de compatibilidade geral. Não é possível usar o
/usr/share/mkinitrd/mkinitrd_command_generator porque em
chroot, você não carrega realmente os módulos do sistema instalado, então, você deverá criar o comando na mão, ou reinicializar o computador e resolver o kernel genérico depois.
Reinstalação do LILO
O último passo, obrigatório em qualquer circunstância, é reinstalar o LILO.
Verifique em
/etc/lilo.conf se a imagem de inicialização do
kernel-huge aponta para
/boot/vmlinuz. Ou seja, se a parte do LILO responsável pela inicialização do
kernel-huge, tem uma linha:
image = /boot/vmlinuz
...e verifique se a linha
image da parte que inicializa o
kernel-generic aponta para a versão correta do kernel. Edite o que for necessário, e então, reinstale o LILO:
# lilo -v
Adicione uma camada de verbosidade, apenas para ser informado caso aconteça um erro. Não havendo erros, basta reinicializar o computador, desta vez pelo sistema instalado no disco rígido.
Explicando o procedimento
No Slackware, os arquivos
/boot/config,
/boot/vmlinuz,
/boot/vmlinuz-huge,
/boot/vmlinuz-generic e
/boot/System.map, são vínculos simbólicos para os verdadeiros arquivos de configuração de inicialização da distribuição.
Isso fica em nome da simplicidade: o LILO é instruído a olhar para esses arquivos (parâmetro "image", por exemplo) e assim, o arquivo de configuração
/etc/lilo.conf pode ser mantido o mesmo, não importa a versão do kernel instalada.
O arquivo
/etc/rc.d/rc.modules contém os módulos com respectivas configurações necessárias para inicializar o sistema operacional, e é um vínculo simbólico pelas mesmas razões apresentadas.
A atualização do kernel via
slackpkg, normalmente, atualiza esses vínculos simbólicos, mas no caso dessa atualização não ocorrer, basta recorrer a mais esta Dica do Dino® para resolver o problema.
Conclusão
E com essa, eu encerro mais esta Dica do Dino® nas nuvens do cachimbo doido que sobem por trás do bambuzal, perguntando se elas me fazem bem ou me fazem mal, mas, jamais duvidando de "Bob" Dobbs como mensageiro do Slack Original.
E quanto a vocês, compilações longas e prósperas!