Kernel / grub: como substituir o parâmetro raiz dentro do script initrd

0

Eu tenho um kernel antigo (2.4.37.9) e eu quero sobrescrever ou substituir o parâmetro root = XXXXX para enviar para o kernel dentro do script initrd.

Eu já fiz algumas tentativas para fazer isso, mas parece que no final do initrd grub sempre passar para o kernel o parâmetro root define dentro do arquivo menu.lst, enquanto eu estou tentando definir um valor dinâmico (ex. hda1 ou hdc1) dependendo do layout da placa mãe.

title Linux-2.4.37.9_CCL_20130122 with INITRD
    root (hd0,0)
    kernel /boot/vmlinuz-2.4.37.9_CCL_20130122  ro root=XXXXXX console=ttyS0,9600 console=tty0 apm=off
    initrd /boot/initrd-CCL.img.gz

Alguma sugestão?

    
por enzo2 21.02.2013 / 08:38

2 respostas

0

Esta não é a solução mais educada para este problema, mas funciona e mybe deve ser útil para outros, por isso descrevo aqui como resolvi o meu problema para ter um DOM capaz de o alterar automaticamente.

Dentro do linuxrc, o script do initrd, eu detecto qual dispositivo está disponível e baseado nesse resultado eu configurei a opção de inicialização padrão usada pelo grub

meu linuxrx eu gosto disso

#!/bin/ash

restart=0
mntdev=""

target="hda"
echo "--> check fdisk ${target} "

mount -t ext2 /dev/${target}1 /mnt/tmp
if [ -f /mnt/tmp/etc/slackware-release ]; then
  echo "Found $target "
  mntdev="/dev/${target}1"
      olddef=$( cat /mnt/tmp/boot/grub/default )
      if [ $olddef -ne 0 ]; then
          echo "0" > /mnt/tmp/boot/grub/default
          restart=1
      fi
fi
umount /mnt/tmp
# ================================
if [ -z $dskroot ]; then
    target="hdc"
    echo "--> check fdisk ${target} "

    mount -t ext2 /dev/${target}1 /mnt/tmp
    if [ -f /mnt/tmp/etc/slackware-release ]; then
      echo "Found $target  "
      mntdev="/dev/${target}1"
      olddef=$( cat /mnt/tmp/boot/grub/default )
      if [ $olddef -ne 1 ]; then
          echo "1" > /mnt/tmp/boot/grub/default
          restart=1
      fi
    fi
    umount /mnt/tmp
fi
# ================================

if [ $restart -eq 1 ]; then
  echo "Changed grub default : Rebooting PC "
  echo "===================================="
  sleep 2
  mount -t ext2 $mntdev /mnt/tmp
  chroot /mnt/tmp <<EOF
  /sbin/reboot -f
EOF
fi

E dentro do menu grub, eu resermo as duas primeiras entradas, o 0 para o dispositivo hda e o 1 para o dispositivo hdc

default saved

title Linux-2.4.37.9_CCL_20130122 with INITRD hda pos 0
        root (hd0,0)
        kernel /boot/vmlinuz-2.4.37.9_CCL_20130122  ro root=/dev/hda1 console=ttyS0,9600 console=tty0 apm=off
        initrd /boot/initrd-CCL.img.gz

title Linux-2.4.37.9_CCL_20130122 with INITRD hdc pos 1
        root (hd0,0)
        kernel /boot/vmlinuz-2.4.37.9_CCL_20130122  ro root=/dev/hdc1 console=ttyS0,9600 console=tty0 apm=off
        initrd /boot/initrd-CCL.img.gz
    
por 21.02.2013 / 15:14
1

Você não pode, não é suportado.

O que você pode fazer é extrair initrd /boot/initrd-CCL.img.gz , encontrar a parte que monta a raiz e modificar a parte correspondente, adicionar o script para detectar o layout do disco rígido e montar a unidade certa.

A maneira recomendada é definir um UUID para sua unidade raiz e alterar a root= part para root=UUID=XXX , não sei se ela é compatível com distros antigas. Dessa forma, não importa como o layout do dispositivo muda, ele sempre monta o dispositivo correto.

    
por 21.02.2013 / 09:34