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:
root@rachael:/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:
root@rachael:/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:
root@rachael:/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:
root@rachael:/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 piterpk@terra.com.br
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
|