PXE boot Win 10 s wimboot

Tento článok je veľmi podobný predchádzajúcemu článku. Až po inštaláciu syslinuxu je to vlastne kópia, čiže ak ste čítali predošlý článok, tak môžete hneď skočiť na časť s názvom Inštalácia PXE, inak nič nepreskakujte a pokračujte v čítaní od začiatku. V tomto článku bude na konci aj bonus, kde celú inštaláciu Windows 10 zautomatizujeme.

Pred nejakým časom som potreboval na starší NoteBook nainštalovať linux. Vzhľadom k tomu, že už nemám žiadne voľne CD/DVD a na nešťastie som nemal k dispozícii ani žiadny USB kľúč, rozmýšľal som ako nainštalujem OS, keď nemam žiadne médium z ktorého by som nabootoval. Myslel som si, že som zachránený, keď som našiel doma pohodenú micro SD kartu. Po naformátovaní som na kartu rozbalil ISO obraz a začal som v NTB linux bootovať. Inštalácia prebiehala bez problémov, ale pri kopírovaní dát z SD karty na harddisk NoteBooku, nastal problém a inštalátor ukončil proces inštalácie (niektoré dôležité súbory nebolo možné skopírovať).

Potom ma napadlo, že OS je možné zaviesť aj cez sieťovú kartu. O možnosti bootovania cez sieťovú kartu som vedel, ale prakticky nikdy som to nepotreboval, tak som sa o to ďalej nezaujímal. Teraz však prišiel ten čas, keď som si povedal, že to musím vyskúšať. Medzitým som si USB kľúč zadovážil a linux som do NTB nainštaloval. Teraz ma ale viac zaujíma PXE. Podmienkou bootavania zo siete je podpora tejto funkcie v BIOSe (resp. v UEFI).

PXE

Preboot EXecution Enviroment, je štandard, ktorý zaviedla v roku 1999 spoločnosť Intel. Pri tejto technológii sa zavádza (bootuje) operačný systém prostredníctvom počítačovej siete. Dôvodov prečo bootovať po sieti je viac: napr. sieťové zavedenie použité pre diagnostiku počítača. Tak isto sa táto metóda používa na hromadnú inštaláciu operačných systémov atď…

Na zavedenie systému zo siete budeme potrebovať

  • DHCP server
  • TFTP server
  • NFS/FTP/HTTP/Samba server
  • Syslinux

Vo väčšine tutoriálov a návodov sú spomenuté technológie nastavené na tom istom servery a topológia siete je následovná

Server PXE poskytuje všetky služby vrátane DHCP servera. V tomto prípade klienti získavajú IP adresy s DHCP servera, ktorý je nainštalovaný na PXE servery. Ja som to mohol riešiť podobným spôsobom, ale u mňa je situácia trochu odlišná a nechcel som zasahovať do siete fyzicky. Moja topológia siete je klasická, kde už DHCP server existuje, takže ďalší DHCP server som na sieti nemohol použiť.

Zdroj internetu je VDSL2, ktorý je prebridgovaný cez modem Zyxel VMG-1312-B30B a na RB450 je použitý ROS Mikrotik 6.45.1 (23.11.2019). Problém je v tom, že DHCP server musí byť nastaveny pre PXE bootovanie a takto sa nedá nastaviť hocijaký DHCP server. Mikrotik však takéto nastavenie umožňuje.

DHCP na PXE servery

DHCP server na PXE funguje následovne: ak na klientskom počítači povolíme v BIOSe/UEFI bootovanie zo siete a pri zapnutí počítača stlačíme kláves F12, tak počítač vyšle broatcastovu správu v UDP datagrame s vloženeou správou DHCPDISCOVER, kde je nastavený príznak PXE. Na takúto správu odpovie len DHCP server, ktorý je nastavený tak, aby odpovedal, počítačom, ktoré žiadajú o sieťové bootovanie (iné DHCP servery, ktoré nemajú nastavené sieťové bootovanie, túto správu ignorujú). DHCP server vyšle počítaču správu DHCPOFFER s IP adresou, maskou siete, bránou a IP adresou TFTP servera. Ak bol v prvej odpovedi DHCP servera určený aj TFTP server , tak PXE kontaktuje zase DHCP server pomocou DHCPREQUEST a žiada o plnú cestu k bootstraping programu (Network Boot Program – NBP). DHCP server odpovedá správou DHCPACK. Následne sa stiahne do operačnej pamäte bootstraping (NBP). NBP je sieťovou obdobou zavádzača jadra operačného systému.

Čo budeme potrebovať

  • Mikrotik kde nastavíme DHCP
  • LXC linuxový kontajner Centos 7
  • TFTP server
  • NFS, FTP, Samba, alebo HTTP/HTTPS server
  • Syslinux

Konfigurácia DHCP na Mikrotiku

Cez WinBox sa prihlásime do administračného rozhrania routera mikrotik a otvoríme si New Terminal. V terminály zadáme príkaz na zobrazenie dostupných sieti.

ip dhcp network print

Ja routujem na LAN len 2 siete, takže výpis vyzerá následovne

#   ADDRESS            GATEWAY         DNS-SERVER    
0   192.168.1.0/24     192.168.1.1     192.168.1.1 
1   192.168.5.0/24     192.168.5.1     192.168.1.1

Sieť 192.168.1.0/24 nastavíme tak, aby DHCP server prideľoval IP adresy klientom ktorí požadujú sieťové bootovanie. Čiže sieti pridáme niektoré parametre a to konkrétne boot-file-name, next-server a ntp-server

address=192.168.1.0/24 boot-file-name=pxelinux.0 dns-server=192.168.1.1 gateway=192.168.1.1 next-server=192.168.1.111 ntp-server=192.168.1.111

Nastavenie DHCP servera

To by malo byť všetko čo sa týka nastavenia DHCP na mikrotiku. Toto nastavenie pridelí PXE klientovy IP adresu, masku siete, bránu (GW) a ukáže klientovy na ktorej IP adrese sa nachádza TFTP server z ktorého sa bude kopírovať do operačnej pamäte bootstraping.

Inštalácia LXC Centos 7

V návode budeme uvažovať IP adresu PXE servera 192.168.1.111

Môže byť použitý aj fyzicky server, ale vzhľadom k tomu, že virtualizácia je dnes súčasťou aj bežných domácnosti, tak prečo nevyužiť linuxový kontajner, alebo KVM.

Ja som inštaloval Centos 7 v Proxmoxe cez webové rozhranie, čiže inštalácia bola na niekoľko klikov. V nasledujúcom zozname sú vyznačené, len položky, ktoré som pozmenil, alebo ktoré som vyplňoval (ostatné som nechal na prednastavených hodnotách). Pokiaľ sme prihlásený na proxmoxe cez webové rozhranie, tak klikneme na

  • Create CT
  • Unprivileget container: Off
  • CT ID: zadáme číslo pre kontajner (defaultne sa vyplní automaticky)
  • Hostname: pxe-server
  • Password: ********
  • Confirm Password: ********
  • SSH Public Key: pokiaľ používame tak ho môžeme nakopírovať
  • Templates: centos-7-default_20171212_amd64.tar.xz
  • Disk size (GiB): 24 GB (môže byť aj viac)
  • Cores: 2
  • Memory (MiB): 2048
  • Swap (MiB): 2048
  • IPv4/CIDR: 192.168.1.111/24
  • Gateway (IPv4): 192.168.1.1

Kontajner spustíme a prihlásime sa cez webový terminál shell. Najprv aktualizujeme systém, nainštalujeme SSH server, SSH klient, službu povolíme a spustíme. Odporúčam nainštalovať aj file manager mc a editor nano

pct enter 111
yum update
yum -y install openssh-server openssh-clients
chkconfig sshd on
systemctl enable sshd.service
service sshd start
yum install -y mc && yum install -y nano

Teraz sa môžeme do kontajnera prihlásiť cez SSH (mne osobne sa pracuje lepšie v normálnom terminály narozdiel od webového). Ešte pred konfiguráciou spomeniem, že na linuxovom kontajnery v predvolenom režime sú vypnuté služby selinux a firewalld (resp. iptables). Pracovať budeme ako root s promptom #.

Inštalácia TFTP servera

Najprv si na Centose nainštalujeme TFTP server. Po úspešnej inštalácii službu spustíme a povolíme automaticky štart po štarte systému. Skontrolujeme či služba beží.

yum install -y tftp-server
systemctl start tftp.service && systemctl enable tftp.service
systemctl status tftp.service

Inštalácia Samba server

Nainštalujeme a nakonfigurujeme Samba server na ktorom budú uložené zdroje odkiaľ sa následne budú inštalovať operačné systémy. SMB server bude nastavený ako anonymous, čiže prístup v sieti nebude vyžadovať prihlasovacie údaje.

  • Nainštalujeme Sambu
  • Zálohujeme konfiguračný súbor
  • Vytvoríme adresár pre OS v našom prípade Win 10
  • Otvoríme konfiguračný súbor pre úpravy
yum install samba samba-client samba-common
cp /etc/samba/smb.conf /etc/samba/smb.conf.orig
mkdir -p /samba/win10
nano /etc/samba/smb.conf

Konfiguračný súbor, len trocha poupravíme a uložíme. Takto by mohol vyzerať obsah súboru.

# See smb.conf.example for a more detailed config file or
# read the smb.conf manpage.
# Run 'testparm' to verify the config is correct after
# you modified it.

[global]
        workgroup = WORKGROUP
        security = user
        netbios name = centos
        map to guest = bad user
        passdb backend = tdbsam

[win10]
       	comment = Anonymous File Server Share
        path = /samba/win10
        browsable =yes
        writable = yes
        guest ok = yes
        read only = no
        force user = nobody

Pre kontrolu môžeme spustiť ešte

testparm

Službu teraz nastavíme aby sa spúšťala pri štarte systému a zapneme ju.

systemctl enable smb.service
systemctl enable nmb.service
systemctl start smb.service
systemctl start nmb.service

Teraz môžeme skúsiť či sa dokážeme v LAN sieti pripojiť z počítača na ktorom beží Windows na zdieľaný adresár v linuxe. Vo Windowse klikneme na Start a napíšeme.

\\192.168.1.111

Ak je všetko v poriadku, tak by sme mali vidieť adresár win10.

Inštalácia PXE

Teraz nainštalujeme syslinux. Syslinux je projekt, ktorý vyvíja sadu utilít určených pre zavedenie operačných systémov z rôznych médii. Nás bude zaujímať hlavne zavedenia OS cez sieť o ktorú sa stará PXELINUX. Vzhľadom k tomu, že v LXC centos 7 sa z repozitárov nainštaluje verzia syslinux.x86_64 0:4.05-15.el7 a boot nefungoval, musel som použiť novší syslinux a z neho som vykopíroval potrebné súbory do /var/lib/tftpboot.

cd /tmp
yum install wget
wget https://mirrors.edge.kernel.org/pub/linux/utils/boot/syslinux/Testing/6.04/syslinux-6.04-pre1.tar.xz
tar -xf syslinux-6.04-pre1.tar.xz

cp syslinux-6.04-pre1/bios/com32/lib/libcom32.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/libutil/libutil.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/modules/linux.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/core/pxelinux.0 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/elflink/ldlinux/ldlinux.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/menu/vesamenu.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/menu/menu.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/chain/chain.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/modules/pxechn.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/gpllib/libgpl.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/cmenu/libmenu/libmenu.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/hdt/hdt.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/modules/reboot.c32 /var/lib/tftpboot
cp syslinux-6.04-pre1/bios/com32/modules/poweroff.c32 /var/lib/tftpboot

Na PXE server by sme mali teraz uploadnuť ISO obraz inštalačného media Windows 10, tam ho primountovať a obsah prekopírovať do pripraveného adresára. Problém je v to, že mount v LXC nie je jednoduchý a mne sa ani nepodarilo mount ISO súboru urobiť. Preto som sa rozhodol, že ISO obraz Windows 10 mountnem na pracovnom PC a obsah prekopírujem na PXE server pomocou SCP príkazu. Takže pripojíme ISO obraz Windows 10 do adresára /mnt/iso (ak /mnt/iso neexistuje, tak ho vytvoríme). ešte upozorním, že túto operáciu vykonávame na PC, kde je uložený ISO obraz OS. Ja mám ISO obraz uložený na pracovnom PC, ktoré beží na linuxe, tak použijem následovné príkazy.

sudo mkdir /mnt/iso
sudo mount -o loop /media/jany/1026B1C426B1AADC/OS/ms_windows/win_10/Win10_1903_V2_Slovak_x64.iso /mnt/iso

Ak používate OS Windows, tak na pripojenie ISO obrazu použijete nejaký nástroj určený pre Windows (napr. UltraISO) a kopírovať na server budete cez winscp. Čiže ja som v linuxe použil na kopírovanie obsahu celého adresára na server príkaz:

scp  -r /mnt/iso/* root@192.168.1.111:/samba/win10

Teraz zmeníme rekurzívne privilégia adresára a vlastníka nastavíme na nobody. Fungovať nám to bude aj bez týchto nastavení

chmod -R 0755 /samba/win10
chown -R nobody:nobody /samba/win10

Vytvoríme si adresár

mkdir /var/lib/tftpboot/WinPE10

kde uložíme súbory, ktoré sú potrebné pre zavedenie OS Win 10. Tieto súbory získame z adresárov pri vytváraní WinPE.iso. Ako sa vytvára WinPE.iso som popisoval v predošlom článku. Teraz WinPE.iso nemusíme vytvoriť. Stači ak vo Windowse zadáme tento príkaz

copype amd64 c:\WinPE_x64

a z c:\WinPE_x64 vykopírujeme nasledujúce súbory

  • /media/Boot/BCD
  • /media/Boot/boot.sdi
  • /media/sources/boot.wim

Ďalej stiahneme z ipxe servera bootloader wimboot a uložíme ho do adresára k súborom, ktoré sme vykopírovali pri vytváraní WinPE.iso. Ja som si všetky potrebne súbory uložil na plochu do adresára boot, ktorý následne prenesiem cez SCP na PXE server

  • BCD
  • boot.sdi
  • boot.wim
  • wimboot
scp /home/jany/Plocha/boot/* root@192.168.1.111:/var/lib/tftpboot/WinPE10

Vytvoríme si adresár kde bude boot menu a do súboru default vložíme bootovacie menu. Oproti predošlému článku som použil trocha krajšie vesamenu.

mkdir /var/lib/tftpboot/pxelinux.cfg
nano /var/lib/tftpboot/pxelinux.cfg/default
default vesamenu.c32
prompt 0
timeout 100

menu title PXE Boot Menu

label Windows 10 64BIT
    com32 linux.c32
    append WinPE10/wimboot gui pause initrdfile=WinPE10/BCD,WinPE10/boot.sdi,WinPE10/winpeshl.ini,WinPE10/install.bat,WinPE10/boot.wim

label Boot from local disc
    localboot 0x80

Popis k default súboru: ak použijeme v riadku append aj parameter pause, tak bootovanie bude aj s výstupom na monitor, kde môžeme diagnostikovať potencionálne problémy. Ak problémy evidentne nehrozia, tak parameter pause nemusíme použiť, pretože pri jeho použití musíme boot potvrdzovať. To by nám mohlo skomplikovať automatickú inštaláciu o ktorej sa zmienim o chvíľu.

Ešte vytvoríme 2 textové súbory (winpeshl.ini a install.bat) aby sme v príkazovom riadku po nabootovani nemuseli zadávať cestu na samba server ručne.

nano /var/lib/tftpboot/WinPE10/winpeshl.ini

ktorého obsahom bude

[LaunchApps]
  "%SystemRoot%\System32\install.bat"
nano /var/lib/tftpboot/WinPE10/install.bat

ktorého obsahom bude

@echo off
wpeinit
net use z: \\192.168.1.111\win10 /user:meno heslo
z:
setup.exe

Vyznačený riadok 3 je cesta k inštalačnému médiu uloženom na samba servery. Aj keď je samba server nastavený pre anonymous zdieľanie, tak za lomítkom sa vyžaduje vyplniť meno a heslo (meno aj heslo môže byť vymyslené). To je všetko čo sa týka nastavenia PXE servera. Teraz pripojíme klientský počítač na sieť kde nám beží PXE server (DHCP) a v počítači cez BIOS/UEFI povolíme bootovanie zo siete. Bootovanie zo siete sa nastaví pri štarte PC, obyčajne podržaním klávesy F12. Počítaču budu z DHCP servera pridelené potrebné adresy a následne by sa malo zobraziť bootovacie menu, kde vyberieme čo chceme robiť. Typicky budeme chcieť inštalovať Windows 10, tak potvrdíme túto možnosť. Systém začne bootovať a po niekoľkých minútach by sa mala spustiť inštalácia Windows 10.

Zautomatizovanie inštalácie

V tejto časti len uvediem, že inštaláciu Windows 10 je možné zautomatizovať pomocou Windows System Image Manager z balíka WADK, alebo je možné použiť online generátor na tvorbu autounattend.xml súboru. Ja som použil druhú možnosť a súbor som si vygeneroval na webe Windowsafg. Vygenerovaný súbor stačí uložiť do koreňového adresára odkiaľ sa Windows 10 po sieti inštaluje. V našom prípade je to adresár /samba/win10. Ak to tak spravíme, tak cela inštalácia od spustenia PC až po plne nainštalovaný OS Windows 10 bude vyžadovať stlačenie jedinej klávesy F12.

Záver

Tento krátky návod predpokladá, že na proxmoxe je nainštalovaný linuxový kontajner centos 7 zo šablóny. Ako som uviedol už v blogu, tak selinux a iptables sú vypnuté, čiže z tohto hľadiska nebude potrebné vytvárať žiadne pravidlá. Pokúšal som sa po sieti bootvať aj OS Windows 7 (či už pomocou memdisk, alebo wimboot), ale boot.wim neobsahoval potrebné ovládače a dodatočne som ich už nepridával. Vzhľadom k tomu, že pre Windows 7 končí oficiálna podpora 14.01.2020, tak sa tomu ďalej nebudem venovať. Ak si nájdem viac času, tak v ďalších blogoch popíšem ako bootovať po sieti linuxové operačné systémy.

Leave a Reply

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *