Instalacja Ubuntu poprzez PXE (multibooting server)

Uwaga: Ten wpis został utworzony ponad rok temu. Informacje w nim zawarte mogą być nieaktualne!
Jest to artykuł konkursowy nadesłany do nas przez Marcina K.

W sytuacji, gdy chcemy zainstalować Ubuntu na naszym komputerze, ale nie mamy płyty instalacyjnej lub, co gorsza, nie posiadamy cd-rom-u, możemy pokusić się o instalację tegoż systemu za pomocą PXE. Jednak musi on być wspierany przez nasz BIOS i kartę sieciową, co na szczęście jest w dzisiejszych czasach w zasadzie standardem.
PXE jest bardzo przydatny, gdyż dzięki niemu w większych sieciach nie musimy biegać od stacji do stacji z płytą w ręku, wystarczy dostęp do serwera.
Co będziemy potrzebować? Na pewno dostęp do internetu, zainstalowane po stronie serwera paczki dhcp3-server, tftpd-hpa oraz po stronie klienta tftp. Do tego odpowiednie pliki ładujące dla danej dystrybucji. Do dzieła.

DHCP

Zacznijmy od zainstalowania serwera DHCP. Aby to uczynić należy wpisać w konsoli:

# apt-get update
# apt-get install dhcp3-server tftpd-hpa

Następnie przechodzimy do konfiguracji serwera DHCP, najpierw konfiguracja właściwa:

# nano /etc/dhcp3/dhcpd.conf

Jako, że serwer dhcp działa u mnie w sieci już jakiś czas, dopisałem do niego tylko po dwie opcje zaznaczone tłustym drukiem do każdej z podsieci:

ddns-update-style none;
option domain-name „moja_domenal”;
option domain-name-servers 192.168.0.1,193.239.59.253;
default-lease-time 14400;
max-lease-time 14400;
authoritative;
log-facility local7;
shared-network SIECI {
subnet 192.168.0.0 netmask 255.255.255.0 {
range 192.168.0.2 192.168.0.9;
option broadcast-address 192.168.0.255;
option routers 192.168.0.1;
filename „pxelinux.0″;
next-server 192.168.0.1;
group {
host a {
hardware ethernet XX:XX:XX:XX:XX:XX;
fixed-address 192.168.0.10;
}
host b {
hardware ethernet XX:XX:XX:XX:XX:XX;
fixed-address 192.168.0.20;
}
host c {
hardware ethernet XX:XX:XX:XX:XX:XX;
fixed-address 192.168.0.30;
}
…
}
}
subnet 172.16.0.0 netmask 255.255.255.0 {
range 172.16.0.1 172.16.0.9;
option routers 172.16.0.1;
option broadcast-address 172.16.0.255;
filename „pxelinux.0″;
next-server 172.168.0.1;
group {
host aa {
hardware ethernet XX:XX:XX:XX:XX:XX;
fixed-address 172.16.0.10;
}
…
}
}
}
  • filename – określa nazwę pliku, który ma być użyty podczas bootowania przez klienta,
  • next-server – określa IP serwera z którego plik określony przez powyższą komendę będzie ściągany.

Pamiętajmy, aby ustawić interfejs, na którym serwer dhcp ma nasłuchiwać:

# nano /etc/default/dhcp3-server
INTERFACES=”eth1″

Do interfaces wpisujemy nazwę interfejsu, u mnie jest to eth1.
Po tych czynnościach restartujemy dhcp:

# /etc/init.d/dhcp3-server restart

TFTP

Przechodzimy teraz do konfiguracji tftp. Edytujemy plik:

# nano /etc/default/tftpd-hpa
RUN_DAEMON=”yes”
OPTIONS=”-vvv -l -s /var/lib/tftpboot”

Dopisujemy do RUN_DAEMON „yes”, tworzymy katalog jeżeli nie został utworzony i restartujemy serwer:

# mkdir -p /var/lib/tftpboot
# /etc/init.d/tftpd-hpa start

Jeżeli wykonaliśmy wszystko dobrze, to powinniśmy widzieć nasłuchujące daemony dhcp i tftp:

$ netstat -uln | grep -i ":67\|69"
udp 0 0 0.0.0.0:67 0.0.0.0:*
udp 0 0 0.0.0.0:69 0.0.0.0:*

PXE

Po połączeniu z tftp klient szuka w katalogu (po stronie serwera) pxelinux.cfg pliku, który nazywa się identycznie jak jego adres MAC. Jeżeli go nie znajdzie, to szuka wpisów odpowiadających jego adresowi IP, ale zapisanego w notacji szesnastkowej! Np. u mnie adres IP klienta to 172.16.0.10 (szesnastkowo to AC 10 00 0A) a MAC 20:cf:30:41:fe:02 więc klient szukał plików odpowiednio:

pxelinux.cfg/20-cf-30-41-fe-02
pxelinux.cfg/AC10000A
pxelinux.cfg/AC10000
pxelinux.cfg/AC1000
pxelinux.cfg/AC100
pxelinux.cfg/AC10
pxelinux.cfg/AC1
pxelinux.cfg/AC
pxelinux.cfg/A
pxelinux.cfg/default

Jak widać w przypadku braku powodzenia, zagląda do pxelinux.cfg/default i do tego pliku wpiszemy konfigurację, bo dzięki temu będzie ona globalna dla wszystkich hostów.
Załóżmy, że chcemy, aby nasz serwer udostępniał instalacje 3 systemów: Debiana Lenny, Squeeze oraz Ubuntu 11.04. Stwórzmy, więc odpowiednie drzewo katalogów po stronie serwera:

# cd /var/lib/tftpboot/
# mkdir -p debian/lenny/i386
# mkdir -p debian/squeeze/i386
# mkdir pxelinux.cfg
# mkdir -p ubuntu/i386

Wyglądać ma to tak:

# tree /var/lib/tftpboot/

/var/lib/tftpboot/
|-- debian
|  |-- lenny
|  |	 `-- i386
|  `-- squeeze
|	 `-- i386
|-- pxelinux.cfg
`-- ubuntu
    `-- i386
8 directories

Teraz tworzymy plik default w pxelinux.cfg:

# nano pxelinux.cfg/default

i wpisujemy do niego:

DISPLAY boot.txt
default lenny-i386-inst
label lenny-i386-inst
menu label ^Install
menu default
kernel debian/lenny/i386/linux
append vga=normal initrd=debian/lenny/i386/initrd.gz — quiet
label lenny-i386-expert
menu label ^Expert install
kernel debian/lenny/i386/linux
append priority=low vga=normal initrd=debian/lenny/i386/initrd.gz –
label lenny-i386-resc
menu label ^Rescue
kernel debian/lenny/i386/linux
append vga=normal initrd=debian/lenny/i386/initrd.gz rescue/enable=true — quiet
label squeeze-i386-inst
menu label ^Install
kernel debian/squeeze/i386/linux
append vga=normal initrd=debian/squeeze/i386/initrd.gz — quiet
label squeeze-i386-expert
menu label ^Expert install
kernel debian/squeeze/i386/linux
append priority=low vga=normal initrd=debian/squeeze/i386/initrd.gz –
label squeeze-i386-resc
menu label ^Rescue
kernel debian/squeeze/i386/linux
append vga=normal initrd=debian/squeeze/i386/initrd.gz rescue/enable=true — quiet
label ub11.4-i386-inst
menu label ^Install
kernel ubuntu/i386/linux
append vga=788 initrd=ubuntu/i386/initrd.gz — quiet
label ub11.4-i386-expert
menu label ^Install
kernel ubuntu/i386/linux
append priority=low vga=788 initrd=ubuntu/i386/initrd.gz –
label ub11.4-i386-resc
menu label ^Install
kernel ubuntu/i386/linux
append vga=788 initrd=ubuntu/i386/initrd.gz rescue/enable=true — quiet
prompt 1
timeout 0

Dla każdej dystrybucji dostępna jest instalacja normalna, w trybie expert i tryb rescue. Łącznie 9 labeli i do każdej z nich potrzebujemy odpowiednich plików jądra linux oraz obrazu initrd.gz. W takim razie pobierzmy je do odpowiednich katalogów:

# pwd
/var/lib/tftpboot
# wget ftp://ftp.pwr.wroc.pl/debian/dists/lenny/main/installer-i386/current/images/netboot/debian-installer/i386/pxelinux.0
# cd debian/lenny/i386/
# wget ftp://ftp.pwr.wroc.pl/debian/dists/lenny/main/installer-i386/current/images/netboot/debian-installer/i386/initrd.gz
# wget ftp://ftp.pwr.wroc.pl/debian/dists/lenny/main/installer-i386/current/images/netboot/debian-installer/i386/linux
# cd -
# cd debian/squeeze/i386
# wget ftp://ftp.pwr.wroc.pl/debian/dists/squeeze/main/installer-i386/current/images/netboot/debian-installer/i386/linux
# wget ftp://ftp.pwr.wroc.pl/debian/dists/squeeze/main/installer-i386/current/images/netboot/debian-installer/i386/initrd.gz
# cd -
# cd ubuntu/i386
# wget http://archive.ubuntu.com/ubuntu/dists/natty/main/installer-i386/current/images/netboot/ubuntu-installer/i386/initrd.gz
# wget http://archive.ubuntu.com/ubuntu/dists/natty/main/installer-i386/current/images/netboot/ubuntu-installer/i386/linux

I stwórzmy jeszcze plik boot.txt, który zgodnie z konfiguracją wyświetlany będzie podczas wyboru dystrybucji i wpiszmy do niego informację o tym jakie dystrybucję są dostępne. Nazwy muszą być zgodne z etykietami w piku pxelinux.cfg/default:

# pwd
/var/lib/tftpboot
# nano boot.txt
----- PXE BOOT MENU -----
____________________________
| To install please type one |
| of the following distros:   |
| -------------------------- -------||
| lenny-i386-inst		|
| lenny-i386-expert	|
| lenny-i386-resc		|
| squeeze-i386-ins	|
| squeeze-i386-expert	|
| squeeze-i386-resc 	|
| ub11.4-i386-inst 	|
| ub11.4-i386-expert	|
| ub11.4-i386-resc 	|
|__________________________|

Koniec końców drzewo /var/lib/tftpboot powinno wyglądać:

# tree /var/lib/tftpboot/
/var/lib/tftpboot/
|-- boot.txt
|-- debian
|   |-- lenny
|   |    `-- i386
|   |      |-- initrd.gz
|   |      `-- linux
|    `-- squeeze
|        `-- i386
|          |-- initrd.gz
|           `-- linux
|-- pxelinux.0
|-- pxelinux.cfg
|   `-- default
`-- ubuntu
     `-- i386
|-- initrd.gz
`-- linux
8 directories, 9 files

I to tyle jeżeli chodzi o konfigurację. Zostaje nam tylko ustawić w BIOS-ie, aby system w pierwszej kolejności bootował poprzez PXE i naszym oczom powinno ukazać się mniej więcej coś takiego:

Instalacja Ubuntu poprzez PXE (multibooting server)

Efekt końcowy

Jeżeli powyższy artykuł nie rozwiązał lub rozwiązał częściowo Twój problem, dodaj swój komentarz opisujący, w którym miejscu napotkałeś trudności.
Mile widziane komentarze z uwagami lub informacjami o rozwiązaniu problemu.