Obecnie najczęściej stosuje się pobieranie parametrów z serwera DHCP przez klienta z PXE (ang. Preboot Execution Environment).
Co potrzebne:
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
}
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:
oraz tworzymy katalog:
jak widać zawartość jest dość podobna do /boot (i spełnia to samo zadanie)
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>
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)
Są dwa sposoby:
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).
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.
# 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
# sudo iptables -L # sudo iptables -t nat -L # sudo iptables -t mangle -L
# sudo netstat -nulp | grep '67.*dhcp' udp 0 0 0.0.0.0:67 0.0.0.0:* 22691/dhcpd
# sudo netstat -nulp | grep '69.*inetd' udp 0 0 0.0.0.0:69 0.0.0.0:* 3610/inetd
# cd /tmp # echo 'get pxe/pxelinux.0' | tftp-hpa SERVER_IP # ls -l pxelinux.0