Good to Know Database

ISC DHCPD: Bootmenü für verschiedene PXE-Server


Wenn Sie einen Server in Ihrem Netzwerk haben auf welchem verschiedene PXE-Server laufen oder mehrere PXE-Server in Ihrem Netzwerk haben, stellt sich Ihnen das Problem, dass Sie nur einen PXE-Server mit der Option next-server in der Konfigurationsdatei des ISC DHCP-Daemon angeben können und somit die Clients immer nur von einem PXE-Server booten können. Um genau dieses Problem zu lösen, kann man die sogennanten Vendor-Encapsualted-Options verwenden.

In der folgenden Anleitung möchte ich Ihnen zeigen, wie Sie den ISC DHCP-Daemon so konfigurieren, dass dieser ein Bootmenü an den PXE-Client sendet welcher je nach getroffener Auswahl entweder PXELINUX oder WinPE2.1 vom entsprechenden PXE-Server bootet.

Öffnen Sie zuerst die Konfigurationsdatei /etc/dhcpd.conf um die folgenden Zeilen einzufügen.

[root@centos5 ~]# vi /etc/dhcpd.conf

Fügen Sie in den allgemeinen Teil der Konfigurationsdatei den folgenden Abschnitt ein.

option space PXE;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.menu-prompt code 10 = { unsigned integer 8, text };
option PXE.bootitem code 71 = array of { unsigned integer 8 };
option PXE.mtftp-server code 1 = ip-address;

In diesem Abschnitt wird zuerst der Vendorspace PXE definiert in welchem anschließend vier Optionen deklariert werden.

Da die PXE-Optionen nur für die Clients von Bedeutung sind welche auch vom Netzwerk booten, bietet es sich an, diese Optionen in einer eigenen Klasse zusammenzufassen welche nur für PXE-Clients gilt.

     class "PXE-Clients" {
          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";

          [...]

          }

Damit unsere Vendorspace-Optionen in der soeben erstellten Klasse angewendet werden, fügen Sie die Direktive vendor-option-space ein.

          vendor-option-space PXE;

Die folgenden Zeilen werden nur dann ausgewertet, wenn der Benutzer den Booteintrag mit der Kennung 1 (PXELINUX bzw. DOS/WinPE/Linux) ausgewählt hat.

          if option vendor-encapsulated-options = 47:04:00:01:00:00:FF {
               option vendor-class-identifier "PXEClient";
               option PXE.bootitem 0,1,0,0;
               always-broadcast off;
               next-server 192.168.10.1;
               filename "pxelinux.0";
               }

Wollen wir uns diesen ersten Abschnitt etwas genauer anschauen. Zuerst wird der Vendorspace überprüft ob der Client PXELINUX (Kennung 00:01) booten will. Wurde diese Überprüfung erfolgreich abgeschlossen, werden mit den Direktiven next-server und filename der PXE-Server und der PXE-Bootloader angegeben.

Sollte der Benutzer allerdings den Eintrag 2 (WinPE2.1) im Bootmenü ausgewählt haben, wird der folgende Abschnitt ausgewertet.

          elsif option vendor-encapsulated-options = 47:04:00:02:00:00:FF {
               option vendor-class-identifier "PXEClient";
               option PXE.bootitem 0,2,0,0;
               next-server 192.168.10.1;
               filename "/Boot/pxeboot.n12";
               }

Wie Sie sehen, wurde hier bei beiden Auswahlmöglichkeiten nur ein PXE-Server verwendet. Sollten Sie eigenständige PXE-Server benutzen oder mehr als zwei Einträge im Bootmenü benötigen, müssen Sie dementsprechend die im folgenden Beispiel mit x markierten Stellen anpassen und selbstverständig auch weitere Einträge im nachfolgenden Bootmenü hinzufügen.

          elsif option vendor-encapsulated-options = 47:04:00:xx:00:00:FF {
               option vendor-class-identifier "PXEClient";
               option PXE.bootitem 0,x,0,0;
               next-server xxx.xxx.xxx.xxx;
               filename "xxxxxxxxxx";
               }

Da der PXE-Client beim ersten DHCP-Request noch keine Kennung von einem Booteintrag mitschickt, muss im Else-Zweig das Bootmenü hinterlegt werden.

          else {
               option vendor-class-identifier "PXEClient";
               option vendor-encapsulated-options
               06: 01:
                    06:
               08: 15:
                    00:00: 01: C0:A8:0A:01:
                    00:01: 01: C0:A8:0A:01:
                    00:02: 01: C0:A8:0A:01:
               09: 2A:
                    00:01:
                         0F: 44:4F:53:2F:57:69:6E:50:45:2F:4C:69:6E:75:78:
                    00:02:
                         08: 57:69:6E:50:45:32:2E:31:
                    00:00:
                         0A: 4C:6F:63:61:6C:20:62:6F:6F:74:
               0A: 2F:
                    0A:
                    0D:0A:50:72:65:73:73:20:3C:46:38:3E:20:66:6F:72:
                    20:6D:65:6E:75:20:6F:72:20:3C:45:73:63:3E:20:74:
                    6F:20:6C:6F:63:61:6C:20:62:6F:6F:74:2E:
               FF;
               }

Die Bedeutung der verwendeten Optionen wurde in der PXE-Spezifikation von Intel definiert und können dort ab Seite 19 im Detail nachgelesen werden. Nichtsdestotrotz werde ich die einzelnen Zeilen noch kurz erklären.

               06: 01:
                    06:

Mit der Option 6 (06 Hex) wird die Bootmethode festgelegt welche eine Länge von 1 Byte (01 Hex) hat. Die 06 in der nächsten Zeile ist der hexadezimale Wert der Bootmethode und bedeutet, dass zuerst Broadcast und danach Unicast verwendet werden soll.

               08: 15:
                    00:00: 01: C0:A8:0A:01:
                    00:01: 01: C0:A8:0A:01:
                    00:02: 01: C0:A8:0A:01:

Die Option 8 (08 Hex) enthält die Liste aller Bootserver. Darauf folgt wieder die Länge aller enthaltenen Elemente welche hier 21 Bytes (15 Hex) ist. In den nächsten Zeilen stehen dann die einzelnen Elemente welche aus der Kennung (2 Byte), dem Typ (1 Byte) und der IP-Adresse des PXE-Servers (4 Byte) bestehen. Wie Ihnen vielleicht auffällt, sind hier drei Einträge vorhanden obwohl weiter oben nur zwei PXE-Server definiert wurden. Das erste Element mit der Kennung 0 (00:00) steht für das Booten von der lokalen Festplatte.

               09: 2A:
                    00:01:
                         0F: 44:4F:53:2F:57:69:6E:50:45:2F:4C:69:6E:75:78:
                    00:02:
                         08: 57:69:6E:50:45:32:2E:31:
                    00:00:
                         0A: 4C:6F:63:61:6C:20:62:6F:6F:74:

Option 9 (09 Hex) enthält die Liste der Menüeinträge. Wie gewohnt folgt darauf die Länge in Bytes (2A Hex entspricht 42 Bytes). Damit die Einträge des Bootmenüs einem PXE-Server zuegeordnet werden können, kommen vor dem eigentlichem Text und dessen Länge die Kennung. Das heißt, der Eintrag für die Kennung 1 (00:01) hat eine Länge von 15 Byte (0F Hex) und enthält den Text DOS/WinPE/Linux. Die beiden folgenden Einträge im Bootmenü lauten WinPE2.1 und Local boot.

               0A: 2F:
                    0A:
                    0D:0A:50:72:65:73:73:20:3C:46:38:3E:20:66:6F:72:
                    20:6D:65:6E:75:20:6F:72:20:3C:45:73:63:3E:20:74:
                    6F:20:6C:6F:63:61:6C:20:62:6F:6F:74:2E:

Die Option 10 (0A Hex) definiert die PXE-Eingabeaufforderung. Nach der Option folgt wieder die Längenangabe (2F Hex sind umgerechnet 47 Bytes). In der nächsten Zeile wird der Timeout für die Eingabeaufforderung in Sekunden angegeben (0A Hex entspricht 10 Sekunden). Die Werte 0 (00 Hex) und 255 (FF Hex) haben hier eine spezielle Bedeutung. Der Wert 00 bedeutet, dass der erste Eintrag aus dem Bootmenü automatisch gebootet wird und FF deaktiviert den Timeout für die Eingabeaufforderung.
Nach dem Timeout folgt der Text für die PXE-Eingabeaufforderung welcher auf dem PXE-Client angezeigt wird. Der hier verwendete ASCII-Code steht für Press <F8> for menu or <ESC> to local boot..

               FF;

Der Wert FF in der letzten Zeile schließt das ganze Menü ab.

Im folgenden Listing möchte ich Ihnen eine vollständige und funktionierende dhcpd.conf zeigen.

authoritative;

ddns-update-style none;
option domain-name "home.lan";

option space PXE;
option PXE.discovery-control code 6 = unsigned integer 8;
option PXE.menu-prompt code 10 = { unsigned integer 8, text };
option PXE.bootitem code 71 = array of { unsigned integer 8 };
option PXE.mtftp-server code 1 = ip-address;

subnet 192.168.10.0 netmask 255.255.255.0 {
     default-lease-time 3600;
     max-lease-time 7200;

     option subnet-mask 255.255.255.0;
     option routers 192.168.10.2;
     option domain-name-servers 192.168.10.1,192.168.10.2;

     pool {
          range 192.168.10.100 192.168.10.200;
          }

     class "PXE-Clients" {
          match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";

          vendor-option-space PXE;

          if option vendor-encapsulated-options = 47:04:00:01:00:00:FF {
               option vendor-class-identifier "PXEClient";
               option PXE.bootitem 0,1,0,0;
               always-broadcast off;
               next-server 192.168.10.1;
               filename "pxelinux.0";
               }
          elsif option vendor-encapsulated-options = 47:04:00:02:00:00:FF {
               option vendor-class-identifier "PXEClient";
               option PXE.bootitem 0,2,0,0;
               next-server 192.168.10.1;
               filename "/Boot/pxeboot.n12";
               }
          else {
               option vendor-class-identifier "PXEClient";
               option vendor-encapsulated-options
               06: 01:
                    06:
               08: 15:
                    00:00: 01: C0:A8:0A:01:
                    00:01: 01: C0:A8:0A:01:
                    00:02: 01: C0:A8:0A:01:
               09: 2A:
                    00:01:
                         0F: 44:4F:53:2F:57:69:6E:50:45:2F:4C:69:6E:75:78:
                    00:02:
                         08: 57:69:6E:50:45:32:2E:31:
                    00:00:
                         0A: 4C:6F:63:61:6C:20:62:6F:6F:74:
               0A: 2F:
                    0A:
                    0D:0A:50:72:65:73:73:20:3C:46:38:3E:20:66:6F:72:
                    20:6D:65:6E:75:20:6F:72:20:3C:45:73:63:3E:20:74:
                    6F:20:6C:6F:63:61:6C:20:62:6F:6F:74:2E:
               FF;
               }
          }
     }

Wenn Sie alle benötigten Zeilen in Ihre dhcpd.conf eingetragen haben, speichern Sie diese ab und starten den DHCP-Server neu.

[root@centos5 ~]# service dhcpd restart


Dieser Eintrag wurde am 24.08.2008 erstellt und zuletzt am 22.02.2012 bearbeitet.

Direkter Link zu dieser Seite: http://www.gtkdb.de/index_7_333.html

[ Zur Startseite ]   [ Zur Kategorie ]


Valid XHTML 1.0 Transitional Valid CSS Valid Atom 1.0

© 2004-2018 by Georg Kainzbauer