26. 9. 2007

BOOTP, TFTP, Linbox

V okviru skupine DXX smo ob zaključku leta 2004 pričeli s testiranjem 5.7 GHz-čnih postaj za packet radio. Pri testiranju smo imeli na voljo tri postaje, ki nam jih je posodil S53MV. Tretja ni bila sestavljena do konca, zato jo je še pred testiranjem dokončal S56WAN.

Člani skupine smo, tudi s pomočjo UM FERI, pridobili štiri Linbox-e. Sam Linbox uporabljam že praktično dve leti. Rekordni uptime je 2395 ur. Ugasnil sem ga ob selitvi v Celje. Težave, ki so se pojavile ob novi konfiguraciji z vzpostavitvijo neposredne povezave med dvema Linbox-oma (brez SuperVozlja), je uspešno razrešil avtor Linboxa - S57MMK. Kljub veliki želji, da bi tudi sam prispeval k razvoju, me je pri tem vedno oviralo kronično pomanjkanje časa. V določenem trenutko, ko je bila volja na vrhuncu in mi je uspelo v načrte vključiti tudi Linbox, pa so se pojavile neke druge zapreke, ki so me odvrnile od resnejšega dela. Oživljanje postaj in Linbox-ov za delo na 5.7 GHz in z 10 Mb/s me je vzpodbudilo k pripravi teh navodil.

Linbox podpira prenos Linux jedra ob zagonu preko lokalnega omrežja Ethernet. Za prenos uporablja protokol TFTP (Trivial File Transfer Protocol). Še pred prenosom pa je potrebno primerno nastaviti lasnosti omrežnega vmesnika ter določiti naslov TFTP strežnika. Za ta del se uporabi protokol BOOTP (Bootstrap Protocol).

Z uporabo serijskega terminala lahko opazujemo aktivnosti na linboxu ob naslednjih nastavitvah: 38400,N,8,1.

Komunikacija torej poteka v naslednjem vrstnem redu:

  1. Linbox z razpršeno oddajo povprašuje po BOOTP strežniku.
  2. Strežnik, na osnovi naslova Ethernet omrežnega vmesnika, Linbox-u dodeli naslov IP in mu sporoči naslov TFTP strežnika. Dodatno mu sporoči tudi ime datoteke, ki jo naj v nadaljevanju prenese.
  3. Linbox prenese pripravljeno datoteko in ob primernem poimenovanju (vmlinuz) izvede zagon z uporabo prenesenega jedra.

V primeru, ko poimenovanje ni skladno s particijsko tabelo, se izvajanje ustavi v ukaznem načinu in pričakuje posredovanje uporabnika. Omrežni zagon je podrobneje predstavljen v razdelku Prenos novega jedra.

Namestitev programske opreme

Z uporabo programa dselect (ali kakšnim drugim) je potrebno namestiti strežnika za protokola BOOTP in TFTP. Zaradi enostavne nastavitve in dodatne podpore protokolu DHCP (Dynamic Host Configuration Protocol) smo za prvega izbrali program dhcp3.

Namestiti je torej potrebno naslednje pakete:

  1. dhcp3-common,
  2. dhcp3-server,
  3. atftpd.

Ob namestitvi atftpd priporočamo izbiro zagona s pomočju strežnika inetd. Na vprašanje "Should the server be started by inetd?" je torej potrebno odgovoriti s privzeto izbiro ("Yes"). Privzete nastavitve pustimo tudi za oddajo več naslovnikom ("multicast"). Še posebno pomembna je izbira osnovne mape za strežnik. Pustimo privzeto izbiro /tftpboot. Namestitvene procedure so s tem zaključene.

Nastavitve strežnikov

dhcp3

Vse nastavitve strežnika dhcp3 se nahajajo v datoteki /etc/dhcp3/dhcpd.conf. Primer konfiguracijske datoteke vsebuje samo vrstice, ki so potrebne za delo z Linbox-om. Podrobnejša navodila za bolj kompleksne nastavitve se nahajajo v priloženi dokumentaciji oziroma straneh s pomočjo (man dhcpd.conf).

subnet 192.168.22.0 netmask 255.255.255.0{
}

host linbox {
hardware ethernet 00:00:F0:11:22:08;
filename "uclinuz";
server-name "streznik";
next-server 192.168.22.1;
fixed-address 192.168.22.4;
}

Prva vrstica med zavitimi oklepaji določa Ethernet naslov omrežnega vmesnika v Linbox-u. Pridobimo ga z izbiro ukaza E. Ob zagonu pridemo do menija z ukazi s pritiskom na katerokoli tipko v trenutko, ko nas na to opozori Linbox. Naslednje vrstice prikazujejo potek med zagonom.

Init uart
Init txd 180
PHY AN 000040A1 100MB HALFDUP
Init lan
Init mac
Press any key for boot prompt .
S5LinBOX boot (V0.2, S57MMK 2/2004)
F,O,B,T,G,R,I,E,D,? ->

Po izbiri ukaza E se izpiše:

Ethernet address [0000F0112208] :

Ker naslova ne želimo spremeniti, pritisnemo samo tipko Enter (Return). Naj vas ne zmoti izpis "Invalid address !!", saj naš vnos dejansko ni bil pravilen. Pri prirejanju nastavitvene datoteke za vsakim drugim šesnajstiškim številom vnesite dvopičje.

Vrstica, ki se prične s ključno besedo "filename" določa ime datoteke, ki se naj v nadaljevanju prenese s protokolom TFTP. Prikazan primer določa Linux jedro, lahko pa bi bila tudi datoteka z nastavitvami. Oba primera sta podrobneje prikazana v nadaljevanju.

Naslednje vrstice določajo ime TFTP strežnika in njegov IP naslov ter IP naslov za odjemalca (Linbox). V prikazanem primeru ima strežnik IP naslov 192.168.22.1, Linbox-u pa se bo dodelil naslov 192.168.22.4. Naslove morate seveda prilagoditi svojemo načrtu za dodelitev naslovov IP. Še posebno pozorni botite v primeru, ko imate na strežniku nastavljenih več IP naslovov za en Ethernet vmesnik. V tem primeru lahko pride do težav, če za IP naslov strežnika ne izberete primarnega IP naslova. Težavam se lahko izognemo s primerno nastavitvojo usmerjanja, vendar to presega namen tega dokumenta.

Ob zaključku nastavitev je potrebno ponovno zagnati streznik dhcp3. To storimo z naslednjim ukazom:

/etc/init.d/dhcp3-server restart

atftpd

Strežnik atftpd smo nastavili že ob namestitvi. Izbrano ukazno vrstico lahko v primeru, ko smo pozabili izbrane parametre, najdemo v nastavitveni datoteki strežnika inetd (/etc/inetd.conf). Primer ukazne vrstice:

tftp dgram udp wait nobody /usr/sbin/tcpd /usr/sbin/in.tftpd --tftpd-timeout 300 --retry-timeout 5 --mcast-port 1758 --mcast-addr 239.255.0.0-255 --maxthread 100 --verbose=5 /tftpboot

Za delo s strežnikom je potrebno tvoriti še izbrano mapo - ta se med namestitvijo ne tvori:

mkdir /tftpboot

Če želite pripravljati konfiguracijske datoteke kot navaden uporabnik, ne pozabite na dovoljenja za dostop do mape (program chmod).

Prenos med strežnikom in Linbox-om

Ob prekinitvi zagona nam Linbox (natančneje: uclboot, ki se nahaja v pomnilniku flash) nudi dostop do naslednjih ukazov:

S5LinBOX boot (V0.2, S57MMK 2/2004)
F - Flash erasing, programming
O - Flash partitioning
B - Find BOOTP server
T - TFTP file download
G - Run downloaded (tftp) file
R - Run from flash
I - Change my IP address
E - Change my Ethernet hw address
D - Change scrambler txdelay
? - This help

Pred nadaljevanjem si poglejmo privzeto particijsko tabelo. Ti zapisi namreč določajo privzeta imena za posamezne dele pomnilnika. Ob izbiri ukaza O in nato ukaza L se izpiše naslednje besedilo:

->
Clear, List, Add, Delete, Edit, Flash_boot_default, Quit [] : L

File Flash_add Run_add Max_len
0: uclboot 00000 00000 10000
1: config 10000 00000 10000
2: uclinuz 20000 08000 1D0000 Default boot
3: etnc13 1F0000 00000 10000
Clear, List, Add, Delete, Edit, Flash_boot_default, Quit [L] :

Iz tabele je razvidno, da se prične Linbox zaganjati na naslovu $00000 (to ne drži v celoti - glej howto-config.txt od S57MMK - vendar zadostuje na namene tega dokumenta). Tej vsebini je pridruženo ime uclboot. Sledijo naslovi preostalih particij in njihova imena. Pri particiji z imenom uclinuz se nahaja oznaka "Default boot", ki določa, da se ob zagonu izbere Linbox in ne ETNC. Na naslovu $20000 se torej nahaja Linux jedro, na naslovu $10000 pa je slika mape /var/config v datotečnem sistemu romfs (na voljo je 64 kB prostora, zato bodite pozorni da to ne prekoračite). Izbrana poimenovanja so ključna za razumevanje avtomatizacije prenosa s protokolom TFTP, saj se morajo imena datotek ujemati z imenom particij.

Prenos novega jedra

Ob naslednjem zagonu bo Linbox našel BOOTP strežnik. Ta bo na osnovi njegovega naslova Ethernet posredoval primerne nastavitve. V naslednjem koraku Linbox izvede prenos izbrane datoteke z uporabo protokola TFTP iz strežnika, ki se je določil z BOOTP-odgovorom. V nadaljevanju je prikazan prvi del izpisa na konzoli od Linboxa:

Init uart
Init txd 180
PHY AN 000040A1 100MB HALFDUP
Init lan
Init mac
Press any key for boot prompt ...
BOOTP replay from: 192.168.22.1, got IP 192.168.22.4 File: uclinuz
->
TFTP started...
.......................
TFTP finished. Total 1527727 bytes saved at 0xC00000
->
Booting from net.... Decompressing. ....................................... OKLinux version 2.4.22-uc0 (root@s57mmk) (gcc version
2.95.3 20010315 (release)(ColdFire patches - 20010318 from fiddes.net/coldfire/)(uClinux XIP and shared lib patches from
www.snapgear.com/)) #740 Mon Jun 21 21:26:39 CEST 2004
Processor: Samsung S3C4530A01 revision 0
Architecture: S5LinBOX
...
...

Iz zapisanega je razvidno, da je Linbox uspešno vzpostavil komunikacijo s strežnikom BOOTP. Ta mu je zadal prenos datoteke z imenom uclinuz. Ker je to ime enako imenu v particijski tabeli se odloči za omrežni zagon. To dejansko pomeni, da se izbrana datoteka prenese s protokolom TFTP in se ob zagonu uporabi namesto vsebine, ki je shranjena v pomnilniku. V nadaljevanju podajamo izpis zajema dogajanja na omrežju z ukazom tcpdump port tftp and port bootps:

22:09:04.341786 0.0.0.10.bootpc > 255.255.255.255.bootps: xid:0x11223344 secs:100 [|bootp]
22:09:04.342019 192.168.22.1.bootps > 192.168.22.4.bootpc: xid:0x11223344
secs:100 Y:192.168.22.4 S:192.168.22.1 sname "streznik" [|bootp] [tos 0x10]
22:09:06.086371 192.168.22.4.33000 > 192.168.22.1.tftp: 16 RRQ "uclinuz"

V lokalnem omrežju lahko imamo torej več različnih Linboxov (vsak ima svoje jedro). Katero jedro se bo naložilo določajo nastavitve BOOTP strežnika. Tudi ob menjavi Linboxa se lahko na strežniku v konfiguracijski datoteki spremeni samo njegov Ethernet naslov in zadeva ob naslednjem zagonu že deluje z izbranim jedrom.

Prenos nastavitev

Nastavitve lahko prenašamo v obe smeri. Predlagamo, da si pred vsako spremembo nastavitev na Linbox-u, trenutne nastavitve shranite na strežnik. Enega izmed načinov opisujejo naslednji koraki:

  1. Na Linbox se povežite s protokolom telnet ali preko serijske povezave.
  2. Tvorite datoteko datotečnega sistema romfs, kjer za vhod uporabite vsebino mape z nastavitvami (/var/config), kot izhod pa datoteko /var/cfg:
    genromfs -V config -d /var/config -f /var/cfg
  3. Z uporabo odjemalca za protokol tftp prenesite tvorjeno datoteko na strežnik:
    tftp -p -l /var/cfg -r cfg_ce-2004.12.30 192.168.22.1 V izbranem primeru se nastavitve shranijo na strežniku z IP naslovom 192.168.22.1 v datoteko /tftpboot/cfg_ce-2004.12.30.

V primeru, ko želimo prenesti nastavitve iz strežnika na Linbox, je potrebno primerno spremeniti nastavitve strežnika za protokol BOOTP. Ta namreč ob povpraševanju Linbox-u določi ime datoteke za prenos s protokolom TFTP. V zgornjem primeru bi se torej v vrstici, ki določa ime datoteke, uclinux zamenjal z config. Strežnik ponovno zaženite (/etc/init.d/dhcp3-server restart). Še pred prenosom pa je seveda potrebno izbrano datoteko z nastavitvami skopirati v /tftpboot/config (npr.: cp /tftpboot/cfg_ce-2004.12.30 /tftpboot/config).

Ob naslednjem zagonu Linbox-a s pritiskom na katerokoli tipko v konzoli vstopimo v nadzorni način dela. Najprej poiščemo BOOTP strežnik (ukaz B). Sledi prenos datoteke config s protokolom TFTP (ukaz T). Datoteko shanimo na predlagan naslov (0xC00000) in jo v naslednjem koraku z zaporedjem ukazov F, 1 in Q zapišemo v pomnilnik flash. V tem koraku se izkaže pomen primerne izbire imena datoteke.

Sledi zagon z novimi nastavitvami:

  • z ukazom R, če imamo v pomnilniku flash želeno jedro,
  • s ponovnim zagonom, če želimo zagnati sistem z jedrom, ki se naloži iz strežnika (pred ponovnim zagonom, je potrebno primerno spremeniti nastavitve BOOTP strežnika - glej razdelek Prenos novega jedra).

V nadaljevanju je prikazan izpis na konzoli od Linboxa za navedene korake:

Init uart
Init txd 180
PHY AN 000040A1 100MB HALFDUP
Init lan
Init mac
Press any key for boot prompt ...
BOOTP replay from: 194.249.167.123, got IP 194.249.167.124 File: config
->
S5LinBOX boot (V0.2, S57MMK 2/2004)
F,O,B,T,G,R,I,E,D,? ->
BOOTP replay from: 194.249.167.123, got IP 194.249.167.124 File: config
->
TFTP File Name [config] :
To Memory Address [0xC00000] :

TFTP finished. Total 30720 bytes saved at 0xC00000
->
0: Erase all
1: Write to flash
Q: Quit
Flash ->
config
Program net file, sure [Y/N] : [N] :y
ID = ST M29W160DB EEPROM!!. 80000000
Erasing Flash blocks len 65536..... Finished.
Programming from 0x00c00000 to 0x01010000 len 30720....Finished.
0: Erase all
1: Write to flash
Q: Quit
Flash ->
->
Reboot [uclinuz] :
Decompressing. ....................................... OK

Odpravljanje težav

Če se ob zagonu pojavi izpis v obliki:

Init uart
Init txd 100 ok
PHY AN 000045E1 100MB FULLDUP
Init lan
Init mac
Press any key for boot prompt ...
BOOTP replay from: 164.8.73.114, got IP 10.0.0.10 File:
->
TFTP started...
Booting from net.... Decompressing.
EOF

EOF
Invalid magic
Not compressed !
Data Abort Address : 0000001f

se skoraj gotovo ni izvedel prenos datoteke s protokolom TFTP. Najverjetneje nekaj ni OK z usmerjanjem ali TFTP strežnikom. Prelagamo, da Linbox-u dodelite IP naslov iz istega podomrežja v katerem je strežnik. Znak, da je dejansko prišlo do prenosa so pike (....), ki ponazarjajo dolžino datototeke, v vrstici, ki sledi vrstici "TFTP started...". Kaj točno se dogaja v lokalnem omrežju lahko preverite z naslednjim ukazom na strežniku tcpdump host 10.0.0.10

.

Zaključek

Navodila so pripravljena za distribucijo Debian. Zagotovo se lahko strežniki pripravijo tudi na drugih distribucijah ali operacijskih sistemih, vendar za to ne načrtujemo priprave navodil.

Zahvala

Želel bi se zahvaliti S57MMK za vse ure, ki jih je posvetil razvoju Linbox-a. Zavedam se, da so s tem povezani tudi veliki stroški, ki pogosto presegajo zneske, ki jih namenimo svojemu hobiju. Upam, da smo z odkupom Linbox-ov vsaj malo prispevali k njegovemu delu (v okviru skupine DXX imamo v načrtu odkup šestih Linboxov). Zahvala velja tudi našemu S56WAN, ki vsako prosto minuto (dobesedno) posveti radioamaterskim projektom. Brez njega bi marsikateri projekt trajal še dlje ...