Bezdyskowa stacja robocza na bazie Gentoo
1.
Wprowadzenie
O przewodniku
Przewodnik pomaga skonfigurować bezdyskową stację roboczą opartą o
dystrybucję Gentoo Linux. W zamierzeniach ma być tak przyjazny dla
początkującego użytkownika Linuksa, jak tylko możliwe. W końcu każdy z nas
kiedyś był początkujący :) Zaawansowani użytkownicy mogliby z łatwością powiązać
różnorodne przewodniki o bezdyskowych stacjach oraz konfiguracji sieci i zrobić
to samodzielnie. Mamy jednak nadzieję, że niniejszy dokument ułatwi instalację
wszystkim zainteresowanym użytkownikom, zarówno początkującym jak i
zaawansowanym.
Czym jest bezdyskowa stacja?
Bezdyskowa stacja to przeważnie PC bez typowych urządzeń uruchomieniowych
takich jak twarde dyski, stacje dyskietek lub napędy CD. Bezdyskowe stacje
uruchamiają się z sieci i dlatego potrzebują serwera, który dostarcza
przestrzeni na składowanie danych, analogicznie do twardego dysku. Od tego
momentu taki serwer będziemy określali mianem master, natomiast
bezdyskową stację nazywali slave. Bezdyskowy komputer musi posiadać
kartę sieciową, która wspiera uruchamianie z PXE lub Etherboot; pod adresem
Etherboot.org znajduje się lista
wspieranych urządzeń. Większość nowych kart sieciowych wspiera PXE, podobnie
karty zintegrowane z płytami głównymi.
Zanim zaczniemy
Zakładamy, że na komputerze master jest zainstalowane Gentoo oraz jest tam
wystarczającą ilość wolnego miejsca na składowanie systemu plików dla maszyn
slave. Musimy upewnić się że posiadamy jeden interfejs sieciowy, z połączeniem
do internetu, który jest oddzielony od połączenia z siecią lokalną.
2.
Konfiguracja maszyn: master i slave
O kernelach
Kernel to program, który pośredniczy między sprzętem a innymi programami, które
mamy na naszym komputerze. W skrócie: kernel stanowi centrum nowoczesnego
systemu operacyjnego. Kiedy uruchamiamy komputer, BIOS wykonuje instrukcje
znajdujące się w zarezerwowanym obszarze twardego dysku. Te instrukcje są
przeważnie boot loaderem, który ładuje kernel. Po tym jak kernel zostanie
załadowany, wszystkie procesy są przez niego obsługiwane.
Więcej informacji o kernelach i ich konfiguracji można znaleźć w przewodniku po kernelu.
Konfiguracja kernela na komputerze master
Kernel na maszynie master może być tak duży i dostosowany do potrzeb jak tylko
to potrzebne. Jednakże trzeba zaznaczyć kilka niezbędnych opcji. Przejdźmy do
menu konfiguracyjnego kernela wpisując:
Listing 2.1: Edycja konfiguracji kernela na komputerze master |
# cd /usr/src/linux
# make menuconfig
|
Naszym oczom powinno się ukazać szaroniebieskie menu stanowiące alternatywę
dla ręcznej edycji pliku /usr/src/linux/.config. Jeśli kernel
działa prawidłowo, to można zachować bieżący plik konfiguracyjny. Wystarczy
wyjść z menu i napisać:
Listing 2.2: Tworzenie kopii zapasowej konfiguracji kernela na komputerze master |
# cp .config .config_working
|
Wejdźmy do następujących elementów menu i upewnijmy się, że wymienione niżej
opcje są zaznaczone do wkompilowania (lecz NIE jako moduły). Poniższa
lista wzorowana jest na kernelu w wersji 2.6.10. W innej wersji tekst oraz
kolejność mogą się różnic. Należy zaznaczyć przynajmniej opcje pokazane poniżej.
Listing 2.3: Opcje kernela na komputerze master |
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
Device Drivers --->
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[ ] Network packet filtering (replaces ipchains)
File systems --->
Network File Systems --->
<*> NFS server support
[*] Provide NFSv3 server support
[*] Network packet filtering (replaces ipchains)
IP: Netfilter Configuration --->
<*> Connection tracking (required for masq/NAT)
<*> IP tables support (required for filtering/masq/NAT)
|
Możliwość filtrowania pakietów możemy zapewnić poprzez dodanie modułów. Zalecamy
przeczytanie rozdziału o
firewallach, z przewodnika Gentoo Security i o tym jak je prawidłowo
skonfigurować.
Uwaga:
Wymienione opcje powinny być jedynie dodane do konfiguracji kernela naszego
systemu. Nie należy traktować tego jako całkowitego zastąpienia bieżącej
konfiguracji.
|
Po skonfigurowaniu kernela na komputerze master, należy go zbudować:
Listing 2.4: Rekompilacja kernela i modułów na komputerze master |
# make && make modules_install
# cp arch/i386/boot/bzImage /boot/bzImage-master
|
Następnie dodajemy wpis dla nowego kernela w pliku lilo.conf lub
grub.conf, w zależności od tego jaki boot loader posiadamy.
Ustawiamy nowy kernel jako standardowy. Po tym jak bzImage został skopiowany
do katalogu startowego, wszystko co pozostaje zrobić to ponownie uruchomić
maszynę, tak by nowe ustawienia zostały załadowane.
O kernelu dla maszyny slave
Zaleca się skompilowanie kernela dla maszyny slave bez jakichkolwiek modułów,
gdyż ładowanie i ich zdalna konfiguracja jest trudnym i zbędnym procesem. Co
więcej, kernel dla maszyny slave powinien być tak mały i spójny jak to tylko
możliwe, by mógł być efektywnie ładowany z sieci. Skompilujemy kernel dla
maszyny slave w tej samej lokalizacji, w której kernel dla maszyny master był
konfigurowany.
Dobrym pomysłem jest utworzenie kopii zapasowej pliku konfiguracyjnego kernela
dla maszyny master. Dzięki temu unikniemy zamieszania i straty czasu. Kopię
wykonujemy wpisując:
Listing 2.5: Tworzenie kopii zapasowej konfiguracji dla kernela maszyny master |
# cp /usr/src/linux/.config /usr/src/linux/.config_master
|
Chcemy skonfigurować kernel dla maszyny slave, w ten sam sposób, w który
konfigurowaliśmy kernel dla maszyny master. Mamy możliwość rozpoczęcia
prac ze 'świeżym' plikiem konfiguracyjnym, wystarczy, że przywrócimy
/usr/src/linux/.config wpisując:
Listing 2.6: Przywracanie pliku konfiguracyjnego kernela |
# cd /usr/src/linux
# cp .config_master .config
|
Teraz przechodzimy do menu konfiguracyjnego przez wpisanie:
Listing 2.7: Edycja konfiguracji kernela dla maszyny slave |
# cd /usr/src/linux
# make menuconfig
|
Upewnijmy się że zaznaczone są następujące opcje jako mające być wbudowane
w kernel, lecz NIE jako moduły:
Listing 2.8: opcje kernela slave |
Code maturity level options --->
[*] Prompt for development and/or incomplete code/drivers
Device Drivers --->
[*] Networking support
Networking options --->
<*> Packet socket
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: multicasting
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support (NEW)
File systems --->
Network File Systems --->
<*> file system support
[*] Provide NFSv3 client support
[*] Root file system on NFS
|
Uwaga:
Można zrezygnować z serwera DHCP na rzecz serwera BOOTP.
|
Ważne:
Istotne jest by na stacjach roboczych obsługę karty sieciowej wkompilować w
kernel (a nie budować jako moduł). W ogólności używanie modułów nie stanowi
problemu dla stacji bezdyskowych.
|
Teraz nadszedł czas by skompilować kernel dla maszyny slave. W tym miejscu
należy wykazać się ostrożnością i nie zepsuć modułów (jeśli jakieś są), które
zostały zbudowane dla maszyny master.
Listing 2.9: Kompilacja kernela slave |
# cd /usr/src/linux
# make
|
Na komputerze master tworzymy katalog, który będzie zawierał niezbędne pliki
systemowe oraz dane stacji bezdyskowych. W przewodniku używamy katalogu
/diskless, ale można wybrać dowolną lokalizację. Skopiujmy obraz
kernela, dla maszyny slave, do katalogu /diskless:
Uwaga:
Jeśli używamy różnych architektur możemy zapisać każdy plik konfiguracyjny w
pliku .config_arch. To samo robimy z obrazami kerneli: zapisujemy
je w katalogu /diskless jako bzImage_arch.
|
Listing 2.10: Kopiowanie kernela dla maszyny slave |
# mkdir /diskless
# cp /usr/src/linux/arch/i386/boot/bzImage /diskless
|
Konfiguracja wstępnego systemu plików dla maszyny slave
Systemy plików dla maszyn master i slave mogą być często modyfikowane.
Obecnie interesuje nas tylko stworzenie wstępnego systemu plików,
złożonego z plików konfiguracyjnych i punktów montowań. Na początek musimy
utworzyć katalog, dla pierwszej maszyny slave, w obrębie /diskless.
Każdy komputer slave musi mieć własny system plików, gdyż współdzielenie pewnych
plików systemowych, może spowodować problemy z uprawnieniami i prowadzić do
ciężkich awarii. Chociaż katalogom można nadawać dowolne nazwy, to jednak
zalecamy używać adresów IP maszyn slave, gdyż adresy te są unikalne i nie
wprowadzają zamieszania. Załóżmy, że statyczny adres IP naszej pierwszej maszyny
slave to np. 192.168.1.21:
Listing 2.11: Tworzenie zdalnego katalogu głównego |
# mkdir /diskless/192.168.1.21
|
Różne pliki konfiguracyjne, z katalogu /etc, muszą zostać
zmienione by prawidłowo działać na komputerze slave. Z maszyny master
kopiujemy katalog /etc do katalogu głównego maszyny slave,
wpisując:
Listing 2.12: Tworzenie /etc na komputerze slave |
# cp -r /etc /diskless/192.168.1.21/etc
|
System plików nadal nie jest gotowy, gdyż potrzebne są różne katalogi i punkty
montowania. By je utworzyć wpisujemy:
Listing 2.13: Tworzenie punktów montowań i katalogów w systemie plików na komputerze slave |
# mkdir /diskless/192.168.1.21/home
# mkdir /diskless/192.168.1.21/dev
# mkdir /diskless/192.168.1.21/proc
# mkdir /diskless/192.168.1.21/tmp
# mkdir /diskless/192.168.1.21/mnt
# chmod a+w /diskless/192.168.1.21/tmp
# mkdir /diskless/192.168.1.21/mnt/.initd
# mkdir /diskless/192.168.1.21/root
# mkdir /diskless/192.168.1.21/sys
# mkdir /diskless/192.168.1.21/var
# mkdir /diskless/192.168.1.21/var/empty
# mkdir /diskless/192.168.1.21/var/lock
# mkdir /diskless/192.168.1.21/var/log
# mkdir /diskless/192.168.1.21/var/run
# mkdir /diskless/192.168.1.21/var/spool
# mkdir /diskless/192.168.1.21/usr
# mkdir /diskless/192.168.1.21/opt
|
Większość katalogów "szkieletowych" powinna wyglądać znajomo; Katalogi typu
/dev czy /proc zostają wypełnione podczas startu
maszyny slave, inne będą podmontowane później. Należy także zmienić plik
/diskless/192.168.1.21/etc/conf.d/hostname, by odzwierciedlić
nazwę maszyny slave. Binaria, biblioteki i inne pliki zostaną dodane w dalszej
części tego przewodnika, tuż przed próbą uruchomienia maszyny slave.
Mimo tego, że /dev jest wypełniany przez udev, należy
utworzyć wpis console. Jeśli tego nie zrobimy, to będzie pojawiał
się błąd "unable to open initial console".
Listing 2.14: Tworzenie wpisu console w /dev |
# mknod /diskless/192.168.1.21/dev/console c 5 1
|
3.
Konfiguracja serwera DHCP
O serwerze DHCP
DHCP jest skrótem dla Dynamic Host Configuration Protocol. Serwer DHCP jest
pierwszą maszyną, z którą komputer slave komunikuje się podczas uruchamiania
z PXE. Podstawowym zadaniem serwera DHCP jest przydzielenie adresu IP. Serwer
DHCP jest w stanie przypisać adres IP na podstawie adresów MAC kart sieciowych
klientów. Jak tylko komputer slave uzyska adres IP, serwer DHCP przekazuje jej
informację skąd wziąć bazowy system plików oraz kernel.
Zanim zaczniemy
Zanim zaczniemy należy sprawdzić czy wymagane komponenty działają
poprawnie. Na początek sprawdzamy połączenie sieciowe:
Listing 3.1: Sprawdzanie konfiguracji sieciowej |
# ifconfig eth0 multicast
# ifconfig -a
|
Trzeba upewnić się że interfejs eth0 funkcjonuje prawidłowo. Powinno
to wyglądać mniej więcej tak:
Listing 3.2: Prawidłowo działający interfejs eth0 |
eth0 Link encap:Ethernet HWaddr 00:E0:83:16:2F:D6
inet addr:192.168.1.1 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:26460491 errors:0 dropped:0 overruns:2 frame:0
TX packets:32903198 errors:0 dropped:0 overruns:0 carrier:1
collisions:0 txqueuelen:100
RX bytes:2483502568 (2368.4 Mb) TX bytes:1411984950 (1346.5 Mb)
Interrupt:18 Base address:0x1800
|
Musi być napisane MULTICAST. Jeśli tak nie jest, to trzeba przebudować
kernel tak by zawierał wsparcie dla multicast.
Instalacja serwera DHCP
Jeśli w naszej sieci nie ma jeszcze serwera DHCP, to go instalujemy:
Listing 3.3: Instalacja serwera dhcp |
# emerge dhcp
|
Jeśli w sieci już jest zainstalowany serwer DHCP pozostaje wyedytować plik
konfiguracyjny, by uruchamianie z PXE funkcjonowało prawidłowo.
Konfigurowanie serwera DHCP
Jest tylko jeden plik konfiguracyjny, który należy wyedytować przed
uruchomieniem serwera DHCP: /etc/dhcp/dhcpd.conf. Kopiujemy
i edytujemy dostarczony plik przykładowy:
Listing 3.4: Edycja pliku konfiguracyjnego serwera dhcp |
# cp /etc/dhcp/dhcpd.conf.sample /etc/dhcp/dhcpd.conf
# nano -w /etc/dhcp/dhcpd.conf
|
Ogólny układ pliku to sformatowana struktura, która wygląda tak:
Listing 3.5: Przykładowy plik dhcpd.conf |
ddns-update-style none;
shared-network LOCAL-NET {
subnet 192.168.1.0 netmask 255.255.255.0 {
host slave{
}
group {
}
}
}
|
Blok shared-network jest opcjonalny i powinien być używany dla
tych IP, które chcemy przypisać, a które należą do tej samej topologii sieci.
W pliku musi zostać zadeklarowana przynajmniej jedna sekcja subnet.
Niewymagany blok group pozwala zebrać opcje charakterystyczne dla grupy
wpisów. Dobry przykład pliku dhcpd.conf wygląda tak:
Listing 3.6: Przykładowy plik dhcpd.conf |
#
# Przykładowy plik dhcpd.conf dla klientów bezdyskowych
#
# Wyłączanie dynamicznych DNS
ddns-update-style none;
# Zakładamy jedną domyślną bramkę wyjściową dla IP
option routers 192.168.1.1;
# Zapewniamy informację o DNS dla klientów
option domain-name-servers 192.168.1.1;
option domain-name "mydomain.com";
# Wyszczególniamy, który serwer TFTP ma zostać użyty
next-server 192.168.1.1;
# Deklarujemy opcje bufora zapewniającego dla klientów PXE:
# Code 1: adres Multicast IP startowego serwera plików
# Code 2: port UDP, na którym klient powinien sprawdzać odpowiedzi MTFTP
# Code 3: port UDP, którego używa serwer MTFTP do nasłuchiwania zapytań
# Code 4: liczba sekund, przez które klient musi monitorować aktywność, zanim
# spróbuje rozpocząć nowy transfer MTFTP
# Code 5: Liczba sekund przez które klient musi nasłuchiwać, zanim ponownie
# uruchomi transferMTFTP
option space PXE;
option PXE.mtftp-ip code 1 = ip-address;
option PXE.mtftp-cport code 2 = unsigned integer 16;
option PXE.mtftp-sport code 3 = unsigned integer 16;
option PXE.mtftp-tmout code 4 = unsigned integer 8;
option PXE.mtftp-delay code 5 = unsigned integer 8;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.discovery-mcast-addr code 7 = ip-address;
# Należy zdeklarować podsieć, gdzie będą się znajdowały nasze bezdyskowe węzły
subnet 192.168.1.0 netmask 255.255.255.0 {
class "pxeclients" {
match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
vendor-option-space PXE;
# Przynajmniej jedna z opcji PXE, charakterystycznych dla dostawcy, musi
# być ustawiona, by boot ROMy klienta wiedziały, że jesteśmy serwerem
# zdolnym obsłużyć PXE. Ustawiamy adres MCAST IP na 0.0.0.0, aby boot ROMy
# wiedziały, że nie jesteśmy w stanie dostarczyć multicat TFTP (adres
# 0.0.0.0 oznacza brak adresu).
option PXE.mtftp-ip 0.0.0.0;
# Nazwa pliku, który boot ROMy powinny ściągnąć.
filename "pxelinux.0";
}
# Należy zapewnić klientom etherboot odpowiednie informacje
class "etherboot" {
match if substring(option vendor-class-identifier, 0, 9) = "Etherboot";
filename "vmlinuz_arch";
}
# Dodajemy jedną deklarację hosta dla każdego bezdyskowego hosta
host slave21 {
hardware ethernet 00:40:63:C2:CA:C9;
fixed-address 192.168.1.21;
}
}
|
Uwaga:
Nie ma żadnych przeciwwskazań do jednoczesnego używania PXE i Etherboot.
Powyższa konfiguracja jest zaledwie przykładem. W razie wątpliwości należy
zapoznać się z dokumentacją DHCPd.
|
Maszyna z adresem IP po wpisie next-server, będzie odpytana o wskazany
plik filename. Wartość ta powinna odpowiadać adresowi IP serwera tftp,
przeważnie jest taka sama jak adres IP maszyny master. Nazwa filename
jest podana względem katalogu /diskless (jest to spowodowane
opcjami serwera tftp i zostanie omówione w dalszej części). Wewnątrz bloku
host, opcja hardware ethernet określa adres MAC,
fixed-address przypisuje stały adres IP do konkretnego adresu MAC.
Strona manuala dhcpd.conf może okazać się bardzo pomocna, ponieważ
zawiera opisy opcji nie znajdujących się w tym HOWTO. Można ją przeczytać
wpisując:
Listing 3.7: Przeglądanie stron podręcznika dla pliku dhcpd.conf |
# man dhcpd.conf
|
Uruchamianie serwera DHCP
Przed uruchomieniem skryptu startowego dhcp, edytujemy plik
/etc/conf.d/dhcp, tak by wyglądał mniej więcej tak:
Listing 3.8: Przykładowy plik /etc/conf.d/dhcp |
IFACE="eth0"
|
Zmienna IFACE określa interfejs sieciowy na którym dostępny jest serwer
DHCP. W tym przypadku jest to eth0. Dodawanie kolejnych argumentów do
zmiennej IFACE może być użyteczne w przypadku złożonych sieci, gdy mamy
wiele kart sieciowych. Serwer dhcp uruchamiamy wpisując:
Listing 3.9: Uruchamianie serwera dhcp na komputerze master |
# /etc/init.d/dhcp start
|
W celu dodania serwera dhcp do skryptów startowych należy wpisać:
Listing 3.10: Dodawanie serwera dhcp do standardowego poziomu uruchamiania na komputerze master |
# rc-update add dhcp default
|
Kłopoty z serwerem DHCP
Chcąc zobaczyć czy stacja startuje poprawnie, można obejrzeć plik
/var/log/messages. Jeśli stacja uruchomi się poprawie, to plik
messages powinien na końcu zawierać linie wyglądające tak:
Listing 3.11: Przykładowe wpisy z logów utworzonych przez dhcp |
DHCPDISCOVER from 00:00:00:00:00:00 via eth0
DHCPOFFER on 192.168.1.21 to 00:00:00:00:00:00 via eth0
DHCPREQUEST for 192.168.1.21 from 00:00:00:00:00:00 via eth0
DHCPACK on 192.168.1.21 to 00:00:00:00:00:00 via eth0
|
Uwaga:
Plik z logiem może okazać się pomocny przy ustalaniu adresów MAC maszyn slave.
|
Jeśli otrzymujemy następujący komunikat, oznacza to, że prawdopodobnie z plikiem
konfiguracyjnym jest coś nie tak, ale serwer DHCP działa prawidłowo.
Listing 3.12: Przykładowy błąd serwera dhcp |
no free leases on subnet LOCAL-NET
|
Każdorazowa zmiana konfiguracji wymaga ponownego uruchomienia serwera DHCP.
Serwer uruchamiamy komendą:
Listing 3.13: Ponowne uruchamianie serwera dhcp na mszyanie master |
# /etc/init.d/dhcpd restart
|
4.
Konfiguracja serwera TFTP oraz PXE Linux Bootloadera i/lub Etherboot
O serwerze TFTP
TFTP jest skrótem od Trivial File Transfer Protocol. Zadaniem serwera TFTP jest
dostarczanie, maszynom slave, bazowego sytemu plików oraz kernela. Wszystkie
kernele i bazowe systemy plików będą składowane na serwerze TFTP, więc
prawdopodobnie to dobry pomysł, by maszynę master uczynić serwerem TFTP.
Instalacja serwera TFTP
Wysoce zalecany serwer tftp jest dostępny w portage jako pakiet tft-hpa.
Tak się składa, że serwer tftp jest napisany przez autora SYSLINUX i działa
bardzo dobrze z pxelinux. Instalujemy wpisując:
Listing 4.1: Instalacja serwera tfp |
# emerge tftp-hpa
|
Konfiguracja serwera TFTP
Edytujemy plik /etc/conf.d/in.tftpd. Należy w nim określić
katalog domowy serwera tftp poprzez zmienną INTFTPD_PATH, a
wszelkie opcje przekazywane w linii poleceń, umieścić w zmiennej
INTFTPD_OPTS. Powinno to wyglądać mniej więcej tak:
Listing 4.2: Przykładowy plik /etc/conf.d/in.tftpd |
INTFTPD_PATH="/diskless"
INTFTPD_OPTS="-l -v -s ${INTFTPD_PATH}"
|
Opcja -l oznacza, że serwer nasłuchuje w trybie STAND ALONE, więc nie
trzeba uruchamiać intetd. Opcja -v powoduje zwiększenie poziomu
logowania/raportowania błędów. Opcja -s /diskless określa katalog główny
serwera tftp.
Uruchamianie serwera TFTP
Serwer uruchamiamy przez wpisanie:
Listing 4.3: Uruchamianie serwera tftp na komputerze master |
# /etc/init.d/in.tftpd start
|
Serwer tftp powinien zostać uruchomiony z opcjami, które zostały określone
w pliku /etc/conf.d/in.tftpd. Serwer może być uruchamiany podczas
startu systemu, wystarczy wpisać:
Listing 4.4: Dodawanie serwera tftp do standardowego poziomu uruchamiania na komputerze master |
# rc-update add in.tftpd default
|
O PXELINUX
Tę sekcję możemy pominąć, jeśli używamy tylko Etherboot.
PXELINUX jest sieciowym odpowiednikiem LILO lub GRUBa i jest obsługiwany przez
TFTP. Właściwie jest to niewielki zbiór instrukcji, które informują klienta,
gdzie należy szukać kernela i bazowego systemu plików oraz pozwalają na
przekazywanie różnych opcji do kernela.
Zanim zaczniemy
Będzie nam potrzebny plik pxelinux.0, który znajduje się w pakiecie SYSLINUX
autorstwa H. Peter Anvina. Pakiet można zainstalować wpisując:
Listing 4.5: Instalowanie syslinux |
# emerge syslinux
|
Ustawianie PXELINUX
Uwaga:
Nie jest to potrzebne dla Etherboot.
|
Przed uruchomieniem serwera tftp trzeba ustawić pxelinux. Na początku kopiujemy
binarkę pxelinux do katalogu /diskless:
Listing 4.6: Ustawianie zdalnego bootloadera |
# cp /usr/share/syslinux/pxelinux.0 /diskless
# mkdir /diskless/pxelinux.cfg
# touch /diskless/pxelinux.cfg/default
|
Spowoduje to utworzenie standardowego pliku konfiguracyjnego bootloadera.
Binarka pxelinux.0 będzie szukać w katalogu
pxelinux.cfg, pliku którego nazwa jest adresem IP klienta. Adresem
zapisanym szesnastkowo. Jeśli nie znajdzie takiego pliku, usunie skrajnie prawą
cyfrę z nazwy pliku i spróbuje ponownie, aż skończą się cyfry. Wersje syslinux'a
2.05 i późniejsze, najpierw szukają pliku o nazwie będącej postacią adresu MAC.
Jeśli nie ma takiego pliku, to wykonywana jest - opisana wcześniej - procedura
wyszukująca. Jeśli żaden plik nie został znaleziony, to używany jest plik
default.
Listing 4.7: Kolejne pliki, które poszukiwane są przez PXE w pxelinux.cfg/ |
01-00-40-63-c2-ca-c9
C0A80115
C0A8011
C0A801
C0A80
C0A8
C0A
C0
C
default
|
Uwaga:
Wszystkie wpisy małymi literami.
|
Zacznijmy od pliku default:
Listing 4.8: Przykładowy plik pxelinux.cfg/default |
DEFAULT /bzImage
APPEND ip=dhcp root=/dev/nfs nfsroot=192.168.1.1:/diskless/192.168.1.21
|
Znacznik DEFAULT wskazuje pxelinux'owi obraz bzImage, wcześniej
przygotowanego kernela. Znacznik APPEND dodaje opcje startowee dla jądra.
Z uwagi na to, że skompilowaliśmy kernel dla maszyny slave z
NFS_ROOT_SUPPORT, to będziemy musieli określić tutaj katalog nfsroot.
Pierwsze z adresów IP to IP maszyny master, zaś drugie IP to nazwa katalogu,
który został stworzony w /diskless z myślą o składowaniu bazowego
systemu plików maszyn slave.
O Etherboot
Uwaga:
Można to pominąć w przypadku, gdy nie korzystamy z uruchamiania PXE.
|
Etherboot uruchamia sieciowe obrazy startowe z serwera TFTP. Podobnie jak PXE,
Etherboot jest równoważny z LILO lub GRUBem. Narzędzie mknbi umożliwia
tworzenie różnych obrazów z różnymi opcjami.
Zanim zaczniemy
Potrzebujemy programu mknbi (narzędzie do tworzenia bootowalnych obrazów
kernela stosowanych przy uruchamianiu z sieci), by tworzyć obrazy Etherboot. To
narzędzie stworzy skonfigurowany obraz kernela na podstawie oryginalnego
kernela. Obraz będzie zawierał opcje, takie jak wymieniono w dalszej części.
Listing 4.9: Instalacja mknbi |
# emerge mknbi
|
Tworzenie Etherboot
W tym rozdziale stworzymy prosty obraz etherboot. Jako, że serwer dhcp wskazuje
klientom ścieżkę do katalogu głównego w opcji "option root-path" pliku
dhcpd.conf, to nie musimy jej tutaj załączać. Więcej informacji można znaleźć w
podręczniku dla mknbi.
Listing 4.10: podręcznik dla mknbi |
# man mknbi
|
Tworzenie obrazu startowego. Zostanie utworzony bootowalny obraz ELF będący w
stanie przekazać do kernela parametry dhcp i ścieżkę do katalogu głównego.
Ponadto kernel zostanie zmuszony do znalezienia serwera dhcp w sieci.
Listing 4.11: tworzenie obrazów netboot |
# mkelf-linux -ip=dhcp /diskless/bzImage > /diskless/vmlinuz
|
Uwaga:
Przy obrazach specyficznych dla architektury należy wpisać bzImage_arch i
vmlinuz_arch.
|
Problemy z procesem uruchamiania z sieci
Jest kilka sposobów na testowanie procesu uruchamiania z sieci. Podstawowy
to wykorzystanie narzędzia o nazwie tcpdump. Jeśli chcemy zainstalować
tcpdump'a wpisujemy po prostu:
Listing 4.12: Instalacja programu tcpdump |
# emerge tcpdump
|
Teraz możemy analizować ruch sieciowy i upewnić się, że komunikacja
klient/serwer funkcjonuje prawidłowo. Jeśli coś nie działa, to należy
wykluczyć kilka przyczyn. Na początek sprawdzamy czy klient/serwer są fizycznie
połączone, a kable sieciowe nie są uszkodzone. Jeśli klient/serwer nie otrzymują
zapytań na określonym porcie sprawdźmy czy nie jest to winą firewalla. Ruch
sieciowy między dwoma komputerami można zacząć analizować wpisując:
Listing 4.13: Podsłuchiwanie komunikacji klient-serwer, przez tcpdump |
# tcpdump host i
|
Można także wykorzystać tcpdump do słuchania na określonym porcie, takim
jak port tftp, wpisując:
Listing 4.14: Słuchanie serwera tftp |
# tcpdump port 69
|
Częsty błąd jaki może się pojawić to: "PXE-E32: TFTP open time-out". Jest to
prawdopodobnie spowodowane kwestiami konfiguracji firewalla. Jeśli korzystamy z
TCPwrappers, to warto sprawdzić pliki /etc/hosts.allow oraz
etc/hosts.deny i upewnić się, że są skonfigurowane poprawnie.
Klient powinien mieć możliwość podłączenia się do serwera.
5.
Konfiguracja serwera NFS
O serwerze NFS
NFS to skrót od Network File System. Serwer NFS jest używany do udostępniania
katalogów dla maszyn slave. Ta część może zostać później zmodyfikowana, ale
póki co, chcemy by komputer slave był uruchamiany bez dysku.
O portmapperze
Różnorodne usługi klient/serwer nie nasłuchują na określonym porcie, lecz
polegają na RPC (Remote Procedure Calls - zdalnych wywołaniach procedur). Kiedy
usługa jest uruchamiana, zaczyna nasłuchiwać na losowym porcie, a następnie
rejestruje ten port w Portmapperze. NFS polega na RPC i dlatego, zanim zostanie
uruchomiony, wymaga działającego Portmappera.
Zanim zaczniemy
Serwer NFS potrzebuje wsparcia na poziomie kernela, więc jeśli tego brakuje, to
należy przebudować kernel na komputerze master. Na wszelki wypadek warto
sprawdzić konfigurację wpisując:
Listing 5.1: Sprawdzanie opcji charakterystycznych dla NFS |
# grep NFS /usr/src/linux/.config_master
|
Jeśli kernel został prawidłowo skonfigurowany, to powinno pojawić się coś
w stylu:
Listing 5.2: Prawidłowe opcje, w pliku konfiguracyjnym kernela na komputerze master, charakterystyczne dla NFS |
CONFIG_PACKET=y
# CONFIG_PACKET_MMAP is not set
# CONFIG_NETFILTER is not set
CONFIG_NFS_FS=y
CONFIG_NFS_V3=y
# CONFIG_NFS_V4 is not set
# CONFIG_NFS_DIRECTIO is not set
CONFIG_NFSD=y
CONFIG_NFSD_V3=y
# CONFIG_NFSD_V4 is not set
# CONFIG_NFSD_TCP is not set
|
Instalacja serwera NFS
Pakiet z NFS można uzyskać poprzez portage pisząc:
Listing 5.3: Instalacja pakietu nfs-utils |
# emerge nfs-utils
|
Pakiet zostanie zainstalowany wraz z narzędziem do mapowania portów
(portmapper), serwerem i klientem nfs. Automatycznie zostaną obsłużone
zależności startowe.
Konfiguracja serwera NFS
Istnieją trzy główne pliki konfiguracyjne, które należy wyedytować:
Listing 5.4: Pliki konfiguracyjne Nfs |
/etc/exports
/diskless/192.168.1.21/etc/fstab
/etc/conf.d/nfs
|
Plik /etc/exports określa jak, do kogo i co eksportować poprzez
NFS. Plik fstab na komputerze slave zostanie zmodyfikowany tak, by było możliwe
zamontowanie systemu plików NFS, wyeksportowanego przez maszynę master.
Typowy plik /etc/exports dla maszyny master powinien wyglądać
mniej więcej tak:
Listing 5.5: Przykładowy plik /etc/exports dla maszyny master |
/diskless/192.168.1.21 192.168.1.21(sync,rw,no_root_squash,no_all_squash)
/opt 192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/usr 192.168.1.0/24(sync,ro,no_root_squash,no_all_squash)
/home 192.168.1.0/24(sync,rw,no_root_squash,no_all_squash)
/var/log 192.168.1.21(sync,rw,no_root_squash,no_all_squash)
|
Pierwsze pole określa katalog, który ma być wyeksportowany. Kolejne z pól
wskazuje do kogo eksportować i w jaki sposób. To pole można podzielić na dwie
części: kto może montować wskazany katalog oraz co montujący klient może zrobić
w systemie plików: ro tylko odczytywać, rw odczytywać/zapisywać;
no_root_squash i no_all_squash są ważne dla stacji bezdyskowych,
które zapisują na dysku, by żądania I/O nie zostały przerwane przez system
operacyjny. Plik fstab, /diskless/192.168.1.21, dla maszyny slave
powinien wyglądać tak:
Listing 5.6: Przykładowy plik fstab dla maszyny slave |
master:/diskless/192.168.1.21 / nfs sync,hard,intr,rw,nolock,rsize=8192,wsize=8192 0 0
master:/opt /opt nfs sync,hard,intr,ro,nolock,rsize=8192,wsize=8192 0 0
master:/usr /usr nfs sync,hard,intr,ro,nolock,rsize=8192,wsize=8192 0 0
master:/home /home nfs sync,hard,intr,rw,nolock,rsize=8192,wsize=8192 0 0
none /proc proc defaults 0 0
master:/var/log /var/log nfs hard,intr,rw 0 0
|
W tym przykładzie, master jest nazwą maszyny master, ale równie dobrze
może to być adres IP maszyny master. Pierwsze pole określa katalog, który ma być
podmontowany, a drugie wskazuje, gdzie ma być zamontowany. Trzecie pole opisuje
system plików i powinno zawierać NFS dla każdego katalogu zamontowanego przez
NFS. Czwarte pole dotyczy różnych opcji, które będą wykorzystywane w procesie
montowania (więcej informacji w podręczniku mount(1), man mount ). Niektórzy
mają problemy z punktami montowania z opcją soft, więc zrobiliśmy wszystko
z opcją hard. Warto zerknąć na różne opcje w /etc/fstab, by klaster
był bardziej wydajny.
Ostatni plik jaki należy wyedytować, to /etc/conf.d/nfs. Określa
kilka opcji uwzględnianych przy uruchamianiu nfs i wygląda tak:
Listing 5.7: Przykładowy plik /etc/conf.d/nfs na komputerze master |
# Plik konfiguracyjny dla /etc/init.d/nfs
# Liczba serwerów, które standardowo mają być uruchomione
RPCNFSDCOUNT=8
# Opcje do przekazania do rpc.mountd
RPCMOUNTDOPTS=""
|
Zmiennej RPCNFSDCOUNT należy przypisać ilość bezdyskowych stacji w sieci.
Uruchamianie serwera NFS
Serwer nfs powinien zostać uruchomiony za pomocą skryptu znajdującego się w
/etc/init.d, należy wpisać:
Listing 5.8: Uruchamianie serwera nfs na komputerze master |
# /etc/init.d/nfs start
|
Jeśli chcemy, by skrypt był wykonywany podczas uruchamiania systemu, to
wpisujemy:
Listing 5.9: Dodawanie serwera nfs do standardowego poziomu uruchamiania na komputerze master |
# rc-update add nfs default
|
6.
Ukończenie prac nad systemem plików dla maszyny slave
Kopiowanie brakujących plików
Teraz zajmiemy się synchronizacją systemu plików pomiędzy komputerami slave i
master. Dostarczymy wymagane binaria, jednocześnie zachowując pliki
charakterystyczne dla maszyny slave.
Listing 6.1: Tworzenie systemu plików na komputerze slave |
# rsync -avz /bin /diskless/192.168.1.21
# rsync -avz /sbin /diskless/192.168.1.21
# rsync -avz /lib /diskless/192.168.1.21
|
Uwaga:
Stosujemy rsync -avz zamiast cp ze względu na chęć zachowania dowiązań
symbolicznych i uprawnień.
|
Konfigurowanie sieci w instalacji bezdyskowej
Aby zapobiec zatrzymaniu połączenia z naszym serwerem NFS przez skrypt startowy
sieci, musimy dodać opcję do /etc/conf.d/net na naszym kliencie
bezdyskowym.
Listing 6.2: Edycja /etc/conf.d/net |
config_eth0=( "noop" )
|
Uwaga:
W celu zasięgnięcia dalszych informacji należy przeczytać
/etc/conf.d/net.example.
|
Skrypty startowe
Potrzebne jest tyle skryptów startowych w katalogu
/diskless/192.168.1.21/etc/runlevels, co usług na bezdyskowej
stacji roboczej. Wszystko zależy od przeznaczenia maszyny slave.
Ostrzeżenie:
Nie należy używać programu rc-update w celu dodania bądź usuwania
skryptów w poziomach uruchamiania na komputerach slave, podczas gdy jesteśmy
zalogowani na komputerze master. Może to prowadzić do zmian w poziomach
uruchamiania na maszynie master. Linki należy tworzyć ręcznie lub zalogować
się na maszynę slave za pomocą ssh lub podłączyć monitor i klawiaturę do
bezdyskowej stacji.
|
Listing 6.3: Typowe poziomy uruchamiania dla maszyny slave |
/diskless/192.168.1.21/etc/runlevels/:
total 16
drwxr-xr-x 2 root root 4096 2003-11-09 15:27 boot
drwxr-xr-x 2 root root 4096 2003-10-01 21:10 default
drwxr-xr-x 2 root root 4096 2003-03-13 19:05 nonetwork
drwxr-xr-x 2 root root 4096 2003-02-23 12:26 single
/diskless/192.168.1.21/etc/runlevels/boot:
total 0
lrwxrwxrwx 1 root root 20 2003-10-18 17:28 bootmisc -> /etc/init.d/bootmisc
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 checkfs -> /etc/init.d/checkfs
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 clock -> /etc/init.d/clock
lrwxrwxrwx 1 root root 22 2003-10-18 17:28 domainname -> /etc/init.d/domainname
lrwxrwxrwx 1 root root 20 2003-10-18 17:28 hostname -> /etc/init.d/hostname
lrwxrwxrwx 1 root root 22 2003-10-18 17:28 localmount -> /etc/init.d/localmount
lrwxrwxrwx 1 root root 18 2003-10-18 17:28 net.lo -> /etc/init.d/net.lo
lrwxrwxrwx 1 root root 20 2003-10-18 17:28 netmount -> /etc/init.d/netmount
lrwxrwxrwx 1 root root 21 2003-10-18 17:28 rmnologin -> /etc/init.d/rmnologin
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 urandom -> /etc/init.d/urandom
/diskless/192.168.1.21/etc/runlevels/default:
total 0
lrwxrwxrwx 1 root root 23 2003-10-18 17:28 consolefont -> /etc/init.d/consolefont
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 distccd -> /etc/init.d/distccd
lrwxrwxrwx 1 root root 19 2003-10-18 17:28 keymaps -> /etc/init.d/keymaps
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/init.d/local
lrwxrwxrwx 1 root root 16 2003-10-18 17:28 sshd -> /etc/init.d/sshd
lrwxrwxrwx 1 root root 21 2003-10-18 17:28 syslog-ng -> /etc/init.d/syslog-ng
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 vixie-cron -> /etc/init.d/vixie-cron
/diskless/192.168.1.21/etc/runlevels/nonetwork:
total 0
lrwxrwxrwx 1 root root 17 2003-10-18 17:28 local -> /etc/init.d/local
/diskless/192.168.1.21/etc/runlevels/single:
total 0
|
Nadszedł czas, by zacisnąć kciuki i uruchomić maszynę slave. Działa?
Możemy sobie pogratulować, jesteśmy dumnymi posiadaczami bezdyskowych
stacji roboczych :)
Materiał udostępniany na podstawie licencji Creative Commons -
Attribution / Share Alike.
|