home
erste Version am 09.10.2016
letzte Änderung am 09.10.2016

PXE Server VM aufsetzen


Bei dieser kleinen Studie soll ein PXE-Server in einer Debian-Jessie-VM eingerichtet werden.
Die VM läuft unter KVM und KVM läuft auf einem Host unter openSUSE 13.2.



Ein PXE-Server ist das Zusammenspiel eines TFTP- und eines DHCP-Servers und dient dazu, Systeme aus dem Netz booten zu können.
Weil diese Systeme bei mir wohl primär ebenfalls VMs sein werden, war die erste Frage, in welchem Netz der neue DHCP-Server seine Dienste anbieten soll. Schließlich soll er weder dem DHCP-Server auf der Fritzbox, noch dem der Gateway-VM in die Quere kommen. Analog zur Gateway-VM wäre ein weiteres VLAN denkbar. Damit müssten die vNICs neu angelegter VMs diesem VLAN zugeordnet werden können. Das geht so aber erstmal nicht. Dazu wird ein weiteres Netzwerk-Interface auf dem KVM-Host gebraucht.
Weil ich wahrscheinlich eh nie physikalische Systeme davon booten lassen will, reicht ein simples host-only-Interface ohne spezielles VLAN ebenso (ähnlich dem von VMware-Workstation).
Das lässt sich mit einem weiteren Bridge-Interface machen, welches mit yast einfach und komfortabel folgendermaßen angelegt wird:
 YaST2 - lan @ i5

  Network Card Setup
  ┌General──Address──Bridged Devices───────────────────────────────────┐
  │ Device Type             Configuration Name                         │
  │ Bridge▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒↓  br1▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒  │
  │( ) No Link and IP Setup (Bonding Slaves)                           │
  │( ) Dynamic Address  DHCP▒▒▒▒▒▒▒▒▒▒↓  DHCP both version 4 and 6▒↓   │
  │(x) Statically Assigned IP Address                                  │
  │IP Address          Subnet Mask          Hostname                   │
  │192.168.1.254▒▒▒▒▒▒ /24▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ kvmhost▒▒▒▒▒▒▒▒▒▒          │
  │┌Additional Addresses──────────────────────────────────────────────┐│
  ││   ┌──────────────────────────────────────────────────────────┐   ││
  ││   │IPv4 Address Label│IP Address│Netmask                     │   ││
  ││   │                                                          │   ││
  ││   │                                                          │   ││
  ││   └──────────────────────────────────────────────────────────┘   ││
  ││   [Add][Edit][Delete]                                            ││
  │└──────────────────────────────────────────────────────────────────┘│
  └────────────────────────────────────────────────────────────────────┘
 [Help]               [Back]               [Cancel]               [Next]

 F1 Help  F3 Add  F9 Cancel  F10 Next
Das eingestellte Subnetz muss frei bzw. bisher ungenutzt sein.
Weil das neue Interface host-only sein soll, wird es keinem physikalischen Interface zugewiesen:
YaST2 - lan @ i5

  Network Card Setup
  ┌General──Address──Bridged Devices───────────────────────────────────┐
  │┌Bridged Devices───────────────────────────────────────────────────┐│
  ││[ ] enp3s0 - RTL8111/8168 PCI Express Gigabit Ethernet controller ││
  ││[ ] wlan0 - 802.11n WLAN NIC configured                           ││
  ││                                                                  ││
  ││                                                                  ││
  │└├──────────────────────────────────────────────────────┤──────────┘│
  └────────────────────────────────────────────────────────────────────┘
 [Help]               [Back]               [Cancel]               [Next]

 F1 Help  F9 Cancel  F10 Next
Nach einem Reboot des KVM-Hosts kennt KVM eine neue "Network source".
Damit auf dem KVM-Host möglichst wenig geändert werden muss, wird die PXE-Server-VM auch ein Beinchen ins restliche Netz bekommen und kann darüber Gateway für die VMs im host-only-Netz spielen.

Erstmal wird eine neue VM angelegt - allerdings noch ohne den host-only-NIC.
Installationsquelle ist: debian-8.5.0-amd64-netinst.iso
1GB RAM, eine CPU und 4GB HDD sollten reichen.
Bei der Softwareauswahl wird nur "SSH server" und "Standard-Systemwerkzeuge" gewählt.

Nach Fertigstellung der VM erfolgt der Zugriff darauf per ssh.
Vorab das übliche Gedöns:
ssh-copy-id PXEserver

ssh PXEserver

su
apt-get install sudo

nano /etc/sudoers
einfügen:
dede    ALL=(ALL) NOPASSWD: ALL
und weiter:
nano /etc/motd

nano /etc/default/grub     # GRUB_TIMEOUT=1
update-grub

apt-get install iftop htop nmap fping whois sshfs rcconf

cd
nano .bashrc    # Kommentar-Zeichen vor alias weg
exit
cd
nano .bashrc    # Kommentar-Zeichen vor alias weg

sudo init 0

Nun bekommt die ausgeschaltete VM einen weiteren NIC mit der frisch angelegten "Network source":
screenshot NIC hinzufügen
und wird damit neu gestartet.
Abhängig von der MAC-Adresse des neuen NICs kann es jetzt passieren, dass die VM den neuen NIC als eth0 sieht.
Bisher kennt das OS nur eth0 und erwartet dahinter einen DHCP-Server. Weil es den im host-only-Netz noch nicht gibt, bekommt die VM somit keine IP-Adresse.
In diesem Fall könnte man entweder die /etc/network/interfaces entsprechend umbauen oder die Interfaces beider NICs für die VM umdrehen (also quasi die MAC-Adressen tauschen).
Wie auch immer....ich gehe im weiteren davon aus, dass eth0 im normalen Netz und eth1 im host-only-Netz hängt.

Los gehts mit:
sudo nano /etc/network/interfaces
und anhängen:
auto eth1
iface eth1 inet static
  address 192.168.1.1
  netmask 255.255.255.0
sudo reboot

ssh PXEserver

Nun sollte eth0 eine Adresse per DHCP bekommen haben, eth1 statisch auf 192.168.1.1 stehen und route etwa folgendes liefern:
dede@PXEserver:~$ sudo route
Kernel-IP-Routentabelle
Ziel            Router          Genmask         Flags Metric Ref    Use Iface
default         fritz.box       0.0.0.0         UG    0      0        0 eth0
192.168.1.0     *               255.255.255.0   U     0      0        0 eth1
192.168.178.0   *               255.255.255.0   U     0      0        0 eth0
Jetzt kann dnsmasq installiert werden. Und iptables für die Gateway-Funktionalität gleich dazu:
sudo apt-get install dnsmasq iptables

sudo service dnsmasq stop
sudo nano /etc/dnsmasq.conf
Anhängen von:
interface=eth1
dhcp-range=eth1,192.168.1.100,192.168.1.150,12h
dhcp-boot=pxelinux.0
enable-tftp
tftp-root=/srv/tftp
Aktivieren mit:
sudo -i
mkdir /srv/tftp
chmod 775 /srv/tftp/
cd /srv/tftp
wget http://ftp.debian.org/debian/dists/jessie/main/installer-amd64/current/images/netboot/netboot.tar.gz
tar xzf netboot.tar.gz
rm netboot.tar.gz
service dnsmasq start

Nun noch die Funktion als Gateway einrichten (weiterhin als root):
nano /etc/sysctl.conf       # das Kommentarzeichen vor "net.ipv4.ip_forward=1" weg

iptables -A FORWARD -s 192.168.1.0/24 -i eth1 -o eth0 -m conntrack --ctstate NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables-save >/etc/iptables.up.rules

nano /etc/network/interfaces

und einstellen, die iptables-Konfig nach Neustart wieder zu laden:
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eth0
iface eth0 inet dhcp
  post-up iptables-restore < /etc/iptables.up.rules

auto eth1
iface eth1 inet static
  address 192.168.1.1
  netmask 255.255.255.0
Nach einem
sudo reboot
sollte der PXE-Server jetzt ein Debian-Bootimage anbieten und gleichzeitig Gateway ins Internet sein.



Als Test wird eine weitere VM angelegt.
Schritt 1:  PXE-Start einstellen
Screenshot neue VM

Schritt 2:  Betriebssystemtyp=Linux, Version=Debian Wheezy (or later)
Schritt 3:  1024 MB RAM, 1 CPU
Schritt 4:  3GB HDD
Schritt 5:  Namen und Netzwerk-Interface einstellen
screenshot VM-config fertig

Dann "Abschliessen" wählen und.....klappt:
Screenshot VM startet via PXE

Der nächste Schritt wird sein, statt eines Installations-Images ein lauffähiges Linux auszuliefern.
Dafür gibt es dann beizeiten eine neue Seite.