====== 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:
- 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:
* [[http://www.etherboot.org/wiki/howtos|www.etherboot.org]]
* [[http://www.rom-o-matic.net/|www.rom-o-matic.net]]
- 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.
- serwer TFTP - pakiet tftpd-hpa (obecnie zalecany do współpracy z pxelinux).
- 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: [[http://pl.docs.pld-linux.org/uslugi_dhcpd.html|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=:::
ip=::::::bootp
iniitrd=
root=/dev/nfs - wirtualne wpis urządzenia wskazujący ze root-path bedzie po NFS
nfsroot=::
===== 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 ====
- 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
- 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
- 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
- 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 ====
* [[http://www.etherboot.org/wiki/httpboot| bootowanie po HTTP]]
* [[http://www.etherboot.org/wiki/sanboot|Boot z SAN po iSCSI lub AoE]]
=== Dodatki ===
* [[http://www.emboot.com/faq-pxe.shtml|Kody statusu/błędów PXE]]
=== Literatura: ===
* http://andrzej.dopierala.name/2007-06-02_Bootowanie_systemu_z_pxe_na_nowych_komputerach
* http://rescuecd.pld-linux.org/download/2007-06-17/PXE.txt
* http://oceanic.wsisiz.edu.pl/~lukasz/Diskless.pl.html
* http://oceanic.wsisiz.edu.pl/~lukasz/xterm.html
* http://oceanic.wsisiz.edu.pl/~lukasz/nfsroot.txt
* http://oceanic.wsisiz.edu.pl/~lukasz/NFS-Root.pl.txt
* http://oceanic.wsisiz.edu.pl/~lukasz/NFS-Root-Client.pl.txt
* http://www.linux-boot.net/Scripts/InitRD/howto.html
* http://www.linux-boot.net/RootFS/
* http://www.microsoft.com/technet/prodtechnol/windowsserver2003/pl/library/ServerHelp/22d1f48c-4c68-4c9a-a6f8-16a9ac3e0ce9.mspx
* http://pl.wikipedia.org/wiki/BOOTP
* http://www.herdsoft.com/ti/as400/ipcs/6_Expiriences.html
* http://www.beowulf.org/archive/2001-July/004265.html
* http://minibo.iele.polsl.gliwice.pl/~pz/zajecia/Linux/streszczenie/node212.html
* http://www.ltsp.org/documentation/ltsp-3.0-4-pl.pdf
* http://quietsche-entchen.de/cgi-bin/wiki.cgi/-ariane,/ArianeBootSequence
* http://www.vergenet.net/linux/diskless/
* http://adas.artikon.one.pl/PLD/Initrd.txt
* http://pl.docs.pld-linux.org/konfiguracja_geninitrd.html
* http://team.pld.org.pl/~klakier/doc/install/pl/