Portál AbcLinuxu, 24. dubna 2024 11:57

Bootování ze sítě: pxelinux a kořenový adresář na NFS

21. 11. 2012 | Luboš Doležel
Články - Bootování ze sítě: pxelinux a kořenový adresář na NFS  

V tomto seriálu si předvedeme bootování ze sítě v různých variacích. V prvním dílu si vysvětlíme, oč jde a předvedeme si pxelinux v kombinaci s kořenem souborového systému na NFS.

Obsah

Proč bootovat ze sítě?

link

Osobně používám bootování ze sítě popisované v tomto článku z několika důvodů:

A jaké jsou nevýhody?

Kde se může takový systém hodit?

...a na spoustě dalších míst.

V čem nás bootování ze sítě NEomezuje?

Jdeme na to

link

Abychom byli schopni řešit případné problémy, je vhodné vědět, jak co funguje. Prvním krokem je mít počítač, který boot ze sítě podporuje. V dnešní době to jsou prakticky všechny základní desky a velká část síťových karet do PCI/PCIe. Obvykle stačí boot ze sítě povolit v BIOSu, na některém hardwaru (kupříkladu notebooky Sony Vaio) je pak ještě nutné dodatečně mačkat F12 nebo jinou klávesu.

Pokud máme natolik starý hardware, že síťový boot není podporován, je tu stále ještě možnost načíst příslušný zavaděč z diskety, CD-ROMu a tak podobně.

DHCP

link

Prvním dílem celé stavebnice je DHCP server, který poskytne jako součást své obvyklé odpovědi dodatečné údaje. Jakmile se počitač pokouší o boot ze sítě a spustí takzvané Preboot eXecution Environment (PXE), začne se dotazovat DHCP serveru o přidělení IP adresy. Toto je situace, se kterou se jistě setkala spousta uživatelů, aniž by o bootování ze sítě měli ponětí. Řada základních desek má pokus o boot ze sítě jako volbu následující po pokusu o boot z lokálních pevných disků nebo optických mechanik.

Primární věcí, o kterou má PXE od DHCP serveru zájem, je název/cesta k souboru, kde je k dispozici bootloader (zavaděč). Podíváme se na konfiguraci pro ISC DHCP server.

host hera {
    hardware ethernet 00:1B:FC:45:C0:B7;
    fixed-address 10.10.10.2;
    filename "pxelinux.0";
}

Povšimněte si řádku filename. Toto je cesta, která bude použita v dalším kroku, tedy při stahování zavaděče ze serveru TFTP. Pokud máme DHCP server na nějakém obyčejnějším routeru, nabízí se volba next-server, kterou určíme, že se má TFTP klient připojovat k jiné IP adrese, než kde sídlí DHCP server.

Rovnou si ale ukážeme situaci, kdy chceme nabízet boot ze sítě všem strojům, které o to projevují zájem. Tedy nevysílat dodatečné údaje každému DHCP klientovi nebo jen konkrétní PXE adrese, ale jen všem PXE klientům:

class "pxeclient" {
    match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";

    filename "pxelinux.0";
    next-server 10.10.10.15;
}

TFTP server

link

Proč se používá TFTP server? TFTP je velmi jednoduchý protokol pro přenos souborů, podstatně primitivnější než FTP. Místo TCP používá UDP a je bezstavový. TFTP server obdrží nahodilý požadavek „chci X bajtů ze souboru ABC“ a pošle zpátky výsledek.

TFTP serverů je na výběr více. Osobně mohu doporučit tftp-hpa, ale asi snad jen díky tomu, že umí hacky pro podporu Windows. Jinak na tom vcelku nesejde. Osobně nenechávám na serveru běžet spousty zbytečných procesů, proto jsem rád za možnost spouštět tohoto démona přes (x)inetd. Toto je obsah mého souboru /etc/xinetd.d/tftp:

service tftp
{
        disable         = no
        socket_type     = dgram
        protocol        = udp
        wait            = yes
        user            = root
        server          = /usr/sbin/in.tftpd
        server_args     = -R 4096:32767 -s /diskless -m /etc/tftpd.map
}

Vysvětlíme si server_args. První argument je povolený rozsah zdrojových portů. Přiznám se, že zde si nejsem jist účelností. Druhý argument je kořenový adresář, kde se nacházejí soubory poskytované TFTP serverem. Třetí argument určuje soubor, kde můžeme provádět jisté manipulace s požadavky – na to se podíváme příště a ano, tam je jeden z většího počtu hacků pro Windows ;-)

Zavaděč

link

V našem případě si nainstalujeme zavaděč syslinux a jeho variantu v souboru pxelinux.0 nakopírujeme do adresáře /diskless. Na Gentoo se ukrývá v /usr/share/syslinux. Pokud bychom v tento moment spustili DHCP server, TFTP server a klientskou stanici, dostali bychom tento výstup:

Bootování ze sítě: pxelinux

To nám dává tušit, že dalším krokem je sestavit nějakou konfiguraci. Tu si pxelinux stahuje rovněž přes TFTP a v našem případě ji bude hledat v adresáři /diskless/pxelinux.cfg/. Zde máme na výběr několik způsobů, jak konfiguraci zorganizovat (a v tomto pořadí ji pxelinux hledá):

Konfiguraci pro konkrétní MAC adresu uložíme např. do souboru 52-54-00-00-00-aa. IP adresu zapisujeme hexadecimálně – konfiguraci pro stroj 10.10.10.2 tedy uložíme do souboru 0A0A0A02, výchozí konfiguraci pro celou síť 10.10.10.0/24 uložíme do souboru 0A0A0A. Výchozí konfiguraci pro všechny případy uložíme do souboru default.

Obsah souboru může vypadat následovně:

DEFAULT /10.10.10.2/boot/vmlinuz-3.2.11-gentoo
APPEND root=/dev/nfs rw nfsroot=10.10.10.3:/diskless/10.10.10.2 initrd=/10.10.10.2/boot/initrd.img.gz

Na řádku DEFAULT je cesta k jádru relativní ke kořenovému adresáři TFTP serveru (skutečná cesta je tedy /diskless/10.10.10.2/boot/vmlinuz-3.2.11-gentoo). Na řádku APPEND jsou pak argumenty předané jádru. pxelinux načte soubor s jádrem do paměti, případně i initrd (jestliže jej používáme) a předá řízení jádru. Upozornění: pxelinux a další zavaděče nemusejí být v této fázi zrovna dvakrát výkonné. Stahování jádra tedy může trvat déle než obvykle, samotný systém už ale může běžet krásně rychle.

Takto to tedy bylo bez menu. Konfigurace s menu může vypadat následovně:

DEFAULT vesamenu.c32
PROMPT 0

menu title Zeus PXE Boot Menu
MENU WIDTH 80
MENU MARGIN 10
MENU PASSWORDMARGIN 3
MENU ROWS 12
MENU TABMSGROW 18
MENU CMDLINEROW 18
MENU ENDROW 24
MENU PASSWORDROW 11
MENU TIMEOUTROW 20

LABEL bootlocal
        MENU LABEL ^Boot from local disk
        MENU DEFAULT
        localboot 0

LABEL xdmcp
        MENU LABEL ^XDMCP at Zeus
        KERNEL /eros/boot/vmlinuz-3.3.5-gentoo
        APPEND root=/dev/nfs rw nfsroot=10.10.10.3:/diskless/eros ip=dhcp

LABEL nfsroot
        MENU LABEL ^NFSroot only from Zeus
        KERNEL /eros/boot/vmlinuz-3.3.5-gentoo
        APPEND root=/dev/nfs rw nfsroot=10.10.10.3:/diskless/eros ip=dhcp noxdmcp

Bootování ze sítě: pxelinux Bootování ze sítě: pxelinux

Hrátky s barvičkami a rozměry tabulky už ponechám na zvědavém čtenářovi. Stejně tak nechám na čtenářovi konfiguraci NFS serveru.

Linux

link

Při konfiguraci Linuxu a jeho bootu se držím těchto kroků:

Instalace systému se mezi distribucemi liší, u Gentoo je to ale prakticky stejné jako normálně (vyrobíme si systém v chrootu a ten pak nasdílíme přes NFS).

Máte-li v plánu mít kořen souborového systému jen ke čtení – vhodné, pokud sdílíte jednu instalaci systému pro více klientských stanic – mohou být nutné dodatečné úpravy v závislosti na vaši distribuci. Obecný postup je to prostě zkusit a pak ladit obtíže, které vyvstanou. Typickou věcí je mít /etc/mtab jako symbolický odkaz na /proc/mounts.

IP adresa

link

Protože Linux opouští prostředí PXE, které IP adresu má, musí ji Linux opětovně získat. Standardní DHCP klient zde nestačí, protože ten by se musel nejprve stáhnout odněkud ze sítě, kam se ale ještě nedostaneme. Jsou tedy dvě cesty. Tou první je IP adresu určit napevno, což je elegantní řešení, máme-li konfigurační soubor pxelinuxu pro konkrétní IP adresy:

APPEND .... ip=10.10.10.2::10.10.10.1:255.255.255.0

První IP adresa je adresa naší klientské stanice, druhá je výchozí brána a třetí je síťová maska. Nebo prostě napíšeme ip=dhcp a spustí se vestavěný DHCP klient...

Umístění kořene

link

Linux očekává jako kořenový „disk“ nějaký device node, proto jádru dáváme argument root=/dev/nfs. Samotnou cestu ke sdílenému adresáři pak předáváme v argumentu nfsroot, který má podobu nfsroot=adresa-serveru:sdílený-adresář:volby-nfs s tím, že volby jsou nepovinné. Ve volbách se nacházejí obvyklé věci jako rsize, kterými můžeme mimo jiné „poladit výkon“.

Ostatní věci

link

Ostatní věci už vyplývají dle našich potřeb. Je pravděpodobné, že budeme do /home připojovat nějaký další adresář. Kreativitě se meze nekladou – jak je vidět v jednom mém konfiguračním souboru výše, můžeme si z počítače udělat skutečného tenkého klienta přes XDMCP (včetně zvuku, ale o tom třeba někdy příště). Zásahem do bootovací sekvence zase můžeme nechat automaticky spustit třeba multimediální centrum XBMC.

V závislosti na použitém jádře a potřebách může být nutné vytvořit initrd s dodatečnými skripty nebo moduly. V zásadě se ale snažím initrd vyhýbat – do jádra dám minimum pro síťový boot a zbytek modulů se načte dle potřeby v době, když už máme připojené /.

Je to snazší, než si myslíte!

Další články z této rubriky

VDR a DVB-T2, část 2.
VDR a DVB-T2, část 1.
Šifrovaný Proxmox VE 6: ZFS, LUKS, systemd_boot a Dropbear
MapTiler – proměňte obrázek v zoomovatelnou mapu
Syncthing

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.