32.8. Met PXE en een NFS-root-bestandssysteem opstarten

Geschreven door Craig Rodrigues.

Het Preboot eXecution Environment (PXE) van Intel® maakt het mogelijk om het besturingssysteem over het netwerk op te starten. Ondersteuning voor PXE wordt normaliter aangeboden in het BIOS van moderne moederborden, waar het kan worden aangezet in de instellingen van het BIOS wat opstarten over het netwerk mogelijk maakt. Een volledig werkende PXE-opstelling vereist ook correct geconfigureerde DHCP- en TFTP-servers.

Wanneer de gastheercomputer opstart, krijgt het informatie over DHCP over waar de intiële bootloader staat via TFTP. Nadat de gastheercomputer deze informatie heeft ontvangen, downloadt het de bootloader via TFTP en voert het vervolgens de bootloader uit. Dit is gedocumenteerd in sectie 2.2.1 van de Preboot Execution Environment (PXE) Specification. In FreeBSD is de bootloader die tijdens het PXE-proces wordt opgehaald /boot/pxeboot. Terwijl /boot/pxeboot wordt uitgevoerd, wordt de kernel van FreeBSD geladen en wordt er verder gegaan met de rest van de opstartprocedure van FreeBSD. Kijk voor meer informatie over het opstartproces van FreeBSD in Hoofdstuk 13.

32.8.1. De chroot-omgeving voor het NFS-root-bestandssysteem instellen

  1. Kies een map uit voor een installatie van FreeBSD die over NFS aangekoppeld kan worden. Bijvoorbeeld een map als /b/tftpboot/FreeBSD/install.

    # export NFSROOTDIR=/b/tftpboot/FreeBSD/install
    # mkdir -p ${NFSROOTDIR}
    
  2. Stel de NFS-server in door de instructies in Paragraaf 30.3.2 op te volgen.

  3. Exporteer de map via NFS door het volgende aan /etc/exports toe te voegen:

    /b -ro -alldirs
    
  4. Herstart de NFS-server:

    # /etc/rc.d/nfsd restart
    
  5. Stel inetd(8) in door de stappen zoals in Paragraaf 30.2.2 beschreven op te volgen.

  6. Voeg de volgende regel toe aan /etc/inetd.conf:

    tftp dgram udp wait root /usr/libexec/tftpd tftpd -l -s /b/tftpboot
    
  7. Herstart inetd:

    # /etc/rc.d/inetd restart
    
  8. Herbouw de kernel en userland van FreeBSD:

    # cd /usr/src
    # make buildworld
    # make buildkernel
    
  9. Installeer FreeBSD in de map die over NFS is aangekoppeld:

    # make installworld DESTDIR=${NFSROOTDIR}
    # make installkernel DESTDIR=${NFSROOTDIR}
    # make distribution DESTDIR=${NFSROOTDIR}
    
  10. Test dat de TFTP-server werkt en dat het de bootloader dat via PXE verkregen zal worden kan downloaden:

    # tftp localhost
    tftp> get FreeBSD/install/boot/pxeboot
    Received 264951 bytes in 0.1 seconds
    
  11. Voeg een regel aan ${NFSROOTDIR}/etc/fstab toe om het root-bestandssysteem over NFS aan te koppelen:

    # Device                                            Mountpoint    FSType   Options  Dump Pass
    mijnhost.example.com:/b/tftpboot/FreeBSD/install      /         nfs      ro        0    0
    

    Vervang mijnhost.example.com door de hostnaam of het IP-adres van uw NFS-server. In dit voorbeeld wordt het root-bestandssysteem als alleen-lezen aangekoppeld om te voorkomen dat NFS-cliënten per ongeluk de inhoud van het root-bestandssysteem wissen.

  12. Stel het root-wachtwoord in voor de chroot(8)-omgeving.

    # chroot ${NFSROOTDIR}
    # passwd
    

    Dit stelt het root-wachtwoord in voor cliëntmachines die over PXE opstarten.

  13. Maak root-logins over SSH mogelijk voor cliëntmachines die met PXE opstarten door ${NFSROOTDIR}/etc/ssh/sshd_config te bewerken en de optie PermitRootLogin aan te zetten. Dit is gedocumenteerd in sshd_config(5).

  14. Pas andere wijzigingen toe aan de chroot(8)-omgeving in ${NFSROOTDIR}. Deze wijzigingen zouden het toevoegen van pakketten met pkg_add(1), het bewerken van het wachtwoordbestand met vipw(8) of het bewerken van amd.conf(5)-projecties voor automatisch aankoppelen kunnen zijn. Bijvoorbeeld:

    # chroot ${NFSROOTDIR}
    # pkg_add -r bash
    

32.8.2. Geheugenbestandssystemen die gebruikt worden door /etc/rc.initdiskless configureren

Als u vanaf een NFS-rootvolume opstart, detecteert /etc/rc dat u over NFS opstartte en draait het het script /etc/rc.initdiskless. Lees het commentaar in dit script om te begrijpen wat er gebeurt. Het is nodig om /etc en /var geheugen-backed te maken omdat deze mappen schrijfbaar moeten zijn, maar de NFS-rootmap is alleen-lezen.

# chroot ${NFSROOTDIR}
# mkdir -p conf/base
# tar -c -v -f conf/base/etc.cpio.gz --format cpio --gzip etc
# tar -c -v -f conf/base/var.cpio.gz --format cpio --gzip var

Wanneer het systeem opstart, zullen er geheugen-bestandssystemen voor /etc en /var worden aangemaakt en aangekoppeld, en zal de inhoud van de cpio.gz-bestanden er naartoe worden gekopieerd.

32.8.3. Een DHCP-server prepareren

PXE heeft een geprepareerde TFTP-server en DHCP-server nodig. De DHCP-server hoeft niet per së dezelfde machine te zijn als de TFTP-server, maar het dient bereikbaar te zijn in uw netwerk.

  1. Installeer de DHCP-server door de instructies op te volgen zoals beschreven in Paragraaf 30.5.7. Zorg ervoor dat /etc/rc.conf en /usr/local/etc/dhcpd.conf correct zijn geconfigureerd.

  2. Stel in /usr/local/etc/dhcpd.conf next-server, filename en option root-path in om het IP-adres van uw TFTP-server, het pad naar /boot/pxeboot en het pad naar het NFS-root-bestandssysteem op te geven. Hier is een voorbeeld van de instellingen voor dhcpd.conf:

    subnet 192.168.0.0 netmask 255.255.255.0 {
       range 192.168.0.2 192.168.0.3 ;
       option subnet-mask 255.255.255.0 ;
       option routers 192.168.0.1 ;
       option broadcast-address 192.168.0.255 ;
       option domain-name-server 192.168.35.35, 192.168.35.36 ;
       option domain-name "example.com";
    
       # IP-adres van TFTP server
       next-server 192.168.0.1 ;
    
       # pad van bootloader verkregen via TFTP
       filename "FreeBSD/install/boot/pxeboot" ;
    
       # pxeboot bootloader zal proberen om deze map te NFS-mounten voor root-FS
       option root-path "192.168.0.1:/b/tftpboot/FreeBSD/install/" ;
    }
    

32.8.4. De PXE-cliënt configureren en verbindingsproblemen opsporen

  1. Ga naar het BIOS-configuratiemenu wanneer de cliëntmachine opstart. Stel het BIOS zo in dat het van het netwerk opstart. Indien alle vorige configuratiestappen correct zijn, zou alles "gewoon" moeten werken.

  2. Gebruik de poort net/wireshark om netwerkverkeer met betrekking tot het PXE-opstartproces te debuggen, wat geïllustreerd is in onderstaand diagram. In Paragraaf 32.8.3 is een voorbeeldconfiguratie gegeven waarbij de DHCP-, TFTP- en NFS-servers op dezelfde machine staan. Deze servers kunnen echter op verschillende machines staan.

    Figuur 32-1. PXE-opstartproces met NFS-root-mount

    (1)
    Cliënt zendt DHCPDISCOVER uit.
    (2)
    DHCP-server antwoordt met IP-adres, next-server, filename en root-path.
    (3)
    Cliënt verstuurt TFTP-verzoek naar next-server om filename op te vragen.
    (4)
    TFTP-server antwoordt en verstuurt filename naar cliënt.
    (5)
    Cliënt voert filename uit welke pxeboot(8) is. pxeboot(8) laadt de kernel. Wanneer de kernel draait, wordt het root-bestandssysteem gespecificeerd door root-path over NFS aangekoppeld.
  3. Controleer dat het bestand pxeboot via TFTP kan worden verkregen. Kijk op uw TFTP-server in /var/log/xferlog om er zeker van de zijn dat het bestand pxeboot van de juiste locatie is opgehaald. Om de configuratie met bovenstaande dhcpd.conf te testen:

    # tftp 192.168.0.1
    tftp> get FreeBSD/install/boot/pxeboot
    Received 264951 bytes in 0.1 seconds
    

    Lees tftpd(8) en tftp(1). De BUGS secties in deze pagina's documenteren enkele beperkingen van TFTP.

  4. Controleer dat het root-bestandssysteem via NFS kan worden aangekoppeld. Om de configuratie met bovenstaande dhcpd.conf te testen:

    # mount -t nfs 192.168.0.1:/b/tftpboot/FreeBSD/install /mnt
    
  5. Lees de code in src/sys/boot/i386/libi386/pxe.c om te begrijpen hoe de pxeboot-lader variabelen als boot.nfsroot.server en boot.nfsroot.path instelt. Deze variabelen worden vervolgens gebruikt in de root-aankoppelcode voor diskvrij NFS in src/sys/nfsclient/nfs_diskless.c.

  6. Lees pxeboot(8) en loader(8).