Linux friert mit pxe ein, wenn mehr als eine Netzwerkschnittstelle vorhanden ist

481
user3459474

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.

2

2 Antworten auf die Frage

1
Pat

appendFü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 hatte noch ein paar andere Probleme mit verschiedenen Systemen (die Tests waren bei Virtualbox, bei MANO842-Motherboard-Karten hatte ich immer noch Probleme beim Booten), aber dank dieser Informationen konnte ich die Informationen finden, die ich dazu benötigte Seite] (https://www.syslinux.org/wiki/index.php?title=SYSLINUX#SYSAPPEND_bitmask). Kurz gesagt, ipappend scheint veraltet zu sein, verwenden Sie stattdessen sysappend und Sie können BOOTIF = MA: CA: DD: RE: SS: 00 verwenden, um anzugeben, welcher iface verwendet werden muss. Dies könnte anderen helfen, dieses Problem später zu haben. user3459474 vor 5 Jahren 0
ipappend ist nicht veraltet. `Die in Syslinux 5.10 eingeführte Option SYSAPPEND ist eine Erweiterung einer früheren Option IPAPPEND, die nur bei PXELINUX verfügbar war. ` Pat vor 5 Jahren 0
0
Qchan

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.

Danke für die Highlights. Ich habe zugesagt, aber da ich nicht genug Ansehen habe ... nun ja, das erklärt verschiedene Dinge, und ich denke, dass pxelinux tatsächlich eine der von Ihnen beschriebenen Abhilfemaßnahmen verwendet, nämlich die zweite. user3459474 vor 5 Jahren 0