Piter Punk's HomePage - Artigos
 
English version
Passando parâmetros no boot


Piter Punk

A situação não é de todo incomum, você tem um notebook e, quando leva-o de casa para o trabalho (ou vice-versa) têm que reconfigurar toda a rede a cada boot. Não seria mais interessante poder indicar ao Linux em qual rede você está e deixá-lo configurar de acordo com o informado?

1 Introdução

O caso do notebook mencionado acima é bastante interessante. Aqueles que usam a porta paralela às vezes para a impressora e outras vezes para PLIP também gostariam de poder indicar isso no boot. E devem existir vários outros usos...

A idéia deste artigo é possibilitar que você coloque parâmetros personalizados no prompt do LILO. E lê-los quando seu sistema estiver sendo inicializado.

2 Onde procurar...

A primeira questão é... onde procurar os parâmetros que você passou no LILO? A primeira opção é simplesmente digitar:

	# dmesg | grep "command line"

Isso funciona. Mas não é muito elegante. Vamos supor você fique carregando e descarregando módulos, ou recebendo muitas mensagens de debug de algum dispositivo... não sei se você sabe, mas o texto mostrado pelo dmesg tem tamanho fixo, a partir de uma certa quantidade de mensagens ele começa a apagar as primeiras linhas para dar espaço às mais novas.

Para garantir que sua variável personalizada possa ser lida no boot e, talvez, ser relida mais tarde, precisamos achar outro local para pegar a command line. Nossa próxima parada é no diretório /proc, onde estão várias informações sobre o sistema. Listando os arquivos do diretório, encontramos um com o sugestivo nome de cmdline. Na minha máquina, ele está com o seguinte conteúdo:

	[email protected]:/proc# cat cmdline 
	auto BOOT_IMAGE=Linux ro root=301 pci=biosirq ide0=dma

Bingo! Era isso que procurávamos!!

3 Separando alhos de bugalhos

Já temos a linha que queríamos, agora só é necessário separarmos os argumentos e selecionar o que nos interessa. Uma boa maneira, é primeiro separar todos os argumentos, colocando um por linha. Isso pode ser feito (sem traumas) com o comando tr. Com ele, iremos trocar os espaços em branco pelo sinal de pular linha. Faça assim:

	[email protected]:/proc# cat cmdline | tr " " "\n" 
	auto 
	BOOT_IMAGE=Linux 
	ro 
	root=301 
	pci=biosirq 
	ide0=dma

Com apenas um argumento por linha, torna-se muito fácil separar aquele que nos interessa. Vamos supor que eu queira a linha onde está "pci=biosirq", basta acrescentar no fim da minha linha de comando um | grep "pci=" e aguardar o resultado:

	[email protected]:/proc# cat cmdline | tr " " "\n" | grep "pci="
	pci=biosirq

Por último, se quiser apenas o que vier depois do =, acrescento | cut -f 2 -d "=", como no exemplo abaixo:

	[email protected]:/proc# cat cmdline | tr " " "\n" |grep "pci=" \
	| cut -f 2 -d "=" 
	biosirq

Agora sabemos exatamente como ler o parâmetro que passamos. A nossa grande dúvida agora é... o que fazer com ele?

4 O que fazer?

Se você possui algum conhecimento dos arquivos de inicialização da sua máquina (geralmente estão sob o diretório /etc/rc.d), você pode adaptá-los para incluir as alterações que mostraremos abaixo. Caso contrário, é melhor colocá-las no /etc/rc.d/rc.local.

Depois de criado o seu parâmetro e de haver lido o seu conteúdo, falta apenas colocar as ações a serem realizadas. Utilize um script semelhante ao exemplo abaixo:

PARAMETRO=`cat /proc/cmdline | tr " " "\n" | grep "parametro=" | cut -f 2 -d "="`
if [ "$PARAMETRO" = "conteúdo1" ]; then

    várias ações para o seu parâmetro

else

    outras ações, pode ser um segundo teste

fi

No caso do notebook imaginário do nosso resuminho, o parâmetro poderia ser algo como where e o conteúdo poderia ser casa ou trabalho. No fim do artigo tem um exemplo usando meu caso com o PLIP e impressora.

5 Conclusão

Capturar as informações entregues no prompt do LILO é muito simples. Qualquer um com um pouco de conhecimento da inicialização do seu sistema, pode fazer algumas adaptações interessantes de acordo com a sua necessidade. Dúvidas, sugestões e críticas para [email protected]

Exemplo com o PLIP e impressora

#
# Exemplo com o PLIP e Impressora
#

# O Slackware carrega o módulo lp por default. Este teste
# verifica se o módulo está carregado e, se estiver, remove-o
#
MODULOLINE=`/sbin/lsmod | grep "lp  " | wc -l | tr -d " "`
if [ "$MODULOLINE" != "0" ]; then
        /sbin/modprobe -r lp
fi

# O nome do parâmetro é "paralela" e os conteúdos 
# possíveis são plip ou lp. Se eu tivesse um zip poderia
# acrescenter essa opção
#

PRN=`cat /proc/cmdline | tr " " "\n" | grep "paralela=" | cut -f 2 -d "="`
if [ "$PRN" = "lp" ]; then
        modprobe lp
else
     if [ "$PRN" = "plip" ]; then
        modprobe plip
# 
# Depois do modulo carregado. A rede é configurada.
#
        ifconfig plip0 192.168.1.1 pointopoint 192.168.1.2 \
netmask 255.255.255.255 up
        route add -host 192.168.1.2 dev plip0
     fi
fi

Links Principal Artigos Piter Punk Dicas Programas
 
Powered by Slackware Linux - Written in VIm (the best one!) Last Update: 30 Oct 2004