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.348 ]

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


Aos scripts!



Quando possível, prefiro sempre comentar (#) uma linha que não desejo executada do que suprimí-la.

E faço backup dos arquivos originais.

Todos os arquivos modificados ou criados em /etc/rc.d devem ter permissão de execução (chmod +x nome) para funcionarem.

Cada "if" requer um "fi" para terminá-lo, com espaçamento correspondente.

Não sei se a formatação do VOL manterá os espaços corretos no início das linhas dos scripts, se não, pois ela tende a colocar todo caractere de começo de linha na primeira coluna, deve-se saber que o if na linha de baixo deve ser colocado *após* a coluna do if precedente, e cada fi deve ficar na mesma coluna de seu if. Para maior clareza é só verificar os arquivos originais da distribuição.

No rc.S modifiquei as seções correspondentes, que ficaram:

# Initialize udev to manage /dev entries for 2.6.x kernels:
# Only load if this is a 2.6.x kernel:  
if [ "`uname -r | cut -f 1,2 -d .`" = "2.6" ]; then  
  if [ -x /etc/rc.d/rc.udev ]; then  
#  if ! grep -w nohotplug /proc/cmdline 1> /dev/null 2> /dev/null ; then  
    /bin/sh /etc/rc.d/rc.udev start  
  fi  
fi  
  
# This loads any kernel modules that are needed. These might    
# be required to use your ethernet card, sound card, or other  
# optional hardware.  
# Only load if this is a 2.6.x kernel:  
if [ "`uname -r | cut -f 1,2 -d .`" = "2.6" ]; then  
  if [ -x /etc/rc.d/rc.modules -a -r /proc/modules ]; then  
   . /etc/rc.d/rc.modules  
  fi  
fi  
  
# Only load if this is a 2.4.x kernel:  
if [ "`uname -r | cut -f 1,2 -d .`" = "2.4" ]; then  
  if [ -x /etc/rc.d/rc.modules-2.4.31 -a -r /proc/modules ];  
then  
   . /etc/rc.d/rc.modules-2.4.31  
  fi  
fi  

Em rc.M, carregamento do rc.hotplug, rc.alsa e do rc.local. Desativei o ALSA para o kernel 2.4.31 porque as versões para 2.4 e 2.6 são diferentes. Coloquei o rc.hotplug e rc.alsa para serem carregados em segundo plano (&), não pode ser feito o mesmo com rc.udev.

# Initialize the hotplugging subsystem for Cardbus, IEEE1394, PCI, and USB devices:
if [ "`uname -r | cut -f 1,2 -d .`" = "2.4" ]; then  
  if [ -x /etc/rc.d/rc.hotplug -a -r /proc/modules ]; then  
  # Don't run hotplug if 'nohotplug' was given at boot.  
    if ! grep nohotplug /proc/cmdline 1> /dev/null 2> /dev/null ; then  
    echo "Activating hardware detection:  /etc/rc.d/rc.hotplug  
start"  
    . /etc/rc.d/rc.hotplug start &  
    fi  
  fi  
fi  
  
# Load ALSA (sound) defaults:  
if [ "`uname -r | cut -f 1,2 -d .`" = "2.6" ]; then  
  if [ -x /etc/rc.d/rc.alsa ]; then  
  . /etc/rc.d/rc.alsa &  
  fi  
fi  
  
# Start the local setup procedure.  
# Only load if this is a 2.6 kernel:  
if [ "`uname -r | cut -f 1,2 -d .`" = "2.6" ]; then  
  if [ -x /etc/rc.d/rc.local ]; then  
  . /etc/rc.d/rc.local  
  fi  
fi  
  
# Only load if this is a 2.4 kernel:  
if [ "`uname -r | cut -f 1,2 -d .`" = "2.4" ]; then  
  if [ -x /etc/rc.d/rc.local-2.4 ]; then  
  . /etc/rc.d/rc.local-2.4  
  fi  
fi

Poderia, ao invés, usar as variáveis RELEASE e SHORTREL, quase da mesma forma no rc.S e rc.M. Os resultados foram os mesmos.

# Initialize udev to manage /dev entries for 2.6.x kernels:
# Only load if this is a 2.6.x kernel:
# 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 .)  
if echo $SHORTREL | grep -qw 2.6 ; then  
  if [ -x /etc/rc.d/rc.udev ]; then  
#  if ! grep -w nohotplug /proc/cmdline 1> /dev/null 2> /dev/null ; then  
    /bin/sh /etc/rc.d/rc.udev start  
  fi  
fi  
  
# This loads any kernel modules that are needed. These might be  
# required to use your ethernet card, sound card, or    
# other optional hardware.  
# Only load if this is a 2.6.x kernel:  
if echo $SHORTREL | grep -qw 2.6 ; then  
  if [ -x /etc/rc.d/rc.modules -a -r /proc/modules ]; then  
   . /etc/rc.d/rc.modules  
  fi  
fi  
  
# Only load if this is a 2.4.x kernel:  
if echo $SHORTREL | grep -qw 2.4 ; then  
  if [ -x /etc/rc.d/rc.modules-2.4.31 -a -r /proc/modules ];  
then  
   . /etc/rc.d/rc.modules-2.4.31  
  fi  
fi

Colocar em rc.M, imediatamente antes do carregamento de rc.hotplug e depois nas partes referentes ao rc.alsa e rc.local:

# 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.6 kernel:  
if echo $SHORTREL | grep -qw 2.6 ; then  
  /bin/chmod -x /etc/rc.d/rc.hotplug &  
fi  
  
# Only load if this is a 2.4 kernel:  
if echo $SHORTREL | grep -qw 2.4 ; then  
  /bin/chmod +x /etc/rc.d/rc.hotplug  
fi  
  
# Load ALSA (sound) defaults:  
if echo $SHORTREL | grep -qw 2.6 ; then  
  if [ -x /etc/rc.d/rc.alsa ]; then  
  . /etc/rc.d/rc.alsa &  
  fi  
fi  

# Start the local setup procedure.  
# Only load if this is a 2.6 kernel:  
if echo $SHORTREL | grep -qw 2.6 ; then  
  if [ -x /etc/rc.d/rc.local ]; then  
  . /etc/rc.d/rc.local  
  fi  
fi  

# Only load if this is a 2.4 kernel:
if echo $SHORTREL | grep -qw 2.4 ; then
  if [ -x /etc/rc.d/rc.local-2.4 ]; then  
  . /etc/rc.d/rc.local-2.4  
  fi  
fi

Página anterior     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

Instalar e configurar Slackware 10.2 a 12 para um desktop

Softmodem em Linux com dois kernels

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

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

Softmodem compatível com Smart Link em kernel Linux 2.6.24 ou superior

Leitura recomendada

Guerra Infinita, uma análise da Ciência da Computação

OpeniBoot - Seu iPhone com Linux!

Máquinas velhas a todo vapor

O Processo de Boot no Linux

Compilação do Kernel Linux para máquinas locais Debian

  
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