# Jak zmusić Linux-a, żeby korzystał z informacji DHCP od Windows 95

## Autor:Dan Halbert, halbert@world.std.com
lub
halbert@bbn.com
6 Grudnia 1996
Wersja polska: Bartosz Maruszewski B.Maruszewski@jtz.org.pl
v1.02, 26 Lipca 1997

Dokument ten został napisany w standardzie ISO-8859-2. Wersja oryginalna znajduje się pod adresem ftp.icm.edu.pl.

## 1. Wprowadzenie.

Mój Linux na PC-cie musi otrzymać IP oraz inne informacje o sieci z serwera DHCP. Ale nie mogłem znaleźć takiego klienta, który działałby z moim serwerem.

Mój PC-et normalnie startuje z Windows 95, a Linux jest rzadziej używany. Klient DHCP pod Windows 95 działa u mnie dobrze. Mogłem skopiować mój adres IP, "nameserver" itp. ręcznie do Linux-a, ale chciałem zautomatyzować ten proces.

Windows 95 dostarcza program (\Windows\Winipcfg.exe), który wyświetla informacje DHCP w ładny graficzny sposób. Po przejrzeniu pliku winipcfg.exe odkryłem, że ma on nieudokumentowaną opcję, która pozwala zapisać informacje do pliku (domyślnie jest to Winipcfg.out). Pozwoliło mi to, na zrobienie takiego trick-u:

1. Start Win95. Klient DHCP pobierze potrzebne informacje od serwera DHCP.
2. Uruchomienie Winipcfg.exe i zapis wyniku do pliku.
3. Start Linux-a.
4. Zamontować system plików Win95.
5. Przeczytać plik utworzony przez Winipcfg.
6. Dostarczyć potrzebne informacje Linux-owi.

Wersję oryginalną tego dokumentu możesz znaleźć na SUNSite Polska. Na temat wersji tłumaczenia patrz sekcja Od tłumacza.

## 2. Metoda.

Teraz szczegóły na temat tego jak to robię:

1. W moim folderze startowym Win95 uruchamiam to polecenie. Kiedy Win95 startuje, Winipcfg zapisuje otrzymane od serwera DHCP informacje:

               winipcfg -all -batch c:\winipcfg.out

   Opcje muszą być podane w podanym porządku. Nie podanie -all spowoduje brak niektórych informacji. Nie podanie ścieżki do pliku winipcfg.out spowoduje zapisanie tego pliku w katalogu bieżącym. Poniżej jest załączony przykładowy plik winipcfg.out.
2. Natychmiast (albo jakiś czas później) po starcie Win95, startuję Linux-a. Używam loadlin-a uruchamianego z batch-a DOS-owego. Możesz użyć tego albo czegoś innego.
   (Nie możliwe jest połączenie loadlin-a i winipcfg w jednym batch-u ponieważ najprzypuszczalniej plik winipcfg.out nie zostanie przepisany z cache'u na dysk przed startem loadlin-a. Nie znalazłem sposobu na zapisanie zawartości cache'u na dysk z wiersza poleceń.)
3. Podczas startu Linux-a wykonywany jest program napisany w Perlu (winipcfg.pl) dołączony na końcu tego dokumentu. Program ten musi być wykonany po zamontowaniu systemu plików Win95, a przed uruchomieniem skryptów sieciowych. Ja używam dystrybucji Debian: poniżej załączony jest wyjątek z pliku `/etc/init.d/boot` z zanotowanymi moimi dodatkami. Twoja dystrybucja może mieć inne skrypty startowe, więc może będziesz musiał to trochę zmienić. (aut. Patrz kilka linijek niżej na temat innych dystrybucji).Program winipcfg.pl zapisuje nowe wersje plików: `/etc/hostname, /etc/resolv.conf oraz /etc/init.d/network`. Skrypt network wykonuje polecenie ifconfig z podanymi parametrami.

To tyle. Zapamiętaj oczywiście, że nie powinieneś trzymać Linux-a uruchomionego dłużej niż pozwala na to DHCP. Ja startuję tylko na kilka godzin, więc nie ma u mnie tego problemu.

Będziesz musiał dopasować program winipcfg.pl jeśli masz więcej niż jeden adapter sieciowy albo pseudo-adapter. Na przykład, oprogramowanie AOL ustawia udawany (fake) adapter sieciowy, i musisz zignorować jego informacje.

-------------------------------------------------------------------------------
Od autora: Oto lokalizacje plików odpowiedzialnych za konfigurację sieci oraz plików inicjacyjnych:

- RedHat: pliki odpowiadające za konfigurację sieci znajdują się w `/etc/sysconfig/network-scripts` natomiast montowanie odbywa się w pliku `/etc/rc.d/rc.sysinit`
- Slackware: plik sieciowy to `/etc/rc.d/rc.inet1`, a plik montujący systemy, to `/etc/rc.d/rc.S`.

-------------------------------------------------------------------------------

Oto załączniki (jeden na stronę):

    ==============================================================================
    Przykładowy plik winipcfg.out zrobiony przez Win95 "winipcfg -all -batch"
    (adresy zostały zmienione ze względów bezpieczeństwa)
    ==============================================================================
    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
    ==============================================================================

    ==============================================================================
    Wyjątek z pliku /etc/init.d/boot, z moimi dodatkami.
    ==============================================================================
    ...
    # Mount local file systems in /etc/fstab.
    echo "Mounting local file systems..."
    mount -avt nonfs

    # Execute swapon command again, in case we want to swap to
    # a file on a now mounted filesystem.
    swapon -a 2>/dev/null

    #### Dodatek o DHCP info ####################################################
    # Uaktualnij plik z informacjami sieciowymi według informacji z
    # klienta DHCP pod Win95
    if [ -f /c/winipcfg.out -a -x /usr/local/sbin/winipcfg.pl ]
    then
      echo "Setting network information from Windows 95 DHCP info."
      # To powoduje zapisanie nowszych wersji hostname, resolv.conf oraz
      # init.d/network.
      # Katalog /c to tam, gdzie montuję system plików Win95
      /usr/local/sbin/winipcfg.pl /c/winipcfg.out
      if [ $? != 0 ]
      then
        echo "Error getting network information. Using existing network info."
      fi
    else
      echo "** Windows 95 DHCP info not available. Using existing network info."
    fi
    #### koniec dodatku o DHCP info #############################################

    # Setup the network interfaces. Note that /var/run and /var/lock
    # are cleaned up after this, so don't put anything in the "network"
    # script that leave a pidfile or a lockfile.
    if [ -x /etc/init.d/network ]
    then
      /etc/init.d/network
    fi

    # Set hostname.
    hostname --file /etc/hostname

    # Now that TCP/IP is configured, mount the NFS file systems in /etc/fstab.
    echo "Mounting remote file systems..."
    mount -a -t nfs

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

    ==============================================================================
    /usr/local/sbin/winipcfg.pl:
    To jest program perlowy wywoływany ze skryptu startowego.
    ==============================================================================
    #!/usr/bin/perl

    while (<>) {
        # Remove any trailing CR and 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);
    ==============================================================================

## 2.1 Od tłumacza.

Tłumaczenie to jest chronione prawami autorskimi © Bartosza Maruszewskiego. Dozwolone jest rozprowadzanie i dystrybucja na prawach takich samych jak dokument oryginalny.

Jeśli znalazłeś jakieś rażące błędy ortograficzne, gramatyczne, składniowe, techniczne to pisz do mnie:

B.Maruszewski@jtz.org.pl

Oficjalną stroną tłumaczeń HOWTO jest http://www.jtz.org.pl/

Aktualne wersje przetłumaczonych dokumentów znajdują się na tejże stronie. Dostępne są także poprzez anonimowe ftp pod adresem ftp.jtz.org.pl w katalogu `HOWTO`.

Przetłumaczone przeze mnie dokumenty znajdują się także na mojej stronie WWW. Są tam też odwołania do Polskiej Strony Tłumaczeniowej.

Kontakt z naszą grupą, grupą tłumaczy możesz uzyskać poprzez listę dyskusyjną jtz@ippt.gov.pl. Jeśli chcesz się na nią zapisać, to wyślij list o treści `subscribe jtz Imię Nazwisko` na adres `majordomo@ippt.gov.pl`

Zmiany wprowadzone przez tłumacza, to dodatek o lokalizacji plików startowych w innych dystrybucjach.