DCHP und TFTP, zusammengeknüpft

Da ich immer mal wie­der test­hal­ber Vir­tu­el­le Maschi­nen (in Vir­tu­al­Box) instal­lie­re, woll­te ich mir das ver­ein­fa­chen: Kein Boot­me­di­um, die VMs sol­len über TFTP ver­sorgt wer­den und ein Instal­la­ti­ons­image bekommen.
Aller­dings sol­len nor­ma­le DHCP-Cli­ents ein­fach nur DHCP bekommen.
Also muß der DHCP-Ser­ver wis­sen, ob ein Netz­boot kommt (den Cli­ent muß er dann näm­lich an den TFTP-Ser­ver wei­ter­rei­chen), oder eben ob der Cli­ents nur mit DHCP zu ver­sor­gen ist.

Ich ver­wen­de den DHCP-Ser­ver vom ISC, mit dem geht das ganz einfach:
Erst ein­mal erlau­ben wir über­haupt das Booten:

allow booting;
allow bootp;

Dann defi­nie­ren wir eine Klas­se “pxe­cli­ents”:

class "pxeclients" {
   match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
   next-server 192.168.1.15;
   filename "pxelinux.0";
}

Die Klas­se benö­ti­gen wir, um TFTP-Cli­ents von rei­nen DHCP-Cli­ents unter­schei­den zu können.
Dann das ganz nor­ma­le DHCP-Geraffel:

subnet 192.168.1.0 netmask 255.255.255.0 {
   [...]
   filename "pxelinux.0";
   pool {
      allow unknown-clients;
      range 192.168.1.50 192.168.1.100;
      [...]
   }
}
[...]
group {
   next-server 192.168.1.15;
   host tftpclient {
     filename "pxelinux.0";
   }
}

(Wahr­schein­lich kann mich sich den gan­zen group-Con­tai­ner sparen)

Damit ist der DHCP-Teil erle­digt, wei­ter gehts mit TFTP. Bei mir läuft tftp-hpa, der ist in den Debi­an-Repo­si­to­ries ent­al­ten und wird ganz ein­fach über /et­c/­de­faul­t/tftpd-hpa konfiguriert:

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/usbplatte-2/tftpboot"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

Oben bei der dhcp-Kon­fi­gu­ra­ti­on haben wir gesagt, daß pxelinux.0 ver­wen­det wer­den soll.
/usbplatte‑2/tftpboot sieht des­halb so aus:

lrwxrwxrwx 1 124 root     8 Nov 28 18:44 MENU.c32 -> menu.c32
-rw-r--r-- 1 124 root   156 Nov 28 16:57 boot.txt
drwxr-xr-x 3 124 root  4096 Nov 28 18:51 centos
drwxr-xr-x 4 124 root  4096 Nov 28 10:44 debian
-rw-r--r-- 1 124 root 61312 Nov 28 18:26 menu.c32
drwxr-xr-x 3 124 root  4096 Nov 28 16:38 opensuse
-rw-r--r-- 1 124 root 26474 Oct  9 20:31 pxelinux.0
drwxrwxr-x 2 124 root  4096 Dec 29 11:36 pxelinux.cfg
drwxr-xr-x 3 124 root  4096 Nov 28 11:06 ubuntu
drwxr-xr-x 2 124 root  4096 Dec  2 19:07 ubuntu-diskless

Ehr­lich gesagt, weiß ich gar nicht mehr, woher ich menu.c32 und pxelinux.0 habe 🙂 Wahr­schein­lich aus dem SYSLINUX- oder PXELINUX-Paket.
Ent­schei­dend ist nun die Datei default im Ver­zeich­nis pxelinux.cfg; mei­ne ist ziem­lich groß:

DEFAULT MENU.c32
ALLOWOPTIONS 0
PROMPT 0
TIMEOUT 0

MENU TITLE Choose your weapon

LABEL harddisk
  MENU LABEL ^0 Boot from local Harddisk
  TEXT HELP
    Boots from local hard drive
  ENDTEXT
  MENU default
  LOCALBOOT 0

LABEL debian_7_amd64_install
  MENU LABEL ^1 Debian 7 Install (64 Bit)
  KERNEL debian/wheezy/amd64/linux
  APPEND vga=normal initrd=debian/wheezy/amd64/initrd.gz -- quiet

LABEL debian_6_amd64_install
  MENU LABEL ^2 Debian 6 Install (64 Bit)
  KERNEL debian/squeeze/amd64/linux
  APPEND priority=low vga=normal initrd=debian/squeeze/amd64/initrd.gz -- quiet

LABEL ubuntu_13.10_install
  MENU LABEL ^3 Ubuntu 13.10 Install (64 Bit)
  KERNEL ubuntu/13.10/amd64/linux
  APPEND vga=normal initrd=ubuntu/13.10/amd64/initrd.gz -- quiet

LABEL centos_6.4
  MENU LABEL ^4 CentOS 6.4 Install (64 Bit)
  KERNEL centos/6.4/x86_64/vmlinuz
  APPEND initrd=/centos/6.4/x86_64/initrd.img devfs=nomount ramdisk_size=9216 method=ftp://ftp.tu-chemnitz.de/pub/linux/centos/6.4/os/x86_64/

LABEL opensuse_13.1_x86_64_install
  MENU LABEL ^5 OpenSUSE 13.1 Install (32 Bit)
  KERNEL opensuse/13.1/i386/linux
  APPEND initrd=opensuse/13.1/i386/initrd install=http://download.opensuse.org/distribution/13.1/repo/oss/

LABEL opensuse_13.1_i386_install
  MENU LABEL ^6 OpenSUSE 13.1 Install (64 Bit)
  KERNEL opensuse/13.1/x86_64/linux
  APPEND initrd=opensuse/13.1/x86_64/initrd install=http://download.opensuse.org/distribution/13.1/repo/oss/

LABEL ubuntu_diskless
  MENU LABEL ^7 Ubuntu diskless
  KERNEL ubuntu-diskless/bzImage
  APPEND netboot=nfs root=/dev/nfs initrd=ubuntu-diskless/vmlinuz-3.11.0-13-generic nfsroot=192.168.1.15:/usbplatte-2/nfsexports/vm/ubuntu-diskless,vers=3 ip=dhcp rw raid=noautodetect edd=on nolapic ip=192.168.1.70:192.168.1.254:255.255.255.0

Die Optio­nen für Ububtu dis­kless sind noch verbesserungsfähig.
Und wenn wir das alles zusam­men­ge­knüp­pert haben, sieht das total schick aus:
Wir holen uns eine DHCP-Adresse:
DHCP
Haben wir die, wen­den wir uns an den TFTP-Server:
tftp
Der gibt uns ein schi­ckes Menü:
Menu
Sagen wir mal, wir wol­len Ubun­tu instal­lie­ren, begrüßt uns der ganz nor­ma­le Installer:
Ubuntu
Und nun kann eben ganz nor­mal instal­liert wer­den, übers Netz, ganz ohne DVD, CD, USB-Stick 🙂

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert