Slackware 10.2 com dois kernels na mesma instalação

Descreve-se como configurar o sistema de forma a poder escolher um entre dois e possivelmente mais kernels automaticamente durante o boot. Cada um tendo suas especificidades definidas nos scripts de inicialização rc.S e rc.M. Não são descritos os passos de configuração, compilação e instalação dos kernels. Presume-se que isso já tenha sido feito pelo usuário.

[ Hits: 17.335 ]

Por: Elias Zoby em 05/12/2007 | Blog: http://concordancia.webs.com


Introdução



Autor: Elias Carlos Zoby

Toda solução nasce de um problema. Eu queria ter meu Slackware com kernel da série 2.6, pois ele é melhor e mais rápido geralmente, mas já havia usado o 2.4.31 e visto que ele era muito mais veloz nos downloads de internet discada usando o softmodem Hsp56 MR da Pctel que veio onboard na minha placa mãe Via M825 v.7.2a. Não sei se com outro hardware ocorre o mesmo.

Então eu precisava de dois kernels. Tenho o linux-2.4.31 e 2.6.22.7. Em cada um necessitava instalar o software para softmodem, respectivamente slmdm-2.7.10.tar.gz (2.7.8 também serve) e slmodem-2.9.11-20070813.tar.gz (datas anteriores da mesma versão também servem). Cada software tem sua forma de instalação, configuração do modem e uso.

Escolhi o Slackware 10.2 porque é o que possuo, mas creio que o 11 também sirva. O Slack 12 já não tolera a série linux-2.4.x, precisaria adaptações de gcc, hotpluging etc.

A escolha do kernel a inicializar é feita colocando-se os devidos comandos no "boot loader": GRUB (menu.lst), LiLo (lilo.conf) ou outro. Vide Apêndice 1.

Incompatibilidades aparentes e que precisam ser resolvidas na inicialização:

1) rc.hotplug x rc.udev, ou se usa um ou outro, Udev é melhor e mais rápido, mas requer kernel >= 2.6.15;

2) rc.modules, cada kernel precisa do seu, ou que sejam escritos comandos condicionados para cada módulo (exigindo maior trabalho e conhecimento);

3) rc.local, o software de modem para kernel 2.6 requer que alguns comandos sejam colocados nesse arquivo, mas o soft do kernel 2.4 não.

No Slack 10.2 o Udev vem sem configuração, então precisei aprender a escrever regras para ele e aproveitei para fazer upgrade para v. 111 do Slack 12. Vide Apêndice 2.

Decidi deixar /etc/rc.d/rc.modules e rc.local para o kernel 2.6.22.7. Copiei rc.modules do kernel 2.4.31 e rc.local originais do Slackware para /etc/rc.d/rc.modules-2.4.31 e rc.local-2.4.

Como não entendo nada de escrevinhação de scripts, e menos ainda de programação, procurei nos arquivos de inicialização (rc.S, rc.modules e rc.M, chamados nesta ordem durante o boot) alguns comandos que determinassem a versão do kernel e condicionassem ações à resposta obtida. Em rc.modules há, de forma descontínua, as seguintes partes:

# Determine the version of the running kernel:
RELEASE=$(uname -r)  
# Also determine a "short release" such as 2.4, 2.6, etc.  
SHORTREL=$(echo $RELEASE | cut -f 1,2 -d .)  
  
# Only load if this is a 2.4.x kernel:  
if echo $SHORTREL | grep -qw 2.4 ; then  
  /sbin/modprobe ide-scsi  
fi

Então tendo resposta às variáveis RELEASE e SHORTREL pode-se dar o comando condicionado, exemplificando em kernel 2.4:

if echo $SHORTREL | grep -qw 2.4 ; then
  faça alguma coisa  
fi

Ou pode-se condicionar à inexistência de determinada resposta:

# Enable PC speaker support for 2.6.x+:
if echo $SHORTREL | grep -qvw 2.4 ; then
  /sbin/modprobe pcspkr  
fi

A opção -v no grep é algo como "se não" ($ man grep).

Outras opções viáveis são:

# Determine the filename for kernel symbols under /proc.
# (this is ksyms on 2.4 kernels and kallsyms on newer kernels)
if [ -r /proc/ksyms ]; then
  faça alguma coisa  
elif [ -r /proc/kallsyms ]; then  
  faça alguma coisa  
fi  
  
## Check kernel version to determine module names to use  
if [ "`uname -r | cut -f 1,2 -d .`" = "2.2" ]; then  
#  # This module is for PPP support:  
  /sbin/modprobe ppp  
#else # assume 2.4 or newer
# # This module is for PPP support:
# /sbin/modprobe ppp_generic
fi

Descobertos os condicionantes necessários, optei por "uname -r" por ser mais simples (KISS).

    Próxima página

Páginas do artigo
   1. Introdução
   2. Aos scripts!
   3. Resultados e discussão
   4. Apêndice
Outros artigos deste autor

Caracteres especiais no teclado Linux: como adaptar às necessidades do escritor

Por que e como referenciar artigos nos sites de informática

Montar MP3 e pendrives USB automaticamente com Hotplug

Instalar e configurar Slackware 10.2 a 12 para um desktop

Autofs-4.1.4 para Slackware 12: Compilação, instalação, configuração

Leitura recomendada

Debian Lenny com Kernel 2.6.28 + Layer7 + Firewall

Kernel v3.x no Debian - Compilação em 7 passos práticos

IPCMSG: Comunicação inter-processos sem magia negra

Compilando o Kernel Linux

Kernel Hacking (RootKits)

  
Comentários
[1] Comentário enviado por massinha em 08/12/2007 - 23:53h

belo artigo,
porem , nao seria simples, apenas compilar o novo kernel e adicionar os arquivos corretos no lilo ou grub ( vmlinux kernel.image ..... ) ?
[]s

[2] Comentário enviado por zoby em 09/12/2007 - 23:46h

massinha

Compilar e adicionar as entradas dos kernéis ao boot loader são os primeiros e mais simples passos. Depois é que vem o assunto de que trata o artigo, basicamente resolver as 3 incompatibilidades citadas na introdução.
*********************
Apêndice 3 - Hotplug

Talvez seja possível colocar comandos "/sbin/mount" e "/sbin/umount" diretamente nos arquivos já existentes do Hotplug, mas não sei fazer. Então criei duas regras no /etc/hotplug/usb.usermap (pode ser criado se não existir) e dois scripts - /etc/hotplug/usb/mp3 e /etc/hotplug/usb/pen - para os mesmos dispositivos citados no Apêndice 2. Dei permissão de execução aos scripts mp3 e pen.

Necessário saber quais os IDs. É só plugar todos os dispositivos usb e verificar a saída de lsusb.
root@darkstar:/# lsusb
Bus 002 Device 002: ID 10d6:1100 Actions Semiconductor Co., Ltd
Bus 001 Device 003: ID 0951:1603 Kingston Technology

Conteúdo do MEU usb.usermap:
***********************
# usb module match_flags idVendor idProduct bcdDevice_lo bcdDevice_hi bDeviceClass bDeviceSubClass bDeviceProtocol bInterfaceClass bInterfaceSubClass bInterfaceProtocol driver_info
# Primeiro campo é o script ou módulo. Segundo campo match_flags: 0x0003 = dispositivos que preencham ambos os ids. Terceiro e quarto campos referem-se aos ids, precedidos de 0x.
mp3 0x0003 0x10d6 0x1100 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
pen 0x0003 0x0951 0x1603 0x0000 0x0000 0x00 0x00 0x00 0x00 0x00 0x00 0x00000000
**************************
Não pode haver quebra de linha no lugar errado, na dúvida copie o padrão do usb.distmap. São 4 linhas, começando por #, #, mp3, pen. As linhas comentadas servem apenas de ilustração.

Criados os diretórios /mnt/sda e /mnt/usb. No /etc/fstab acrescentei três linhas:
/dev/sda /mnt/sda auto noauto,users,rw 0 0
/dev/sda1 /mnt/usb auto noauto,users,rw 0 0
/dev/sdb1 /mnt/usb auto noauto,users,rw 0 0

Conteúdo de MEU mp3:
**********************
#!/bin/sh
umount /mnt/sda; sleep 1
mount /mnt/sda
***********************

Conteúdo de pen:
***********************
#!/bin/sh
umount /mnt/usb; sleep 1
mount /mnt/usb
***********************

Certifique-se de que rc.hotplug (chmod +x /etc/rc.d/rc.hotplug) tem permissão de execução, se não colocou o comando em rc.M, e reinicie o sistema.

Antes de desplugar os dispositivos, é bom desmontá-los, principalmente se acabou de gravar dados neles.

Quem não quisesse alterar o fstab, acho que poderia somente acrescentar os dispositivos (mount /dev/sda /mnt/sda) antes dos pontos de montagem. Embora, no meu caso, teria de resolver a questão do pendrive que ora é reconhecido como sda1, ora como sdb1.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts