Kernel via pacote RPM
O Mike Shigueru Matsumoto mandou este tutorial que explica como manipular o kernel nas distribuições baseadas no RPM (Red Hat, Conectiva, Mandrake...) a partir dos pacotes disponibilizados pela própria distribuidora.
Instalando
e/ou Atualizando o Kernel do Linux via pacote RPM
Autor: Mike
Shigueru Matsumoto
Emai: fuji_linux@yahoo.com.br
Data da Última Revisão: 23/07/2003
Plataforma de execução:
Conectiva 8.0 Kernel 2.4.18-3U8_4cl (atual)
Conectiva 9.0 Kernel 2.4.21-28872cl (a ser instalado)
OBS: Poderia ser qualquer outro kernel de preferência da mesma
distribuição. Inclusive um kernel mais antigo.
A preferência pelo kernel já compilado pela mesma
distribuição deve ser mantida visto que algumas
distribuições podem compilar os seus kerneis de maneira
diferente. Uma instalação de um kernel do Red Hat 8.0 no
Conectiva 8.0, causou erros na hora do boot.
Versões atualizadas do kernel da sua
distribuição podem ser encontradas no FTP oficial da sua
distribuição.
Características técnicas:
As instruções dos comandos serão dadas em negrito
para um melhor visual.
A saída do comando será mostrada em itálico.
O caractere # apenas indica que o usuário esta logado como
“root” e não deve ser escrita no Shell.
Ex:
# ls -l /
drwxr-xr-x 2 root root 4096 Jul 14 11:30 bin
drwxr-xr-x 3 root root 4096 Jul 18 08:41 boot
drwxrwxrwx 2 root root 4096 Jul 17 09:58 common
drwxr-xr-x 21 root root 53248 Jul 18 08:41 dev
drwxr-xr-x 55 root root 4096 Jul 18 09:01 etc
drwxr-xr-x 5 root root 4096 Jul 16 18:24 home
drwxr-xr-x 2 root root 4096 Mar 23 23:46 initrd
...
ATENÇÃO: Neste how-to nos vamos atualizar
o kernel, mas vamos manter o antigo kernel padrão vindo da
distribuição.
Isto é o melhor a se fazer, porque qualquer erro que
aconteça com o novo kernel, ainda poderemos iniciar a nossa
máquina pelo antigo.
Para isto vamos instalar o novo kernel usando a opção
“-i” no comando “rpm” e vamos deixar todas as entradas nos gerenciadores
de boot (GRUB / LILO) do kernel padrão do jeito que estavam.
Apenas vamos adicionar a nova.
Começando. . .
1 -) Obter o kernel de maneira correta
Antes de se baixar algum kernel em formato rpm para
instalação deve-se verificar o tipo de arquitetura do seu
computador e se ela é multi-processada.
Estas informações podem ser vistas olhando o kernel
padrão que foi instalado em sua máquina pela
própria distribuição.
No entanto, podem ser usados os seguintes passos para
identificação do mesmo:
# uname -a
Linux tux.fuji.com.br 2.4.21-28872cl #1 Sex Mar 21 22:55:39 BRT 2003
i686 unknown
Pode se observar através do comando acima os seguintes pontos:
2.4.21-28872cl kernel usado no momento
i686 arquitetura do processador
Ou seja, a arquitetura do seu processador é i686 e seu
computador provavelmente possui apenas um processador.
Se o seu computador fosse multi-processado na saída do comando
teria uma string “smp”.
Exemplo:
# uname -a
Linux tux.fuji.com.br 2.4.21-28872clsmp #1 Sex Mar 21 22:55:39
BRT 2003 i686 unknown
Você também pode obter informações sobre o
seu computador olhando os arquivos dentro do diretório /proc
do Linux.
Exemplo:
- Quantos processadores possuem na sua maquina e
informações técnicas sobre eles:
# cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 6
model : 7
model name : AMD Duron(tm) Processor
stepping : 1
cpu MHz : 1294.251
cache size : 64 KB
...
OBS: O campo “processor” define quantos processadores foram
encontrados.
Começando em: 0. O segundo processador seria: 1, o terceiro:
2 e assim por diante.
Para uma máquina multi-processada, a saída do comando
seria algo assim:
# cat /proc/cpuinfo
processor : 0 => Primeiro Processador
vendor_id : AuthenticAMD
cpu family : 6
model : 7
model name : AMD Duron(tm) Processor
stepping : 1
cpu MHz : 1294.251
cache size : 64 KB
...
processor : 1 => Segundo Processador
vendor_id : AuthenticAMD
cpu family : 6
model : 7
model name : AMD Duron(tm) Processor
stepping : 1
cpu MHz : 800.
- Total de memória:
# cat /proc/meminfo
total: used: free: shared: buffers: cached:
Mem: 113278976 112029696 1249280 0 1294336 65441792
Swap: 271392768 30695424 240697344
MemTotal: 110624 kB
...
Conclusão:
- Para uma máquina com apenas um processador e arquitetura i686,
deveria ser baixado algo parecido com:
kernel-2.4.18-14.i686.rpm
- Com mais de um processador:
kernel-2.4.18-14.i686smp.rpm
OBS: Caso não tenha certeza do tipo de arquitetura do
seu computador pode ser usado o padrão i386, algo parecido com:
kernel-2.4.18-14.i386.rpm
Os kerneis em formato “rpm” são encontrados nos FTPs das
distribuições. Eles já vêm compilados e
prontos para suportar o maior tipo de hardware possível, o que
pode evitar problemas para você que não quer compilar o
kernel.
O código fonte do kernel em “rpm” possui algo como o seguinte:
kernel-2.4.20-1.3.2.src.rpm
Você só vai precisar baixá-lo quando quiser
compilar ou adicionar algo ao seu kernel.
Cuidado para não baixar o código fonte do kernel em
vez do kernel compilado (rpm).
Olhe bem a string “src” de source.
2 -) Analisando o Estado Atual do Kernel
Como o kernel baixado é um pacote “rpm” a
instalação é igual a qualquer outro programa em
rpm.
Antes de executar a instalação verifique qual a
versão do seu kernel atual para que você não
confunda com as entradas que serão criadas.
Vamos olhar o estado do nosso sistema antes da instalação
do novo kernel:
(ATENÇÃO: ESTE PASSO É MUITO IMPORTANTE)
# ls /boot
-rw-r--r-- 1 root root 460950 Mai 29 2002
System.map-2.4.18-3U8_4cl
-rw-r--r-- 1 root root 8704 Mar 15 21:05 boot-bmp.b
-rw-r--r-- 1 root root 8704 Mar 15 21:05 boot-menu.b
-rw-r--r-- 1 root root 6656 Mar 15 21:05 boot-text.b
lrwxrwxrwx 1 root root 11 Jul 14 10:50 boot.b ->
boot-menu.b
-rw-r--r-- 1 root root 800 Mar 15 21:05 chain.b
drwxr-xr-x 3 root root 4096 Jul 16 14:14 grub
-rw-r--r-- 1 root root 333494 Jul 15 13:45
initrd-2.4.18cl.img
lrwxrwxrwx 1 root root 15 Jul 14 18:22 kernel.h ->
kernel.h-2.4.18
-rw-r--r-- 1 root root 411 Jul 14 20:49 kernel.h-2.4.18
-rw-r--r-- 1 root root 512 Mar 15 21:05 mbr.b
-rw-r--r-- 1 root root 13598 Mai 29 2002
module-info-2.4.18-3U8_4cl
-rw-r--r-- 1 root root 728 Mar 15 21:05 os2_d.b
-rw-r--r-- 1 root root 802823 Mai 29 2002
vmlinuz-2.4.18-3U8_4cl
Os principais arquivos que devem ser olhados neste momento são:
vmlinuz-2.4.18-3U8_4cl
initrd-2.4.18cl.img
Procure no arquivo de configuração do seu gerenciador de
boot (GRUB ou LILO) e veja que ele possui uma entrada que aponta para
eles.
GRUB:
# cat /boot/grub/menu.lst
title = Conectiva Linux 8 [Grafico]
kernel = (hd0,7)/boot/
vmlinuz-2.418-3U8_4cl root=/dev/hda8 5 vga=788
initrd =
(hd0,7)/boot/initrd-2.4.18cl.img
title = Conectiva Linux 8 [Modo texto]
kernel =
(hd0,7)/boot/vmlinuz-2.418-3U8_4cl root=/dev/hda8 3 vga=788
initrd =
(hd0,7)/boot/initrd-2.4.18cl.img
LILO:
# cat /etc/lilo.conf
image = /boot/vmlinuz-2.4.18-3U8_4cl
root = /dev/hda8
label = Conectiva_Linux_8
read-only
Veja que as duas entradas apontam
para o kernel atual.
3 -) Instalando o Kernel
Note que estamos usando a opção “-i” e não “-U”
para mantermos o antigo kernel, veja mais abaixo.
# rpm -ivh
kernel-2.4.21-28872cl.i686.rpm
Preparando...
########################################### [100%]
1:kernel-2.4.21 ########################################### [100%]
Se alguns problemas de dependência acontecer, vá
até o site http://rpmfind.net
e digite na caixa de pesquisa o pacote faltando mostrado pelo seu Linux
na hora da instalação.
Um pacote que será necessário é o mkinitrd-x.xx.xx
( os x.xx.xx é substituído pela versão do programa
).
Dicas: Instalação de Pacotes RPM
Para verificar se um pacote já está instalado, no caso o
“mkinitrd”:
# rpm -qa | grep mkinitrd
mkinitrd-3.2.6-29127cl
Verificar todos os pacotes instalados no seu Linux:
# rpm -qa => mostra todos os pacotes na tela
# rpm -qa > pacotes.txt => joga os nomes dos pacotes no
arquivo “pacotes.txt”
# rpm -qa | less => mostra os pacotes na tela pausadamente
# rpm -q <nomedopacote> => mostra se um pacote esta
instalado
Igual a “rpm -qa | grep
<nome_ou_string_do_pacote>”
# rpm -Uvh <nomedopacote> => atualiza um pacote
# rpm -e <nomedopacote> => desinstala um pacote
# rpm -ql <nomedopacote> => mostra onde estão os
arquivos do pacote
Quando um pacote já estiver instalado e você quiser
instalá-lo de novo por algum motivo use:
# rpm -ivh <nomedopacote> --force
Quando se tem algum problema de dependência na hora de instalar
ou remover o pacote pode ser usado:
# rpm -ivh <nomedopacote> --nodeps => Para instalar
# rpm -e <nomedopacote> --nodeps => Para desinstalar
Atenção: Note que isto pode ser uma
operação arriscada. Deixar falhas de dependências
pode trazer o não funcionamento do programa.
O ideal e sempre tentar resolver a dependência instalando-a ou
removendo-a quando for o caso.
Novamente: O site http://rpmfind.net resolve o
seu problema! Apenas lembre-se de dar preferência por baixar
pacotes da sua distribuição e da sua arquitetura.
Caso não ache para sua arquitetura pode ser usado a “i386”.
Voltando ao Kernel...
Eu acho que o único erro que pode acontecer é dizer que o
pacote “mkinitrd” não está instalado ou precisa de outra
versão.
Se não estiver instalado é fácil, instale. Se ele
estiver pedindo uma versão mais antiga que a sua, (verifique a
sua versão com as dicas acima) você pode tentar algo como:
# rpm -ivh kernel-2.4.21-28872cl.i686.rpm –nodeps
Já fiz isto antes e funcionou. Mas deixo bem claro que a minha
versão era mais atual que a pedida. Primeiro tente resolver a
dependência e não fazer este “gato”.
Verificando a Instalação do Kernel
Depois do kernel instalado você pode verificar se ele foi
instalado corretamente com os seguintes passos:
1) Verifique se foi criado o diretório de modules dele.
# ls /lib/modules
2.4.18-3U8_4cl 2.4.21-28872cl
Veja que agora eu tenho os dois kerneis.
Vamos verificar agora o que foi mudado no nosso diretório /boot.
# ls -l /boot
lrwxrwxrwx 1 root root 25 Jul 18 08:41 System.map ->
System.map-2.4.21-28872cl
-rw-r--r-- 1 root root 460950 Mai 29 2002
System.map-2.4.18-3U8_4cl
-rw-r--r-- 1 root root 487236 Mar 21 23:05
System.map-2.4.21-28872cl
...
-rw-r--r-- 1 root root 333494 Jul 15 13:45
initrd-2.4.18.img
-rw-r--r-- 1 root root 133093 Mar 21 23:10
module-info-2.4.21-28872cl
lrwxrwxrwx 1 root root 22 Jul 16 11:04 vmlinuz ->
vmlinuz-2.4.21-28872cl
-rw-r--r-- 1 root root 802823 Mai 29 2002
vmlinuz-2.4.18-3U8_4cl
-rw-r--r-- 1 root root 926852 Mar 21 23:05
vmlinuz-2.4.21-28872cl
Muito bom!!!
Veja que foram criadas novas entradas referente ao novo kernel.
O vmlinuz-2.4.21-28872cl é a imagem do seu novo
kernel. Note que foi criado um link simbólico com o nome de “vmlinuz”que
aponta para a nova imagem. Este link é criado para facilitar a
criação da nova entrada do kernel no GRUB ou LILO.
Continuando a Configuração
Agora tudo que precisamos é criar o “initrd” deste novo
kernel. Para isto vamos criar com o comando “mkinitrd”, por isso
a necessidade do pacote instalado.
Sintaxe do comando:
# mkinitrd <nome_do_arquivo_a_ser_criado>
<nome_do_kernel_alvo>
Mais informações:
# mkinitrd - - help
# man mkinitrd
No nosso how-to, o comando ficaria assim:
# mkinitrd /boot/initrd-2.4.21-28872cl.img
2.4.21-28872cl
O programa “mkinitrd” recebe 2 parâmetros:
- o nome do arquivo que será criado, no caso
/boot/initrd-2.4.21-28872cl.img
- e o nome do kernel 2.4.21-28872cl
Note que já aproveitamos para criar o arquivo “initrd-2.4.21-28872cl.img”
dentro do diretório “/boot”.
Já o nome do kernel é o mesmo nome do diretório
criado dentro de “/lib/modules” quando instalamos o kernel.
Verifique com:
# ls /lib/modules
2.4.18-3U8_4cl 2.4.21-28872cl
Verifique se o arquivo foi gerado corretamente:
# ls -l /boot
-rw-r--r-- 1 root root 460950 Mai 29 2002
System.map-2.4.18-3U8_4cl
-rw-r--r-- 1 root root 8704 Mar 15 21:05 boot-bmp.b
-rw-r--r-- 1 root root 8704 Mar 15 21:05 boot-menu.b
-rw-r--r-- 1 root root 6656 Mar 15 21:05 boot-text.b
lrwxrwxrwx 1 root root 11 Jul 14 10:50 boot.b ->
boot-menu.b
-rw-r--r-- 1 root root 800 Mar 15 21:05 chain.b
drwxr-xr-x 3 root root 4096 Jul 16 14:14 grub
-rw-r--r-- 1 root root 459090 Jul 14 11:35
initrd-2.4.21-28872cl.img
-rw-r--r-- 1 root root 333494 Jul 15 13:45
initrd-2.4.18cl.img
lrwxrwxrwx 1 root root 15 Jul 14 18:22 kernel.h ->
kernel.h-2.4.18
-rw-r--r-- 1 root root 411 Jul 14 20:49 kernel.h-2.4.18
-rw-r--r-- 1 root root 512 Mar 15 21:05 mbr.b
-rw-r--r-- 1 root root 13598 Mai 29 2002
module-info-2.4.18-3U8_4cl
-rw-r--r-- 1 root root 728 Mar 15 21:05 os2_d.b
-rw-r--r-- 1 root root 802823 Mai 29 2002
vmlinuz-2.4.18-3U8_4cl
4 -) Atualizando o GRUB ou LILO
Tudo que falta agora e atualizar o GRUB ou LILO.
Segue-se o exemplo de como ficaria o dois tomando por base os arquivos
de configuração que foram mostrados no início.
GRUB:
# cat /boot/grub/menu.lst
title = Conectiva Linux 8 [Grafico]
kernel = (hd0,7)/boot/ vmlinuz-2.418-3U8_4cl root=/dev/hda8 5 vga=788
initrd = (hd0,7)/boot/initrd-2.4.18.img
title = Conectiva Linux 9 [Texto]
=> NOVA ENTRADA
kernel =
(hd0,7)/boot/ vmlinuz-2.4.21-28872cl root=/dev/hda8 5 vga=788
initrd =
(hd0,7)/boot/initrd-2.4.21-28872cl.img
title = Conectiva Linux 8 [Modo texto]
kernel = (hd0,7)/boot/vmlinuz-2.418-3U8_4cl root=/dev/hda8 3 vga=788
initrd = (hd0,7)/boot/initrd-2.4.18.img
Veja que apenas copiei uma entrada padrão e alterei para os
arquivos do novo kernel.
A linha abaixo;
kernel = (hd0,7)/boot/
vmlinuz-2.4.21-28872cl root=/dev/hda8 5 vga=788
também poderia ter sido escrita apenas assim:
kernel = (hd0,7)/boot/ vmlinuz
root=/dev/hda8 5 vga=788
Isto porque no diretório “/boot” tem um link
simbólico chamado “vmlinuz” que aponta para esta entrada.
LILO:
# cat /etc/lilo.conf
image = /boot/vmlinuz-2.4.18-3U8_4cl
root = /dev/hda8
label = Conectiva_Linux_8
read-only
image = /boot/vmlinuz
=> NOVA ENTRADA
root = /dev/hda8
label = Conectiva_Linux_9
read-only
Note que agora eu usei o nome do link em vez do nome completo da
imagem.
Lembre-se que depois de alterar o Lilo /etc/lilo.conf é
necessário rodar o comando “lilo” para atualizar a nova entrada:
# lilo
Added Conectiva_Linux_8 *
Added Conectiva_Linux_9
“Pronto!!! Agora reinicie seu computador para ver os resultados, e
lembre-se de usar o comando “uname -a” para verificar qual kernel
está ativo depois do reboot.”
Notas finais: Se o novo kernel estiver funcionando corretamente
(faça o teste pelo menos uma semana), placas de sons, rede,
vídeo, servidores, impressoras, etc, você pode remover o
antigo kernel.
Para isto apenas remova o pacote do antigo kernel, # rpm –e
<nomedopacotedokernelantigo>, e retire as entradas para ele
no seu GRUB ou LILO.