tl;dr: În timpul încărcării unui initramfs (execuția modulelor dracut) pe un client PXE, trebuie să redenumesc numele interfeței (predictibile) date de kernel (în acest moment sunt nume ethX imprevizibile). În acest fel, clientul PXE va porni întotdeauna de la o interfață cu nume previzibil. În prezent citesc informațiile hardware cu dmesg
în timpul cârligului dracut cmdline. Aș putea pisică
o regulă udev la /usr/lib/udev/rules.d/
aici, astfel încât sistemul să poată redenumi interfețele atunci când dracut declanșează mai târziu udev?
Practic, am asta în cârligul dracut cmdline:
# Prima citire hardware furnizat
dacă dmesg | grep -q „SOME_BOARD_NAME”; atunci
root=$(echo „$rădăcină” | sed -e 's/PLACEHOLDER_FILE/SOME_ROOTFS.sqsh/')
# În plus, sunt necesare unele reguli udev specifice acestei plăci.
# mkdir -p /etc/udev/rules.d
# echo „instalează regulile acestor plăci!\n”
# echo << EOF > /etc/udev/rules.d/70-persistent-net.rules
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*1c.0/0000:07:00.0/net/*", NAME="eth0"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*01.1/0000:05:00.0/net/*", NAME="eth1"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*01.1/0000:05:00.1/net/*", NAME="eth2"
#EOF
elif dmesg | grep -q „SOME_OTHER_BOARD_NAME”; atunci
root=$(echo „$rădăcină” | sed -e 's/PLACEHOLDER_FILE/SOME_OTHER_ROOTFS.sqsh/')
echo „instalați alte reguli specifice plăcii!\n”
# mkdir -p /etc/udev/rules.d
# echo << EOF > /etc/udev/rules.d/70-persistent-net.rules
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*1c.5/0000:09:00.0/net/*", NAME="eth0"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*02.2/0000:02:00.0/net/*", NAME="eth1"
#SUBSYSTEM=="net", DEVPATH="/devices/pci*/*02.2/0000:02:00.1/net/*", NAME="eth2"
#EOF
altfel
warn „Nu am detectat nicio placă - implicit la SOME_OTHER_ROOTFS.sqsh”
root=$(echo „$rădăcină” | sed -e 's/PLACEHOLDER_FILE/SOME_OTHER_ROOTFS.sqsh/')
fi
Mai multe informatii:
Echipa mea și cu mine avem un singur computer de bord pe care PXE pornește de la un server extern. Urmează o succesiune de:
- SBC trage un initramfs și îl încarcă.
- Initramfs execută un modul dracut care citește informațiile hardware ale SBC (în timpul cârligului dracut „cmdline”).
- SBC derulează un anumit sistem de fișiere rădăcină, în funcție de hardware-ul său.
Din păcate, vechile nume de interfețe ethX (imprevizibile) fac uneori ca SBC să tragă în jos sistemul de fișiere rădăcină prin interfața de rețea greșită.
Planul meu este să elimin net.ifnames=0
și biosdevname=0
de la linia de comandă a nucleului folosită la pornirea PXE (pasul 1). Apoi, după ce nucleul a atribuit nume previzibile, vreau să extind modulul dracut pentru a adăuga reguli udev pentru a le redenumi cu numele vechi. Sper că atunci când dracut declanșează udev, SBC va trage întotdeauna sistemul de fișiere rădăcină peste interfața corectă.