Bezdiskové stanice (BOOTP, DHCP, TFTP)

Ladislav Tkáč, xtkac1(you-know-what-bots-do-not)fi.muni.cz

Obsah

K čemu jsou dobré bezdiskové stanice

Vzhledem k ceně HW se v minulosti využívaly bezdiskové lokální terminály, které byly sítí připojeny na nějaký výkonný mainframe. Ve formě tenkých klientů se bezdiskové stanice hodí do prostředí, kde je kladen důraz na bezpečné datové uložiště (zajištěno na straně serveru), vysokou spolehlivost a nízkou energetickou náročnost. Je možné mít jeden image pro celou infrastrukturu tenkých klientů a umožnit tak snadnou distribuci nových aplikací a snadnou změnu konfigurace. V současnosti se teší oblibě i v Home Theather stanicích, kde pomáhají minimalizovat teplotou i hluk. Vyvstává otázka, jak zavést operační systém ze sítě. Je nutné zadefinovat protokoly, které nám to umožní. Lze je rozdělit do dvou kategorií. První z nich nám umožní prvotní síťovou konfiguraci a druhá následný síťový přenos souborů potřebných pro zavedení systému. V první kategorii existuje hned několik kandidátů. V minulosti byl hojně používaný BOOTP, který byl nahrazen DHCP protokolem, případně lze v omezené formě použít RARP (není routovatelný a neumožňuje předat adresu boot image). Do druhé skupiny pak spadají protokoly TFTP, SFTP a případně NFS pro připojení souborového systému.

Boot krok za krokem

Pro boot je potřeba, aby NIC reportoval BIOSU v motherboardu, že ho lze považovat za bootable. To je v dnešní době integrovaných síťových karet běžnou praxí. Karta musí být schopna stáhnout si zavaděč (boot loader) a ten poté nabootovat. U rozšiřujících síťových karet musí obsahovat BOOT ROM, která se o to postará, případně nabootovat ROM image z diskety, CDROM, či USB flash paměti. Používá se mechanismus dvojstupňového zavádění. Nejdříve minimalistický zavaděč přímo v BOOT ROM na NIC a poté sekundární zavaděč, který již může být načtený ze serveru. Například PXE "Preboot eXecution Environment", který je jednoduše konfigurovatelný. Jedná se o boot ROM standard navržený společností Intel, který je dnes podporovaný většinou výrobců síťových karet. O PXE se zmíním ještě později.

DHCP - Dynamic Host Control Protocol

Implementace dhcpd je dostupná od Internet systems Consortium, jež mimo jiné vyvíjí i BIND. V debianu lze použít fork dhcpd3. DHCP vychází z protokolu BOOTP a je definován v RFC 2131. Rozšíření pro IPv6 je publikováno v RFC 3315. Packet se liší obsahem a velikostí (312B) pole Vendor Extensions na konci zprávy. Jednou z hlavních novinek, které DHCP přináší je možnost definovat lease time který značí dobu, na jak dlouho je adresa přidělena. Dále je důležité, že server posílá adresy DNS serverů a masku sítě. Požadavky klientů se identifikují podle jejich MAC adres. Výhodou je možnost mít několik DHCP serverů na síti pro případné řešení výpadku. Pokud klient pošle DHCPDISCOVER na multicastovou adresu, dostane se mu odpovědi od všech DHCP serverů na síti formou DHCPOFFER. Klient následně pošle DHCPREQUEST jednomu ze serverů. Odpověď serveru může být dvojí: DHCPACK v případě potvrzení, nebo DHCPNAK pro zamítnutí. Po vypršení doby, po kterou má klient adresu povolenou, je nutno tento proces opakovat. V případě, že klient adresu již nepotřebuje, pošle DHCPRELEASE a adresa se uvolní pro další použití.

Konfigurace serveru v debianu se nachází v souboru /etc/dhcp/dhcpd.conf:

option domain-name "lab.fi.muni.cz";
default-lease-time 900;
max-lease-time 7200;
option domain-name-servers proto03-beta, erigona;
option routers 10.0.30.1;

host proto03-beta {
	hardware 00:16:3E:00:00:13;
	option domain-name-servers erigona;
	server-name "proto03-alpha";
	fixed-address 10.0.30.2;
}

subnet 10.0.30.0 netmask 255.255.255.0 {
	range 10.0.30.3 10.0.30.254;
        filename "pxelinux.0";
        next-server 10.0.30.1;
}

Formát konfigurace je intuitivní, jedna volba na řádku ukončena středníkem, případně definice bloku, jak je vidět třeba u host a subnet. V případě, že volby nejsou definovány, dědí blok nastavení z nadřazeného bloku. Podíváme se na jednotlivé volby. Klient proto03-beta na základě své MAC dostane adresu 10.0.30.2 a to vždy právě tuto díky parametru fixed-address. Pro bezdiskové stanice je důležitý parametr filename, který určuje cestu k bootovacímu obrazu. Z volby default-lease-time je vidět, že adresa je přidělena na 15 minut, maximálně však na 2 hodiny. V sekci subnet je pak vidět rozsah adres, které jsou přiděleny ostatním klientům.

Důležité nastavení je next-server, kterým říkáme, kde se nachází TFTP server, jež budeme používat pro nabootování bezdiskové stanice. Položka filename určuje defaultní soubor pro nabootování klienta.

Konfigurace klienta spočívá v debianu ve správném nastavení /etc/networking/interfaces, kde je třeba mít nastaveno pro rozhraní přidělování adresy od DHCP. Další zajímavý soubor je dhclient.leases, který se nachází ve /var/lib/dhcp3/dhclient.leases. Zde jsou uloženy přidělené adresy a jejich lease-time, které pak mohou být použity i po restartu.

BOOTP - Bootstrap Protocol

Ke vzájemné komunikaci serverů s klienty používají protokoly BOOTP i DHCP stejné porty. Servery DHCP a BOOTP přijímají požadavky od klientů pomocí portu UDP 67. Síťoví klienti používající protokoly BOOTP a DHCP si pro příjem odpovědí do serverů většinou zamlouvají port UDP 68. BOOTP je definován v RFC 951. Je to velmi jednoduchý protokol. Klient vyšle BOOTREQUEST na broadcast adresu 255.255.255.255 (položky jež chce klient vyplnit jsou prázdné). Server se podívá po přijetí do své konfigurace, jestli má v tabulce MAC adresu, ze které dotaz přišel. Poté na základě tabulky pošle klientovi BOOTREPLY s vyplněnými chybějícími položkami. BOOTREPLY může obsahovat IP adresu, masku podsítě, adresu DNS serveru, cestu k serveru a souboru, ze kterého má nabootovat operační systém. IP adresa přidělená zařízení je přidělená nastálo. Případně další informace mohou být uvedeny ve Vendor Specific Area viz. tabulka.

Počet oktetů Název pole Popis
1 Operation Kód operace (BOOTREQUEST nebo BOOTREPLY)
1 Hardware Typ Typ hardwarové adresy
1 Hardware Length Délka hardwarové adresy
1 Hops
4 Transaction ID ID transakce
2 Seconds Doba (sec.), která uplynula od začátku bootování
2 Flags
4 Client IP Adress IP adresa klienta . pokud zná klient svou IP
4 Your Client IP Address IP adresa klienta . na toto místo ji doplní server
4 Server IP Address IP adresa serveru
4 Gateway IP Address IP adresa gatewaye
16 Clinet Hardware Adress Hardwarová adresa klienta
64 Server Host Name Jméno serveru
128 File Name Jméno bootovacího souboru
Vendor Specific Area Další informace pro klienta (adresa DNS atd.)

Standardní server pro protokol BOOTP se jmenuje originálně bootp a je dostupný téměř v každé distribuci. Konfigurace je v /etc/bootptab. Záznam pro stanici se píše na řádek a parametry jsou odděleny dvojtečkou. Vždy začíná hostname a následné hodnoty jsou vždy ve formátu (tag složený ze dvou znaků)=hodnota. Pokud máme více stanic se společnými parametry můžeme nadefinovat defaultní záznam, kdy hostname začíná tečkou. Do následujících záznamů pak lze vložit tagem tc=.default zde definované položky. Jednotlivé řádky jsou vždy ukončeny dvojtečkou a je třeba dodržet, že tag ha je uveden až po definování typu adresy tagem ht.

Položka v konfiguračním souboru tedy může vypadat následovně:


proto03-beta:ht=ethernet:ha=000476D1C37E:ip=10.0.30.2:gw=10.0.30.1: 

Popis atributů:

Protokol TFTP

TFTP - Trivial FTP Má přízvisko trivial, protože obsahuje okleštěnou verzi FTP tak, aby byla co nejmenší a bylo ji možné snadno použít v integrovaných čipech. O protokolu si můžeme počíst v RFC 1350. Je to bezstavový protokol, komunikující na portu 69 UDP. Pro přenos se používají funkce PUT a GET známé z FTP protokolu. Jako implementaci tftp serveru je možné použít netboot, TFTP Server, Advanced TFTP. Prakticky nejpoužívanější je však tftp-hpa, který je vylepšenou verzí BSD TFTP klienta.

Co tftp neumí?

Instalace a nastavení tftp
root@proto03:~# apt-get install tftpd-hpa

Po instalaci nakonfigurujeme server, aby běžel jako démon. /etc/default/tftpd-hpa. Změníme RUN_DAEMON na yes, takže soubor bude vypadat následovně:

#Defaults for tftpd-hpa
RUN_DAEMON="yes"
OPTIONS="-l -s /var/lib/tftpboot"

Nyní vytvoříme kořenový adresář pokud neexistuje a spustíme server:

root@proto03:~# mkdir -p /var/lib/tftpboot
root@proto03:~# /etc/init.d/tftpd-hpa start
Starting HPA's tftpd: in.tftpd.

Jakmile bootovaný systém obdrží adresu od DHCP serveru, bude požadovat soubory z adresáře /var/lib/tftpboot

použití na straně klienta: TFTP [-i] cíl [GET | PUT] zdroj [umístění]

Jednou ze zajímavých možností distribuce image je TFTP multicast (přidaný v druhé revizi protokolu viz RFC 2090). Ten dovoluje stažení jednoho souboru současně pro více klientů. Místo forkování procesu pro každého TFTP klienta multicastový server obslouží všechny klienty naráz na základě seskupení do jedné multicastové adresy. To prakticky umožňuje bootování mnoha stanic současně. Multicast pak běží na UDP portu 1758.

Druhou možností jak se vyhnout přetížení serveru je bootování sekvenčně, kdy je možné budit stanice na základě magic packetu služby Wakeup On LAN například pomocí programu etherwake

PXE server

Jakmile máme nakonfigurované DHCP a TFTP servery, je třeba dokončit konfiguraci PXE (v debianu balík pxe). Defaultně se klient při bootu snaží stáhnout soubor na základě své MAC adresy a následně hledá podle hexadecimální reprezentace své IP adresy. Pokud žádný takový neexistuje, vyzkouší několik možností a pokud nenajde odpovídající konfiguraci, načte ji ze souboru default.

Takhle pak může vypadat boot stanice s PXE

PXE entry point found (we hope) at 9AE5:00D6
My IP address seems to be C0A80146 192.168.1.170
FTFTP prefix:
Trying to load: pxelinux.cfg/01-00-14-22-a1-53-85
Trying to load: pxelinux.cfg/C0A80146
Trying to load: pxelinux.cfg/C0A8014
Trying to load: pxelinux.cfg/C0A801
Trying to load: pxelinux.cfg/C0A80
Trying to load: pxelinux.cfg/C0A8
Trying to load: pxelinux.cfg/C0A
Trying to load: pxelinux.cfg/C0
Trying to load: pxelinux.cfg/C
Trying to load: pxelinux.cfg/default

Pro získání hexadecimální IP adresy můžeme použít nástroj gethostip.


brahmin@neocortex:~$gethostip www.intent63.org
www.intent63.org 88.208.118.93 58D0765D

V konfiguraci dhcpd.conf jsem jako soubor pro stažení přes TFTP definoval pxelinux.0, který ukazuje na /tftpboot/pxelinux.0. V adresáři /tftpboot/ se dále nachází adresář pxelinux.conf obsahující konfigurační soubor 58D0765D. Tento soubor obsahuje seznam jader, která jsou k dispozici pro bootování ze sítě.

var/lib/tftpboot/pxelinux.conf/58D0765D

DISPLAY boot.txt
# která z položek v konfiguraci se má spustit defaultně. 
DEFAULT secondary
# jak dlouho čekat před natažením jádra
TIMEOUT 30
# zobrazit boot prompt
PROMPT 	1
LABEL primary 
	 # cesty jsou relativní ke kořenu TFTP serveru
	KERNEL 10.0.30.1/bzImage
	 # parametry jádra
	APPEND	root=/dev/sda3 vga=791
	 # tato volba slouží k předání síťových parametrům jádru (bootserver,gateway,netmask)
	IPAPPEND 1
LABEL secondary
	KERNEL 10.0.30.1/bzImage
	APPEND root=/dev/nfs rw nfsroot=10.0.30.1:/tftpboot/10.0.30.1 
	IPAPPEND 1

NFS

Pro připojení souborového systému přes NFS je potřeba mít nakonfigurovaný NFS server. Poté si vytvoříme na serveru adresář, který bude obsahovat root pro bezdiskovou stanici. NFS server se konfiguruje v etc/exports.


# pro funkčnost některých systémových služeb na stanici je třeba připojit pro čtení i zápis = rw

# Atribut no_root_squash slouží k tomu aby NFS systém 
# nepřemapoval UID root na nějaké jiné. To by způsobilo, že
# některé programy by přestaly korektné fungovat.

/tftpboot/10.0.30.1	10.0.30.1(rw,no_root_squash)

Literatura