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.
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.
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.
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.) |
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ů:
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í?
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
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
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)