Instalacja systemu operacyjnego z sieci przy użyciu PXE
1. Wprowadzenie
W ciągu ostatnich kilku lat bardzo przypadła mi do gustu dystrybucja openSUSE systemu Linux. Bardzo dobrze współgra ona z moimi komputerami w roli systemu desktopowego. Staram się być na bieżąco z kolejnymi wydaniami systemu, gdyż na ogół wprowadzają one wiele nowych usprawnień. Zazwyczaj nie korzystam z opcji aktualizacji całej dystrybucji oferowanej przez oprogramowanie YaST.
W takim wypadku wolę całkowicie sformatować partycję /
i zainstalować na niej nową wersję systemu, pozostawiając partycję /home
nienaruszoną. Dzięki temu, partycja /
nie będzie zawierała żadnych pozostałości z poprzedniego systemu, podczas gdy dane użytkowników zostaną zachowane.
Pełne instalacje wymagają jednak nośników instalacyjnych. Wystarczy pobrać z sieci plik obrazu ISO i wypalić go na płycie. Niby łatwe, szybkie i przyjemne. Denerwuje mnie jednak to wypalanie płyt, gdyż po pewnym czasie nabierze się ich cała kolekcja. Jeśli ktoś lubi zbierać płyty, to w porządku. Ja jednak nie widzę powodu dla którego miałbym nagrywać płytę tylko po to, aby posłużyła do instalacji, a potem została zapomniana oraz wyrzucona do kosza.
W świecie uniksowych systemów operacyjnych jest jednak rewelacyjny wynalazek, który całkowicie eliminuje potrzebę stosowania jakichkolwiek nośników w celu instalacji systemu, a nawet pozwala na uruchomienie systemu operacyjnego na maszynie bezdyskowej! Mowa o technologii PXE (ang. Preboot Execution Environment). Pozwala ona na wystartowanie systemu, a ściślej programu rozruchowego (ang. bootloader), nie z dysku twardego, dyskietki, czy z płyty, a z sieci.
W niniejszym artykule opiszę jak zainstalować system openSUSE 11.2 na komputerze, który nie musi być wyposażony w napęd dysków optycznych (CD/DVD/BD). Wystarczy, że będzie posiadał kartę sieciową wspierającą PXE.
W przypadku nowych płyt głównych, karta sieciowa jest niemalże w 100% zintegrowana i jej BIOS zawiera odpowiednie oprogramowanie umożliwiające rozruch komputera poprzez PXE. Dotyczy to także laptopów. W przypadku oddzielonych kart sieciowych, czasem niezbędne jest zainstalowanie układu scalonego pamięci typu ROM. W takiej kości powinno być zapisane oprogramowanie umożliwiające przeprowadzenie rozruchu PXE.
W domu znalazłem jedną kartę sieciową PCI opartą na popularnym układzie Realtek 8139, na której zainstalowana jest podstawka opisana jako „Boot ROM”. Wkładając doń odpowiedni układ scalony, można także zyskać możliwość korzystania z dobrodziejstw PXE.
2. Wymagania
Oprócz komputera na którym instalowany będzie nowy system operacyjny, oczywiście potrzebna będzie druga maszyna, która posłuży jako serwer umożliwiający przeprowadzenie rozruchu PXE innym komputerom w sieci.
W mojej sieci domowej cały czas działa serwer oparty na systemie FreeBSD 8. W dalszej części artykułu zaprezentuję więc, jak skonfigurować tenże system. Bez obaw dla zwolenników Linuksa - mimo iż jest to system z rodziny BSD, to konfiguracja Linuksów jest bardzo podobna.
Reasumując, potrzebne będą:
- komputer docelowy (na którym instalowany będzie nowy system) z zainstalowaną kartą sieciową wspierającą rozruch PXE,
- komputer z uniksowym/linuksowym systemem operacyjnym pełniący rolę serwerów: DHCP, TFTP (te dwa są niezbędne do PXE) oraz HTTP,
- obraz ISO systemu openSUSE 11.2 zapisany na dysku serwera;
- plik
pxelinux.0
wchodzący w skład pakietu PXELINUX; - oczywiście komputery muszą być podłączonego do sieci (aczkolwiek niekoniecznie do Internetu).
Dla rodziny procesorów x86 możliwe do pobrania są dwie wersje systemu openSUSE, tj. wersja 32- i 64-bitowa. Można pobrać jakąkolwiek z nich, przy czym należy pamiętać, że instalacja wersji 64-bitowej nie powiedzie się na komputerze z procesorem 32-bitowym. W drugą stronę nie ma natomiast problemu, tj. możliwa jest instalacja wersji 32-bitowej na procesorze 64-bitowym. Architektura maszyny pełniącej rolę serwera nie ma przy tym jakiegokolwiek znaczenia.
W niniejszym artykule założę, że instalowana będzie 32-bitowa wersja systemu openSUSE 11.2. Przy czym w końcowej jego części zaprezentuję, jak udostępnić sieciową instalację obydwu wersji sytemu.
3. Konfiguracja serwera
3.1. Serwer DHCP
Serwer DHCP jest niezbędnym składnikiem technologii PXE. Musi on bowiem nadać adres IP maszynie, która wykonuje rozruch PXE, jak również przekazać jej informację o tym, jak nazywa się plik z programem rozruchowym i skąd można go pobrać. Nawet gdy w dotychczasowej sieci lokalnej stosowane są statyczne adresy IP, to i tak konieczne będzie użycie tego serwera.
Gdyby serwer dhcpd nie był zainstalowany, oczywiście należy go zainstalować. W systemie FreeBSD wystarczy skompilować i zainstalować port isc-dhcp31-server umieszczony w kartotece /usr/ports/net/isc-dhcp31-server
. Następnie należy skonfigurować tenże serwer.
Wiele przydatnych artykułów w sieci opisuje jak to zrobić. Wśród nich warty polecenia jest rozdział „Installing and Configuring a DHCP Server” z podręcznika systemu FreeBSD. W nim zostało przejrzyście i dokładnie opisane jak zainstalować, skonfigurować i uruchomić serwer dhcpd.
Upewniwszy się, że serwer dhcpd działa prawidłowo, należy wprowadzić pewne poprawki do pliku dhcpd.conf
(znajdującym się najprawdopodobniej w kartotece /usr/local/etc
) tak, aby mógł obsługiwać klientów PXE. Należy uruchomić ulubiony edytor tekstu (vim) oraz dodać doń następujące wiersze:
Pierwszy wierszy informuje klientów PXE o nazwie serwera, z którego przeprowadzany jest rozruch. Wiersz ten nie jest zbyt istotny. Niezwykle ważne są z kolei dwa następne.
Wiersz drugi zawiera adres komputera, na którym działa serwer TFTP, natomiast trzeci wskazuje nazwę pliku, który ma zostać pobrany z tego serwera w celu przeprowadzenia rozruchu. Adres serwera może być zapisany zarówno w bezpośredniej postaci numerycznej (np. 172.17.17.1), jak też w postaci nazwy mnemonicznej. W wypadku tej drugiej, należy się upewnić, że serwer DHCP będzie w stanie tę nazwę znaleźć i zamienić na adres IP (np. poprzez DNS, plik /etc/hosts
, itp.)! Nazwa pliku może być dowolna, jednakże musi się pokrywać z nazwą pliku umieszczonego na serwerze TFTP. W powyższym przykładzie użyłem nazwy pxelinux.0
, gdyż jest to domyślna nazwa pliku rozruchowego programu PXELINUX, który zostanie użyty do uruchomienia jądra Linuksa systemu openSUSE.
Warto zwrócić uwagę, że jeśli powyższe wiersze zostaną dodane na początku pliku konfiguracyjnego serwera DHCP, to ustawienia charakterystyczne PXE staną się globalne, a co za tym idzie, stosowane będą dla wszystkich maszyn klienckich w sieci. Aby ograniczyć możliwość rozruchu PXE dla poszczególnych hostów, należy powyższe linie wstawić do odpowiedniej sekcji host
. W przeciwnym wypadku, tzn. gdy adresy IP mają być nadawane dynamicznie dla klientów PXE, należy dodać opcję dynamic-bootp
w sekcji range
. Np.:
Powyższa deklaracja spowoduje, że adresy IP z przedziału od 172.17.17.10 do 172.17.17.20 włącznie będą nadawane zarówno dla zwykłych klientów DHCP, jak również dla klientów PXE.
Po przeprowadzeniu modyfikacji w pliku dhcpd.conf
, należy zrestartować serwer DHCP w celu wprowadzenia nowych ustawień. W systemie FreeBSD, wystarczy uruchomić poniższy skrypt:
3.2. Serwer TFTP
Serwer TFTP zainstalowany jest domyślnie wraz z systemem FreeBSD. W innych systemach czasem konieczna jest jego instalacja. W dystrybucji openSUSE systemu Linux dostępny jest np. pakiet tftp zawierający program klienta oraz serwera protokołu TFTP.
Wróćmy jednak do systemu FreeBSD. Mimo iż serwer TFTP jest dostępny, to domyślnie jest on wyłączony. Aby go włączyć niezbędna jest modyfikacja pliku /etc/inetd.conf
. Należy odnaleźć następujące wiersze:
Trzeci parametr informuje o wersji protokołu UDP. Nas intersować będzie wyłącznie wersja 4. protokołu. Toteż pierwszy powyższy wiersz zostanie odkomentowany.
Ostatni parametr wskazuje źródłową kartotekę dla serwera TFTP, tj. kartotekę w której znajdować się będę pliki udostępniane za pomocą protokołu TFTP.
Ja wolę jednak użyć kartoteki /srv/tftpboot
, dlatego ostatecznie powyższe wiersze będą miały następującą postać:
Po wyjściu z edytora tekstu i zapisaniu zmian należy ową kartotekę utworzyć:
Kolejnym bardzo ważnym krokiem jest restart demona inetd. Spowoduje on uruchomienia serwera TFTP dla połączeń przychodzących.
Na razie serwer nie udostępnia jeszcze żadnych plików.
Pierwszym potrzebnym plikiem będzie wspomniany wcześniej plik pxelinux.0
. Można go zdobyć pobierając ręcznie cały pakiet SYSLINUX ze strony WWW projektu.
Można go także bezpośrednio pobrać korzystając z kliku poleceń:
Program rozruchowy PXELINUX wymaga pewnych plików konfiguracyjnych do pracy. Można je utworzyć za pomocą następujących poleceń:
Całkowicie niezbędna jest edycja pliku /srv/tftpboot/pxelinux.cfg/default
. Jest to główny plik konfiguracyjny programu PXELINUX. Należy go otworzyć w edytorze tekstu i wpisać doń np. następującą zawartość:
Sądzę, że powyższe opcje są w miarę intuicyjne. Dotoczy to zwłaszcza osób, które wcześniej zetknęły się z innymi programami rozruchowymi pakietu SYSLINUX, oraz programami takimi jak LILO czy GRUB.
Pierwszy wiersz wskazuje, która z opcji rozruchu będzie domyślna, tj. wybrana po wciśnięciu klawisza ENTER, lub po upływie czasu określonego w trzecim wierszu (jednostką jest dziesiąta sekundy).
Linia druga nakazuje programowi PXELINUX wyświetlenie znaku zachęty. Dzięki temu użytkownik będzie mógł wpisać opcję rozruchu. W tym konkretnie wypadku została określona wyłącznie jedna opcja, toteż wiersz ten niekoniecznie musi być określony. Niemniej jednak, w dalszej części artykułu zaprezentuję jak dodać drugą opcję rozruchu, a to już będzie wymagało wyświetlenia znaku zachęty.
Wiersze czwarty oraz piąty zawierają informację o pliku tekstowym, którego zawartość zostanie wyświetlona: od razu po uruchomieniu programu PXELINUX (wiersz czwarty); w przypadku wciśnięcia klawisza F1 w trakcie wyświetlania znaku zachęty (wiersz piąty). Widać, że użyłem takiego samego pliku dla obu sytuacji. Można oczywiście użyć różnych plików, jeśli ktoś miałby taką ochotę.
Kolejne wiersze dotyczą pierwszej i jedynej opcji rozruchu. Parametr label
określa nazwę opcji, a w kolejnych wierszach ustawione zostały parametry rozruchu.
Parametr kernel
określa nazwę pliku zawierającego jądro systemu, które ma zostać uruchomione.
Parametr append
określa tekst, który ma zostać przekazany uruchamianemu jądru. Z punktu widzenia przedstawionego przykładu, najważniejsze są dwie zmienne:
- zmienna
initrd
określa nazwę pliku zawierającego skompresowany obraz RAM dysku, który zostanie użyty do uruchomienia systemu tuż po załadowaniu jądra. Nośnik instalacyjny openSUSE zawiera odpowiedni obraz RAM dysku, w którym zapisana została okrojona wersja systemu umożliwiającego instalacją sieciową; - zmianna
install
określa ścieżkę sieciową, z której program instalacyjny systemu openSUSE ma czerpać pliki używane do instalacji. Ważne jest, aby ścieżka była prawidłowa, tzn. określała odpowiedni protokół, za pomocą którego zawartość nośnika instalacyjnego została udostępniona (HTTP). Oczywiście ścieżka ta musi być osiągalna w sieci.
W przedstawionym przykładzie zawartość nośnika instalacyjnego dostępna jest na serwerze WWW, pod adresemedmo-2.pichen.com
, w kartotece/opensuse-11.2-i386
.
Kolejnym (aczkolwiek niewymaganym) krokiem jest edycja pliku /srv/tftpboot/msg.txt
. Można wpisać doń np. następujący komunikat:
3.3. Nośnik instalacyjny (obraz ISO)
Załóżmy, że plik ISO obrazu nośnika instalacyjnego systemu openSUSE 11.2 został wcześniej pobrany i dostępny jest pod ścieżką /root/openSUSE-11.2-DVD-i586.iso
. Obraz ten należy zamontować, tak by można było się odwołać do jego plików (innymi słowy: aby można z niego korzystać tak samo jak z zamontowanej realnej płyty DVD):
W ten sposób obraz płyty zostanie zamontowany w sytemie plików w kartotece /mnt/dvd-openSUSE-11.2-i386
. Należy pamiętać, że obraz zamontowany będzie tymczasowo do restartu systemu, lub jego jawnego odmontowania.
Następnie koniecznym będzie umieszczenie plików jądra oraz obrazu skompresowanego RAM dysku w kartotece źródłowej serwera PXE:
Spostrzegawcze osoby z pewnością zauważą, że zamiast kopiować powyższe pliki, można by po prostu utworzyć doń dowiązania symboliczne, oszczędzając tym samym ok. 30 MB miejsca na dysku. Niestety, nic z tego nie wyjdzie, gdyż serwer protokołu TFTP dostarczany wraz z systemem FreeBSD nie obsługuje prawidłowo takich dowiązań!
3.4. Serwer HTTP
Gdy dysponujemy (szybkim) łączem internetowym to można w ogóle zrezygnować z udostępnienia zawartości nośnika instalacyjnego przy użyciu własnego serwera. Można bowiem zmiennej install
ustawić adres zewnętrznego, internetowego serwera udostępniającego pliki instalacyjne. Proces instalacji będzie jednak znacznie wolniejszy niż przy zastosowaniu lokalnego udostępniania plików. Myślę, że jest to dobry argument dla którego warto użyć własnego serwera.
Serwer HTTP nie jest jedynym możliwym narzędziem do udostępnienia zawartości nośnika instancyjnego. Instalator openSUSE ma bowiem możliwość pobrania plików instalacyjnych także przy użyciu innych protokołów transmisji plików takich jak choćby FTP, NFS czy SMB/CIFS. Dlaczego zatem zdecydowałem się wybrać serwer protokołu HTTP? Otóż myślę, że serwer ten jest najłatwiejszy do konfiguracji, a przy tym sprawia najmniej problemów z zaporą sieciową, jeśli ta jest stosowana i restrykcyjnie skonfigurowana. Protokoły takie jak FTP czy NFS wymają więcej wysiłku w konfiguracji zapory sieciowej.
Gdyby serwer WWW nie był jeszcze zainstalowany, wówczas należy go zainstalować. W tym przypadku gorąco polecam program Apache HTTP Server, którego wersję 2.2 można zainstalować z portu apache22 umieszczonego w kartotece /usr/ports/www/apache22
. Oczywiście serwer należy skonfigurować i uruchomić. Po dalsze informacje odsyłam do rozdziału „Apache HTTP Server” podręcznika systemu FreeBSD.
Domyślne ustawienia serwera powinny być wystarczające.
W systemie FreeBSD domyślną ścieżką źródłową dla serwera Apache HTTP Server jest kartoteka /usr/local/www/data
. W kartotece tej powinniśmy umieścić katalog openSUSE-11.2-i386
zawierający pliki z nośnika instalacyjnego systemu. W ten sposób program instalacyjny będzie w stanie otrzymać pliki instalacyjne, które będą mu serwowane przez tenże serwer WWW.
Zamiast kopiować pliki, korzystniej jest utworzyć dowiązanie symboliczne do kartoteki, gdyż oszczędzi to 3 GB miejsca na dysku (!):
Nie jest konieczny restart serwera WWW, gdyż nie zmieniliśmy jego konfiguracji, a jedynie dodaliśmy nowe pliki.
4. Rozruch PXE
Upewniwszy się, że wszystkie powyższe czynności zostały przeprowadzone bezbłędnie, i że serwery DHCP, TFTP, HTTP działają z nowymi ustawieniami, można rozpocząć proces rozruchu PXE na komputerze docelowym. Maszyna ta oczywiście musi zostać podłączona do sieci lokalnej. Po jej uruchomieniu (lub restarcie) należy zmienić w ustawieniach BIOSu sekwencję urządzeń rozruchowych tak, aby rozruch PXE miał najwyższy priorytet.
W moim stacjonarnym komputerze, w którym karta sieciowa jest zintegrowana z płytą główną, urządzenie to nazwane zostało „Network: Realtek Boot Agent”. W laptopie z kolei urządzenie to nazywa się po prostu „Network”.
Niektóre BIOSy mają funkcję wyboru urządzenia rozruchowego bez konieczności modyfikacji ustawień. W takim wypadku wystarczy na ogół wcisnąć odpowiedni klawisz, tuż po uruchomieniu, tudzież restarcie komputera. W moim laptopie np. wystarczy wcisnąć klawisz ESC, aby móc wybrać urządzenie rozruchowe.
Gdy BIOS zakończy swoje działanie, uruchomione zostanie oprogramowanie karty sieciowej, które powinno prawidłowo wykonać rozruch PXE. Na początku zostanie pobrany adres IP, a następnie pobrany oraz uruchomiony zostanie program rozruchowy (PXELINUX) dostarczany mu przez nasz serwer TFTP. Na ekranie powinien się pojawić komunikat zapisany przez nas wcześniej w pliku /srv/tftpboot/msg.txt
. Teraz już tylko wystarczy odczekać 10 sekund albo wcisnąć klawisz ENTER, aby uruchomić instalator systemu openSUSE bez użycia jakichkolwiek płyt!
Sądzę, że przedstawiony przeze mnie proces konfiguracji serwera dla potrzeb rozruchu PXE nie jest zbyt skomplikowany. Dla osób posiadających już doświadczenie w administrowaniu systemami UNIX/Linux kroki opisane w niniejszym artykule można przeprowadzić w krótkim czasie, kto wie, czy nie krótszym niż zajęłoby nagranie płyty DVD! Wg mnie taki alternatywny sposób instalacji systemu daje także sporo satysfakcji.
Dla osób chcących dalej eksperymentować z PXE, polecam takie przygotowanie serwera, aby można było uruchomić kompletny system operacyjny (np. wybraną dystrybucję Linuksa) na maszynie bezdyskowej z możliwością normalnej pracy!
Dodatek A. Dwa systemy
W niniejszym dodatku zaprezentuję jak zmodyfikować opisaną konfigurację serwera, aby przy rozruchu PXE można było wybrać instalatory dwóch różnych wersji systemów operacyjnych. Dajmy więc możliwość wyboru zarówno wersji 32-bitowej, jak i 64-bitowej systemu openSUSE 11.2.
Po co w ogóle taka konfiguracja? Gdy posiadamy tylko jedną maszynę, na której chcemy zainstalować konkretny system, to oczywiście rozwiązanie z dwoma instalatorami nie ma większego sensu. Co innego, gdy instalujemy system na więcej niż jednym komputerze, z których niektóre posiadają procesory obsługujące 64-bitowe rozszerzenia, a inne nie. Wówczas na każdym komputerze będzie można wybrać, która wersja ma zostać zainstalowana. Co istotne, oszczędzi się w ten sposób nagrywania wielu nośników instalacyjnych, a sam proces instalacji będzie można zrównoleglić!
Potrzebny będzie plik obrazu ISO nośnika instalacyjnego 64-bitowej wersji systemu openSUSE 11.2. Załóżmy, że obraz ten został już pobrany i dostępny jest w pliku /root/openSUSE-11.2-DVD-x86_64.iso
. Aby móc zeń skorzystać, należy go zamontować w systemie:
Proszę zwrócić uwagę, iż podczas tworzenia urządzenia dysku pamięci został użyty nowy numer jednostki (poprzedni jest używany przez obraz wersji 32-bitowej).
Następnie zmodyfikujmy plik /srv/tftpboot/pxelinux.cfg/default
, dodając drugą opcję rozruchu. Plik ten powinien wyglądać np. tak:
Warto także zmienić komunikat zapisany w pliku /srv/tftpboot/msg.txt
. Może on zawierać np. następującą zawartość:
Kolejną czynnością będzie skopiowanie plików jądra oraz skompresowanego obrazu RAM dysku do kartoteki źródłowej serwera TFTP:
Ostatnią już czynnością będzie utworzenie w katalogu źródłowym serwera WWW dowiązania symbolicznego do kartoteki zawierającej pliki z nośnika instalacyjnego 64-bitowej wersji systemu operacyjnego openSUSE 11.2:
I voilà!
Uruchamiając ponownie komputer docelowy korzystając z rozruchu PXE, program PXELINUX wyświetli nowy komunikat. Wciskając klawisz ENTER lub odczekując 10 sekund uruchomiony zostanie instalator domyślny, tj. 32-bitowej wersji systemu openSUSE 11.2. W celu uruchomienia instalatora 64-bitowej wersji, w momencie wyświetlenia znaku zachęty programu PXELINUX konieczne będzie wpisanie słowa install64
i jego potwierdzenie klawiszem ENTER.
Dodatek B. Problemy
B.1. Zapora sieciowa
Może się zdarzyć, iż na serwerze zainstalowana i skonfigurowana jest zapora sieciowa. Wówczas należy pamiętać o tym, aby odblokować ruch niezbędny dla PXE.
Załóżmy, że na serwerze działa zaawansowane oprogramowanie filtrujące PF, które zostało ustawiona tak, aby blokować cały ruch przychodzący, natomiast ruch wychodzący z serwera jest dozwolony. W takim wypadku konieczne będzie otwarcie odpowiednich portów używanych przez serwery DHCP, TFTP oraz HTTP. W tym celu koniecznie będzie dodanie np. poniższych wierszy do pliku konfiguracyjnego /etc/pf.conf
w sekcji ustawień filtra:
Oczywiście należy wcześniej zdefiniować makro „Int_If”, tzn. przypisać mu nazwę karty sieciowej podłączonej do sieci lokalnej.
Pozostanie jeszcze przeładowanie konfiguracji zapory sieciowej:
W ten oto sposób zapora powinna przepuszczać ruch konieczny dla rozruchu PXE.
Data artykułu: 2010-03-30.
Waszym zdaniem...
Komentarz dodał(a) Tom dnia 2017-05-16 13:33:32.
Komentarz dodał(a) Smithg328 dnia 2015-01-11 14:11:37.
Komentarz dodał(a) lordidas15 dnia 2013-02-05 23:19:26.