append
Fügen Sie nach der Zeile in Ihrer pxelinux cfg-Datei die Option hinzu:
ipappend 2
Dadurch wird der Boot-Kernel angewiesen, die DHCP-Transaktion mithilfe der PXE-Boot-NIC auszuführen
Ich habe 2 virtuelle Maschinen mit virtualbox eingerichtet: Der erste (danach benannte Server) fungiert als dhcp (isc-dhcp-server) und tftp (atftpd) -Server, der andere (nachfolgend als "Client" bezeichnet) als Computer ohne Festplatte .
Der Startvorgang für den Client beginnt mit syslinux, wodurch ein Linux-Kernel geladen wird, der die Argumente "initrd = ram_test.img nfsroot = 10.0.0.1: / srv / nfsroot / stretch, rw ip = dhcp rw" übergibt.
Die Computer sind als 64-Bit-Server definiert, der Server bootet auf einem Debian-Stall und dem Client steht ein Debian-Stall zum Starten zur Verfügung.
Es gibt keine Probleme, wenn der Client nur über eine Netzwerkschnittstelle verfügt (internes Netzwerk, Kartentyp "intel pro / 100MT Desktop (8254OEM)"). Sobald ich jedoch einen anderen Typ desselben Typs mit einer anderen MAC-Adresse hinzufüge, ist alles in Ordnung OK, bis Linux versucht, die DHCP-Adresse abzurufen.
An diesem Punkt friert das System die Phrase "random: fast init done" ein. Die anderen Dinge, die ich vorher sehen kann und die wahrscheinlich interessanter sind, sind:
e1000: enp0s8 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX e1000: enp0s3 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX IPv6: ADDRCONF(NETDEV_CHANGE): enp0s8: link becomes ready IPv6: ADDRCONF(NETDEV_CHANGE): enp0s3: link becomes ready IP-Config: no response after 2 secs - giving up IP-Config: enp0s3 hardware address 08:00:27:2a:1a:3b mtu 1500 DHCP IP-Config: enp0s8 hardware address 08:00:27:5f:de:30 mtu 1500 DHCP
Nach dem Einfrieren, 323 Sekunden später, gibt es nur noch "random: crng init done".
Hier ist die dhcpd.conf:
allow booting; allow bootp; subnet 10.0.0.0 netmask 255.255.255.0 { #range: 10.0.0.0xC0/26 range 10.0.0.192 10.0.0.250; option broadcast-address 10.0.0.255; option routers 10.0.0.1; filename "tftp://10.0.0.1/pxelinux.0"; }
Damit alles funktioniert (zumindest mit nur einer Schnittstelle), musste ich die Datei /srv/nfsroot/stretch/etc/initramfs-tools/initramfs.conf so ändern, dass sie wie folgt aussieht (Kommentare und leere Zeilen entfernt):
MODULES=netboot BUSYBOX=auto KEYMAP=fr COMPRESS=gzip DEVICE=eth0 NFSROOT=auto BOOT=nfs
Ich denke, das Problem kommt von den Argumenten, die dem Kernel in der syslinux-Konfiguration oder der initramfs.conf zur Verfügung gestellt wurden, aber ich kann den genauen Punkt nicht finden, an dem ich versage, und das Durchsuchen des Webs war ebenfalls erfolglos.
Während ich das alles schrieb, bemerkte ich die Zeile "DEVICE = eth0" in der initramfs.conf und dachte, es könnte dies sein, aber ich habe gerade versucht, die Linux-Kernel-Parameter so zu ändern, dass sie "net.ifnames = 0 biosdevname = 0" hinzugefügt wird "so dass der Kernel die alten eth0 / eth1-Namen verwendet, aber das Verhalten ist identisch (außer natürlich, dass die Namen in den Protokollen nicht mehr enpXsY, sondern ethZ sind).
Der Vorteil von 2 Netzwerkschnittstellen in dieser VM liegt darin, dass dieses System Systeme (über cdebootstrap und manuelle Skripts, die bereits funktionieren) auf Hardware bereitstellen soll, die über 2 Netzwerkschnittstellen verfügt. Ich hatte nicht die Gelegenheit, dies in einer realen Situation zu versuchen, aber ich bin überzeugt, dass das Problem auch da sein wird (warum sollte es nicht?). Ich möchte also gerne ein paar Meinungen hier haben.
Danke und Entschuldigung für die WoT.
append
Fügen Sie nach der Zeile in Ihrer pxelinux cfg-Datei die Option hinzu:
ipappend 2
Dadurch wird der Boot-Kernel angewiesen, die DHCP-Transaktion mithilfe der PXE-Boot-NIC auszuführen
Also hier ist das Protokoll und kurz davon ...
Wenn beim Starten eines PXE-Clients ohne Festplatten mehrere Netzwerkschnittstellen vorhanden sind, stürzt der Kernel möglicherweise in einer Kernel-Panik ab oder IP-Config hängt.
Der Grund dafür ist, dass in IP-Config ein Fehler aufgetreten ist und niemand wirklich daran interessiert ist, ihn zu beheben. Im Wesentlichen trifft IP-Config den DHCP-Server zu schnell und wiederholt. Aus diesem Grund antwortet das DHCP nicht zum zweiten (oder dritten) Mal, wenn IP-Config es trifft. Daher kann IP-Config ein DHCP nicht auflösen. Ohne IP kann das Stammverzeichnis nicht eingerichtet werden und der Kernel stürzt ab.
Die Problemumgehung ist folgende (wenn Sie iPXE verwenden):
kernel $ vmlinuz-4.4.0-43-generic boot = nfs netboot = nfs leise splash panic = 30 nfsroot = 10.0.0.1 / root network ksdevice = bootif BOOTIF = $ ip = $ { ip}: 192.168.1.1: 192.168.1.1: 255.255.255.0 ::: none
initrd $ initrd.img-4.4.0-43-generic
Wenn Sie normales PXE verwenden:
KERNEL vmlinuz-4.4.0-43-generic
IPAPPEND 2
APPEND vga = 794 boot = nfs root = / dev / nfs initrd = initrd.img-4.4.0-43-generic quiet splash panic = 30 - nfsroot = 192.168.1.1: / root ip = 192.168.1.2: 192.168.1.1 : 192.168.1.1: 255.255.255.0 ::: none
Ich erwarte nicht, dass Ihre Einträge genau so aussehen werden. Dies sind nur Beispiele . Bearbeiten Sie Ihre also entsprechend.
1) Sie müssen eine statische IP-Adresse direkt in den Kernel-Parametern (oder im Anhang) festlegen. Wenn Sie dies nicht tun, versucht IP-Config, DHCP auszuführen, und Sie möchten dies nicht .
2) Sie möchten, dass PXE nur von einer NIC-Schnittstelle abfragt und nicht von allen. Um zu erzwingen, dass nur eine Schnittstelle verwendet wird, verwenden Sie in iPXE "network ksdevice = bootif BOOTIF = $ " und in regulärer PXE "IPAPPEND 2". Schreiben Sie es genau wie oben gezeigt.
Das ist es! In zwei einfachen Schritten sind Sie unterwegs.
Der BOOTIF zwingt PXE, nur die primäre Schnittstelle zu verwenden, auf die der PXE geladen wurde. Alle anderen Schnittstellen werden ignoriert. IPAPPEND macht genau das gleiche.