Como conseguir que o Linux use informações do DHCP do Windows 95

Última revisão em: 6 de dezembro de 1996.
Dan Halbert
halbert@world.std.com
halbert@bbn.com
Traduzido por: Bruno H. Collovini - buick@microlink.com.br
Traduzido em: 21 de Novembro de 1997.

Aviso: Esta tradução não está relacionada com o Projeto de Documentação do Linux LDP) que no Brasil é representada pela LDP-BR em <http://www.dca.fee.unicamp.br/~malheiro/linux/LDP-br.html>, este material é uma tradução técnica e básica somente para auxiliar os colegas com a leitura em português.

Outros documentos você pode obter em: <http://www.microlink.com.br/~buick/>

Introdução

Meu PC com Linux precisa obter o seu endereço IP de outra informação da network através um servidor DHCP. Porém, eu estive com dificuldades de achar um cliente DHCP que roda-se corretamente com o servidor DHCP que utilizo.

Meu PC normalmente da boot com o Windows 95, e uso o Linux com menos freqüencia. O cliente DHCP do Windows 95 roda normalmente para mim. E Eu poderia copiar manualmente o meu endereço IP, nameservers, etc., para o Linux, mas eu quis automatizar este processo.

Um programa suplente no Win95 (\Windows\Winipcfg.exe) exibe o Info do DHCP de um modo simples e agradável. Examinando as strings do winipcfg.exe, eu descobri opções sem documentação que são escritas estas informações em um arquivo ("Winipcfg.out", por default). Isto permitiu me trabalhar no seguinte truque:

1. Dar o boot no Win95. O cliente DHCP adquirirá a informação necessária do servidor DHCP.
2. Rodar o Winipcfg.exe, e escrever os resultados num arquivo.
3. Dar o boot no Linux.
4. Montar sistema de arquivos do Win95 (file system).
5. Analisar gramaticalmente o arquivo produzido pelo Winipcfg.
6. Prover o Linux com a informação da networking necessaria.

Método

Agora os detalhes de como eu faço isto, para o meu setup em particular:

1. No pasta de StartUp do Win95, eu rodo este comando. Quando o Win95 dar o boot, o Winipcfg registra a informação do DHCP o Win95 obtem do servidor Servidor DHCP:

        winipcfg -all -batch c:\winipcfg.out

As opções devem estar nesta ordem determinada. Emitindo "-all" omite algumas das informações. Emitindo a escritura para o arquivo "winipcfg.out " para o diretório corrente. Uma amostra do arquivo de winipcfg.out é mostrado abaixo.

2. Imediatamente (ou alguns dia depois) depois de bootar com o Win95, eu dou o boot no Linux. Eu uso o loadlin, rodando de um arquivo no grupo no modo MS-DOS. Você poderia usar isto ou qualquer outra coisa.

(Não é possível combinar o Winipcfg e o loadlin em um único arquivo de grupo, porque aparentemente o arquivo "winipcfg.out " não vê o cache do disco antes de rodar o loadlin. Eu não achei nenhum modo de ver o cache através da linha de comando.)

3. Quando o Linux dar o boot, o script inicial roda o "winipcfg.pl", um programa de perl mostrado ao término deste mini-HOWTO. Este programa deve ser rodado depois que o sistema de arquivos do Win95 estiver montado, mas antes de rodar o "script de network". Eu uso a distribuição do Linux Debian: anexe abaixo do /etc/init.d/boot, do Debian's, com as minhas adições. Sua distribuição pode ter scipts de boot diferente, assim você pode precisar adaptar isto. O programa "winipcfg.pl" escreve uma nova versão do /etc/hostname, do /etc/resolv.conf e do script de /etc/init.d/network. O script de "network" faz um "ifconfig" com os argumentos apropriados.

Isto é tudo para isto. Note claro que que você não deve dar o boot do seu sistema de Linux em cima de uma grande tempo da alocação do DHCP. Eu só dou o boot durante algumas horas, de forma que não é um problema para mim. Você pode precisar alterar o script "winipcfg.pl" se você tem mais que um adaptador de network ou um pseudo-adaptador. Por exemplo, AOL software set um falso adaptador de netework, e você precisa ignorar há sua informação.

Anexos seguem, um por página.

==============================================================================
Amostra do que o winipcfg.out produzido através do Win95 "winipcfg -all -batch"
(endereços mudados para proteger inocente)
==============================================================================
Windows 95 IP Configuration


        Host Name . . . . . . . . . : foo.bar.com
        DNS Servers . . . . . . . . : 11.222.33.8
                                      11.222.33.9
        Node Type . . . . . . . . . : Broadcast
        NetBIOS Scope ID. . . . . . :
        IP Routing Enabled. . . . . : No
        WINS Proxy Enabled. . . . . : No
        NetBIOS Resolution Uses DNS : Yes

Ethernet adapter :

        Description . . . . . . . . : ELNK3 Ethernet Adapter
        Physical Address. . . . . . : 00-AA-BB-99-88-77
        DHCP Enabled. . . . . . . . : Yes
        IP Address. . . . . . . . . : 11.222.33.222
        Subnet Mask . . . . . . . . : 255.255.255.0
        Default Gateway . . . . . . : 11.222.33.1
        DHCP Server . . . . . . . . : 11.222.33.10
        Primary WINS Server . . . . :
        Secondary WINS Server . . . :
        Lease Obtained. . . . . . . : Wed Oct 16 96 10:17:26 PM
        Lease Expires . . . . . . . : Wed Oct 30 96 10:17:26 PM
=============================================================================
=============================================================================
Extraido do /etc/init.d/boot do Debian, com minhas adições.
=============================================================================
...

#Monte os sistemas de arquivo locais em /etc/fstab.
echo " Montando sistemas de arquivo locais..."
mount -avt nonfs

#Execute o comando de swapon novamente, no caso de nós querermos trocar
#um arquivo agora com o filesystem montado.
swapon -a 2>/dev/null

####DHCP info adiçionado###################################################
#Atualização da informação do arquivo de network com info do cliente DHCP
do Win95.

if [ -f /c/winipcfg.out -a -x /usr/local/sbin/winipcfg.pl ]
then
  echo "Configurando informação da network através do Windows 95 info DHCP."
  #Isto escreve a versão nova do hostname, resolv.conf e init.d/network.
  #/c/ é onde eu monto o sistema de arquivo do Win95.
  /usr/local/sbin/winipcfg.pl /c/winipcfg.out
 if [ $? != 0 ]
  then
    echo "Error na adquirição da informação da network. Usando info da network existente."
 fi
else
  echo "** O Windows 95 info do DHCP não está disponível. Usando info da network existente."
fi

####fim da adição do DHCP info #############################################
#Setup das interfaces de network. Note o /var/run e /var/lock
#são limpados depois, assim não põe nada na "network"
#script que deixa o pidfile ou um lockfile.
if [ -x /etc/init.d/network ]
then
  /etc/init.d/network
fi

#Setando o Hostname.
hostname --file /etc/hostname

#Agora é configurado o  TCP/IP, montado o sistema de arquivos NFS em /etc/fstab.
echo "Monta sistemas de arquivo remotos....."
mount -a -t nfs

...
==============================================================================

=============================================================================
/usr/local/sbin/winipcfg.pl:
Este é o programa de perl invocado no script de boot acima.
=============================================================================
#!/usr/bin/perl

while (<>) {
    # Remove qualquer comando de CR e LF.
    s/\r//g;
    s/\n//g;

    if (/^\tHost Name.*: (.*)$/i) {
        ($hostname, $domain) = split(/\./, $1, 2);
    } elsif (/^\tDNS Servers.*: *(.*)$/i) {
        push @nameservers, $1;
    } elsif (/^\t +([\.0-9]+)$/) {
        push @nameservers, $1;
    } elsif (/^\tIP Address.*: (.*)$/i) {
        $ip_address = $1;
    } elsif (/^\tSubnet Mask.*: (.*)$/i) {
        $netmask = $1;
    } elsif (/^\tDefault Gateway.*: (.*)$i/) {
        $gateway = $1;
    }
}

$hostname || die "Hostname not given";
$domain || die "Domain not given";
$ip_address || die "IP address not given";
$netmask || die "Netmask not given";
$gateway || die "Gateway not given";
$#nameservers != -1 || die "No nameservers given";

open(HOSTNAME, ">/etc/hostname") ||
    die "Could not open /etc/hostname for writing\n";
open(RESOLV, ">/etc/resolv.conf") ||
    die "Could not open /etc/resolv.conf for writing\n";
open(NETWORK, ">/etc/init.d/network") ||
    die "Could not open /etc/init.d/network for writing\n";
chmod 0755, "/etc/init.d/network";

print HOSTNAME "$hostname\n";
print RESOLV "domain $domain\n";
print RESOLV "search $domain\n";
foreach (@nameservers) {
    print RESOLV "nameserver $_\n";
}

@ip_address = split(/\./, $ip_address, 4);
@netmask = split(/\./, $netmask, 4);
$network = join(".",
                $ip_address[0]+0 & $netmask[0]+0,
                $ip_address[1]+0 & $netmask[1]+0,
                $ip_address[2]+0 & $netmask[2]+0,
                $ip_address[3]+0 & $netmask[3]+0);
$broadcast = join(".",
                  $ip_address[0]+0 | ~($netmask[0]+0) & 255,
                  $ip_address[1]+0 | ~($netmask[1]+0) & 255,
                  $ip_address[2]+0 | ~($netmask[2]+0) & 255,
                  $ip_address[3]+0 | ~($netmask[3]+0) & 255);
print NETWORK
"ifconfig eth0 $ip_address netmask $netmask broadcast $broadcast
route add -net $network netmask $netmask
route add default gw $gateway metric 1
";

print
"DHCP info: $hostname.$domain ($ip_address)
  netmask: $netmask broadcast: $broadcast gateway: $gateway
  nameservers: @nameservers
";
exit(0);
==============================================================================

[Help OnLine] [Distribuições] [Novidades] [Eventos] [Usuários] [Aplicativos] [Hardware] [Projetos] [Vendedores] [Serviços]
[Linux Brasil]
WebSite Design: Buick
Copyright © 1997-1998 - Buick. All Rights Reserved.
[Linux-Org]