Bootowanie przez sieć, stacje bezdyskowe na PLD - Remote Network Boot, diskless on PLD

Obecnie najczęściej stosuje się pobieranie parametrów z serwera DHCP przez klienta z PXE (ang. Preboot Execution Environment).

Co potrzebne:

  1. karta sieciowa z opcja bootowania przez sieć (PXE),lub (dla starych kart i komputerów które nie mają opcji PXE) odpowiednio przygotowana dyskietka, CD lub USB-drive z klientem PXE. Jak przygotować masz tutaj:
  2. serwer przekazujący parametry startowe, jeden z poniższych:
    • za pomocą serwera DHCP - pakiet dhcpd (najczęściej stosowane i zalecane).
    • za pomocą serwera PXE - pakie pxe (jeśli nie możesz używać serwera DHCP).
    • za pomocą bootparamd - pakiet bootparamd.
    • za pomoca serwera BOOTP (zalecane jest korzystanie z DHCP które jest następcą BOOTP) - pakiet bootp.
  3. serwer TFTP - pakiet tftpd-hpa (obecnie zalecany do współpracy z pxelinux).
  4. serwer NFS udostępniający zasoby dyskowe (np: root over NFS, swap over NFS) o ile planujemy z nich korzystać a nie tylko z ramdysku - pakiet nfsd.

Konfiguracja serwera DHCP dla stacji bootowanych przez sieć dzięki PXE - Remote Network Boot via PXE

W pliku /etc/dhcpd.conf wpisujemy odpowiednie opcje, poniżej podane są one globalnie dla wszystkich stacji, niektóre z nich można podać dla wybranej grupy stacji lub dla pojedyńczego terminala, (zakładamy że serwer DHCP jest już wstępnie skonfigurowany: Konfiguracja serwera DHCP):

	allow bootp;					# 
	allow booting;					# 
	filename "/pxe/pxelinux.0";			# pełna scieżka do pliku bootloadera dla PXE z pakietu syslinux,
                                                        # jeśli serwer tftp działa w chroot podajemy względną
	option root-path "192.168.0.1:/exports/diskless";	# pełna scieżka do root-path dla terminala (z /etc/exports)
	next-server 192.168.0.1;                        # IP serwera TFTP skąd PXE pobiera pliki
	#range dynamic-bootp 192.168.0.10 192.168.0.20;	# zakres IP przyznawany stacjom bootowanym z sieci,
                                                        # jeśli definiujemy każdą stację osobno nie potrzebujemy
	# opcje specjalne dla pxelinux zobacz opis tutaj http://syslinux.zytor.com/pxe.php
	#	definicje opcji:
	option space pxelinux;
	option pxelinux.magic           code 208 = string;
	option pxelinux.configfile      code 209 = text;
	option pxelinux.pathprefix      code 210 = text;
	option pxelinux.reboottime      code 211 = unsigned integer 32;
	#	deklaracja wartości jakie mają mieć opcje:
	#option pxelinux.magic          f1:00:74:7e;		# 
	#option pxelinux.configfile "pxelinux.cfg/default"; # scieżka do pliku konfiguracyjnego (nie ustawiaj chyba że
                                                            # wiesz co robisz, wiecej tutaj: http://syslinux.zytor.com/pxe.php)
	#option pxelinux.pathprefix "/pxe";		    # prefix
	option pxelinux.reboottime      30;     # czas po ktorym stacja zrobi reboot jesli nie da rady się zabootować
        ping-check = 1;                         # zezwalamy pingować

przykład konfiguracji dla pojedyńczego terminala:

host terminal1{
	hardware ethernet 00:d0:dd:d6:df:d7;
	fixed-address 192.168.0.2;
	next-server 192.168.0.1;			# IP serwera TFTP
	filename "/pxe/memdisk.0";			# pełna scieżka do pliku bootloadera dla PXE z pakietu syslinux
                                                        # jeżeli tftp  działa w chroot podajemy względną
	option root-path "192.168.0.1:/exports/terminals"; # pełna scieżka do root-path dla terminala - z /etc/exports
	}

Instalacja i konfiguracja serwera TFTP dla PXE

poldek -i tftpd-hpa

w PLD aktualnie serwery tftp są standardowo uruchamiane przez inetd: w /etc/sysconfig/rc-inetd/tftpd znajduje się konfiguracja uruchamiania serwera tftp

Następnie tworzymy katalog:

$ mkdir -p /var/lib/tftp/pxe

i umieszczamy następujące pliki:

  • initrd - plik z odpowiednio przygotowanym obrazem initrd
  • pxelinux.0 - bootloader z pakietu syslinux
  • vmlinuz - plik z kernelem

oraz tworzymy katalog:

  • pxelinux.cfg - katalog z plikami konfiguracyjnymi bootloadera

jak widać zawartość jest dość podobna do /boot (i spełnia to samo zadanie)

FIXME Kolejność poszukiwania poszczególnych plików konfiguracyjnych w pxelinux.cfg jest następująca: wpierw szukany jest plik o nazwie takiej samej jak MAC karty terminala czyli np: 00-02-44-90-1F-7B a na końcu szukany jest plik default

Przykładowa zawartośc pliku konfiguracyjnego bootloadera (tutaj dla konkretnej stacji o adresie MAC 00-02-44-90-1F-7B), jesli nie chcesz definiować dla kazdej stacji lub grupy stacji utwórz plik o nazwie default:

	# vim /var/lib/tftp/pxe/pxelinux.cfg/00-02-44-90-1F-7B
	LABEL serwerinit
		KERNEL vmlinuz
		APPEND \
                nfsaddrs=192.168.0.2:192.168.0.1:255.255.255.0:serwer2 \
                ip=192.168.0.2:192.168.0.1:192.168.0.1:255.255.255.0:serwer2:eth0:bootp \
                iniitrd=initrd \
                root=/dev/nfs \
                nfsroot=192.168.0.1:/mnt/hdb2/root/serwer2
		IPAPPEND 1

APPEND przekazuje do ładowanego kernela opcje dodatkowe:

	nfsaddrs=<adres IP terminala>:<adres IP serwera>:<maska podsieci>:<nazwa terminala>
	ip=<adres IP terminala>:<adres IP serweray>:<adres IP serwera x>:<maska podsieci>:<nazwa terminala>:<nazwa interfejsu przez który łączy sie z root-path>:bootp
	iniitrd=<nazwa pliku initrd>
	root=/dev/nfs - wirtualne wpis urządzenia wskazujący ze root-path bedzie po NFS
	nfsroot=<IP serwera NFS>:<scieżka do root-path>:<opcje dla NFS>

Główny system plików (/) po NFS (ROOT over NFS)

przygotowanie ROOTFS

instalujemy pakiety serwera NFS:

# poldek -i install nfs-utils nfs-utils-lock portmap

edytujemy /etc/exports

# vim /etc/exports
/terminals/clients/hostname   hostname.domainname(rw,no_root_squash)
/terminals/clients/etc        *.domainname(ro,no_root_squash)
/terminals/clients/var        *.domainname(ro,no_root_squash)
/terminals/usr                *.domainname(ro,no_root_squash)
/terminals/sbin               *.domainname(ro,no_root_squash)
/terminals/bin                *.domainname(ro,no_root_squash)
/terminals/lib                *.domainname(ro,no_root_squash)
/terminals/home               *.domainname(rw,no_root_squash)

FIXME Są dwa sposoby:

  • obsługa nfs wkompilowana w kernel.
  • poprzez odpowiednio przygotowane initrd.

W pierwszym przypadku w kernel muszą być wkompilowane nastepujące opcje:

CONFIG_IP_PNP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_ROOT_NFS=y

sprawdzić można to na działającym kernelu poprzez:

cat /proc/config.gz | grep -E "CONFIG_IP_PNP|CONFIG_ROOT"

Z pewnych względów lepszy jest jednak sposób drugi (poprzez initrd).

Initrd dla ROOTFS po NFS

Przygotowujemy system plików dla naszych stacji (terminali):

# mkdir -p /terminals
# poldek --install-dist=/terminals setup FHS dev pwdutils chkconfig dhcpcd poldek /
vim geninitrd modutils cpio lilo mount login mingetty kernel

edytujemy plik fstab dla terminali:

# vim /terminals/etc/fstab
server:/terminals/clients/hostname	/		nfs	default  1 1
server:/terminals/bin			/bin		nfs	default  1 1
server:/terminals/usr			/usr		nfs	default  1 1
server:/terminals/sbin			/sbin		nfs	default  1 1
server:/terminals/home			/home		nfs	default  1 1
server:/terminals/lib			/lib		nfs	default  1 1
server:/terminals/clients/etc		/server/etc	nfs	default  1 1
server:/terminals/clients/var		/server/var	nfs	default  1 1

none				/proc		proc	defaults,noauto,gid=17	0 0
none				/sys		sysfs	defaults,noauto,gid=17	0 0
none				/proc/bus/usb	usbfs	defaults,noauto,devgid=78,devmode=0664	0 0

należy wygenerować w PLD odpowiedni initrd w następujący sposób ( WAŻNE: wersja geninitrd >= 9000.2 ):

chroot /terminals /bin/sh

edytujemy /etc/sysconfig/geninitrd :

## dopisujemy tu moduły kart sieciowych ktore bedą używane przez terminale np:
BASICMODULES="e1000 ne2k-pci mii 8139too 3c59x"

generujemy initrd i wychodzimy z chroot:

# /sbin/geninitrd -f -v /boot/initrd-2.6.22.16-3.gz 2.6.22.16-3
geninitrd: WARNING: /proc filesystem not mounted, may cause wrong results or failure.
geninitrd: Using libdir: lib
geninitrd: Using modprobe -c to get modules config
geninitrd: Using /dev/nfs as device for rootfs
geninitrd: Finding modules for device path /dev/nfs
geninitrd: Remember to use `root=/dev/ram0 init=/linuxrc' when starting kernel
geninitrd: or you will have problems like init(xx) being child process of swapper(1).
geninitrd: + cp /bin/initrd-busybox /tmp/initrd.W6tqYb/bin/initrd-busybox
geninitrd: Loading module [sunrpc] without options.
geninitrd: Loading module [lockd] without options.
geninitrd: Loading module [nfs_acl] without options.
geninitrd: Loading module [nfs] without options.
geninitrd: Loading module [e1000] without options.
geninitrd: Loading module [8390] without options.
geninitrd: Loading module [ne2k-pci] without options.
geninitrd: Loading module [mii] without options.
geninitrd: Loading module [8139too] without options.
geninitrd: Loading module [3c59x] without options.
geninitrd: Adding rootfs on NFS support to initrd (dhcp)
rootfs on NFS root=/dev/nfs
geninitrd: Compressing /boot/initrd-2.6.22.16-3.gz
# exit

wygenerowane w ten sposob initrd wraz z kernelem kopiujemy do odpowiedniego katalogu udostepnianego przez tftp.

Przykład dla bootowania przez PXE za pomocą dhcp przy wykorzystaniu RescueCD, prosta konfiguracja (krok po kroku).

# instalujemy potrzebne pakiety 
# dhcpd jest już wstępnie skonfigurowane i działające w sieci, patrz [[http://pl.docs.pld-linux.org/uslugi_dhcpd.html|Serwer DHCP]]
sudo poldek -i syslinux dhcpd tftpd-hpa tftp-hpa
# W /var/lib/tftp przygotowujemy konfiguracje startową dla terminali
# w tym katalogu umieszczamy pliki configuracyjne bootloadera.
mkdir -p /var/lib/tftp/pxe/pxelinux.conf
 # kopiujemy bootloadery z pakietu syslinux
cp /usr/lib/syslinux/pxelinux.0 /var/lib/tftp/pxe/pxelinux.0
cp /usr/lib/syslinux/memdisk /var/lib/tftp/pxe/memdisk
#sciagamy najnowszż wersje RCD
wget http://rescuecd.pld-linux.org/download/2007-06-17/x86/RCDx86_290.iso
# montujemy
mount -o loop RCDx86_290.iso /mnt/cdrom
# kopiujemy pliki z RescueCD
cd /mnt/cdrom
# informacje wyswietlana przy logowaniu
cp boot/iso/linux/boot.msg /var/lib/tftp/pxe
# informacja wyżwietlana po wcisnieciu F1
cp boot/iso/linux/help.msg /var/lib/tftp/pxe
# obraz z programem memtest
cp boot/iso/linux/memtest /var/lib/tftp/pxe
# initrd z RescueCD
cp rescue.cpi /var/lib/tftp/pxe
# kernel
cp boot/isolinux/vmlinuz /var/lib/tftp/pxe
# edytujemy pliki konfiguracyjne:

Edytujemy /etc/dhcpd.conf

## wybrane opcje: tutaj w sekcji global ale mozna też dla konkretnych stacji niektore opcje ustawic ##########
allow bootp;
allow booting;
filename "/pxe/pxelinux.0";
# option root-path "192.168.0.1:/home/services/diskless";
next-server 192.168.0.1;                                   # adres IP serwera tftp
#range dynamic-bootp 192.168.0.10 192.168.0.20;            # zakres IP przyznawany stacjom bootowanym 
                                                           # jeśli definiujemy każdą stację osobno nie potrzebujemy
# pxelinux option see: http://syslinux.zytor.com/pxe.php
# custom options for pxelinux
option space pxelinux;
option pxelinux.magic           code 208 = string;
option pxelinux.configfile      code 209 = text;
option pxelinux.pathprefix      code 210 = text;
option pxelinux.reboottime      code 211 = unsigned integer 32;
#option pxelinux.magic          f1:00:74:7e;
#option pxelinux.configfile "pxelinux.cfg/default";
#option pxelinux.pathprefix "/pxe";
option pxelinux.reboottime      30;

edytujemy plik menu netbootloadera:

$ sudo vim /var/lib/tftp/pxe/pxelinux.conf/default
default local
prompt 1
display boot.msg
F1 help.msg
timeout 20

LABEL linuxnet
	kernel vmlinuz
	append initrd=/rescue.cpi init=/linuxrc root=/dev/ram0  ramdisk_size=54000
	ipappend 1

LABEL linuxnetconsole
	kernel vmlinuz
	append initrd=/rescue.cpi init=/linuxrc root=/dev/ram0  ramdisk_size=54000 console=tty0 console=ttyS0,9600n81

# kilka przydatnych przykładowych wpisów

LABEL memtest
	kernel memtest

LABEL local
	LOCALBOOT 0 # uruchomienie systemu lokalnego (np: z dysku)

LABEL winnet
	KERNEL memdisk
        # przykład dla windows. Utwórz boot-dyskietke pod windows.
        # Upewnij się że pozwala na uruchomienie komputera, następnie utwórz plik w poniższy sposób:
        # dd if=/dev/floppy of=/var/lib/tftp/pxe/win.img bs=1024 count=1440
	APPEND initrd=win.img
LABEL next
	localboot -1

LABEL hd0
	localboot 0x80

LABEL hd1
	localboot 0x81

LABEL floppy
	localboot 0x00
# ustawiamy właściciela dla plików
$ sudo chown -R tftp:root /var/lib/tftp/pxe

# zmiana uprawnien dla podkatalogow i plików - tylko odczyt dla root
# (mozesz zmienic na 755 dla katalogow i 644 dla plików)
$ sudo find /var/lib/tftp/pxe -type d -exec chmod 500 "{}" \;
$ sudo find /var/lib/tftp/pxe -type f -exec chmod 400 "{}" \;

# restartujemy usługi
$ sudo /etc/init.d/dhcpd restart
$ sudo /etc/init.d/rc-inetd restart

Testowanie instalacji

  1. sprawdzamy czy nie blokuje iptables, wyłaczamy reguły i ustawiamy domyślną polityke na ACCEPT
    • # sudo iptables -L
      # sudo iptables -t nat -L
      # sudo iptables -t mangle -L
       
  2. sprawdzamy czy dhcp nasłuchuje na porcie 67
    • # sudo netstat -nulp | grep '67.*dhcp'
      udp        0      0 0.0.0.0:67              0.0.0.0:*                           22691/dhcpd 
  3. sprawdzamy czy serwer tftpd słucha na porcie 69
    • # sudo netstat -nulp | grep '69.*inetd'
      udp        0      0 0.0.0.0:69              0.0.0.0:*                           3610/inetd 
  4. testujemy czy możemy pobrać bootloader po tftp (klient z pakietu tftp-hpa), zastąp SERVER_IP adresem IP swojego serwera.
    • # cd /tmp
      # echo 'get pxe/pxelinux.0' | tftp-hpa SERVER_IP
      # ls -l pxelinux.0

Inne sposoby

Dodatki

Literatura:

pl/przewodniki/pxe.txt · ostatnio zmienione: 2008/10/24 12:44 przez grizz
chimeric.de = chi`s home Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0 Powered by Lighttpd - fly light