linux:changemacnvramethtool

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
linux:changemacnvramethtool [2026/02/12 16:28] – eine formatierte Version devnulllinux:changemacnvramethtool [2026/02/12 17:17] (aktuell) – hinweis devnull
Zeile 14: Zeile 14:
 ===== Vorbereitungen ===== ===== Vorbereitungen =====
 ==== Intel e1000 ==== ==== Intel e1000 ====
- 
- 
 Intel e1000 und e1000e haben einen NVM Schreibschutz, der beim initialisieren der Netzwerkkarte während des Ladens des Moduls eingeschaltet wird. Das heißt, man kann den nicht im Betrieb ändern, dafür muss die Netzwerkarte Stromlos sein. Intel e1000 und e1000e haben einen NVM Schreibschutz, der beim initialisieren der Netzwerkkarte während des Ladens des Moduls eingeschaltet wird. Das heißt, man kann den nicht im Betrieb ändern, dafür muss die Netzwerkarte Stromlos sein.
   - fahre den Rechner herunter   - fahre den Rechner herunter
Zeile 21: Zeile 19:
  
 -> für andere Module/Netzwerkkarten muss man sich die Kernel Dokumentation zu dem Modul anschauen (Im Kernel Source unter Documentation) -> für andere Module/Netzwerkkarten muss man sich die Kernel Dokumentation zu dem Modul anschauen (Im Kernel Source unter Documentation)
 +
 +==== Magic Numbers ====
 +Wenn Sie in den NVRAM schreiben wollen, benötigen Sie eine MagicNumber, die quasi wie ein Passwort verwendet wird.
 +Diese Nummer wird vom Hersteller der Netzwerkkarte festgelegt und ist im Zweifel ein Geheimnis. Wenn Sie aber ein taugliches Kernel-Modul für Ihre Netzwerkkarte verwenden, also ein solches mit ethtool Interface, dann können Sie die Magic-Number im Kernel Source zur Ihrem Modul finden. Hier der Pfad zu den Treibern: [[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/drivers/net/ethernet?h=v6.19|Kernel Source Browser @ GIT]].
 +
 +Magic Numbers werden imm Hexadezimal, daher mit 0x angegeben.
 +Folgend die bekannten Magic-Numbers bzw. ihre Bildungsregel in einer Tabelle.
 +
 +^Hersteller ^Kartentyp ^Kernelmodul ^MagicNumber ^Beispiel ^
 +|Intel|e1000,e1000e|e1000,e1000e|0x{ProductID}+{VendorID}|0x15708086|
 +
  
 ===== Vorgang Änderung ===== ===== Vorgang Änderung =====
Zeile 40: Zeile 49:
         00:1f.6 0200: 8086:1570 (rev 21)         00:1f.6 0200: 8086:1570 (rev 21)
         </sxh>Daher ist die Magic-Number: 0x15708086         </sxh>Daher ist die Magic-Number: 0x15708086
-  - nun nur noch eine neue Mac-Adresse aussuchen. Zum Beispiel diese hier 01:02:0a:0b:0c:0d und mit folgendem Befehl auf in den EEProm schrieben. Achte darauf, das du hexadezimale Werte nimmst, sonst zerstörst du das MAC-Format welches später von der KernelFunktion: is_valid_ether_addr() gefressen wird und es wird kein Interface angelegt. +  - nun nur noch eine neue Mac-Adresse aussuchen. Zum Beispiel diese hier 01:02:0a:0b:0c:0d und mit folgendem Befehl auf in den EEProm schrieben. Achte darauf, das du hexadezimale Werte nimmst, sonst zerstörst du das MAC-Format welches später von der KernelFunktion: is_valid_ether_addr() gefressen wird und es wird kein Interface angelegt.<sxh bash>sudo ethtool -E eth0 magic 0x15708086 offset 0x00 length 1 value 0x01 
-<WRAP center round tip 60%> +
-Es hat sich herausgestellt, dass der Aufruf mit einer Länge von 6 und der kompletten Anzahl der zu ändernden Bits fehlschlägt, daher wird hier jedes Bit einzeln geändert +
-</WRAP> +
-<sxh bash>sudo ethtool -E eth0 magic 0x15708086 offset 0x00 length 1 value 0x01 +
 sudo ethtool -E eth0 magic 0x15708086 offset 0x01 length 1 value 0x02  sudo ethtool -E eth0 magic 0x15708086 offset 0x01 length 1 value 0x02 
 sudo ethtool -E eth0 magic 0x15708086 offset 0x02 length 1 value 0x0a  sudo ethtool -E eth0 magic 0x15708086 offset 0x02 length 1 value 0x0a 
 sudo ethtool -E eth0 magic 0x15708086 offset 0x03 length 1 value 0x0b  sudo ethtool -E eth0 magic 0x15708086 offset 0x03 length 1 value 0x0b 
 sudo ethtool -E eth0 magic 0x15708086 offset 0x04 length 1 value 0x0c  sudo ethtool -E eth0 magic 0x15708086 offset 0x04 length 1 value 0x0c 
-sudo ethtool -E eth0 magic 0x15708086 offset 0x05 length 1 value 0x0d</sxh>+sudo ethtool -E eth0 magic 0x15708086 offset 0x05 length 1 value 0x0d</sxh><WRAP center round tip 60%> 
 +Es hat sich herausgestellt, dass der Aufruf mit einer Länge von 6 und der kompletten Anzahl der zu ändernden Bits fehlschlägt, daher wird hier jedes Bit einzeln geändert 
 +</WRAP> 
 + 
 +===== Hilfe ===== 
 +===== Bad Address beim Aufruf von ethtool -E ===== 
 +Bis jetzt deutete das immer auf eine fehlerhafte Magic Number hin 
 + 
 +===== Invalid MAC Address ===== 
 +Nachdem man eine neue Mac-Adresse in den NVRAM geschrieben hat und auch keine Fehlermeldung von ethtool bekam, kann es dennoch sein, dass es Quatsch war, was man rein schrieb. 
 +Ich "Honk" hab das auch geschafft und keine Hexadezimalen Werte in den NVRAM geschrieben sondern glatt mal dezimal-Zahlen. 
 +Beim nächsten Boot des Systems bemängelte der Kernel: <wrap hi>Invalid MAC Address</wrap> was zur Folge hatte, dass auch kein Interface angelegt wurde, weshalb ich die MAC auch nicht mehr ändern konnte. 
 + 
 +Diese Meldung wird von der Methode ''is_valid_ether_addr()'' ausgelöst, welche sich in der Datei [[https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/linux/etherdevice.h?h=v6.19|include/linux/etherdevice.h]] des Kernels befindet.  
 + 
 +**Die Lösung sieht wir folgt aus:** 
 +  * Kernel als Source herunterladen 
 +  * Datei **include/linux/etherdevice.h** bearbeiten 
 +  * die Methode muss dazu gebracht werden, immer true zurückzugeben, daher, die Prüfung der MAC muss abgeschaltet werden. Also die Funktion wie folgt ändern von:<sxh c>/** 
 + * is_valid_ether_addr - Determine if the given Ethernet address is valid 
 + * @addr: Pointer to a six-byte array containing the Ethernet address 
 + * 
 + * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not 
 + * a multicast address, and is not FF:FF:FF:FF:FF:FF. 
 + * 
 + * Return: true if the address is valid. 
 + * 
 + * Please note: addr must be aligned to u16. 
 + */ 
 +static inline bool is_valid_ether_addr(const u8 *addr) 
 +
 + /* FF:FF:FF:FF:FF:FF is a multicast address so we don't need to 
 + * explicitly check for it here. */ 
 + return !is_multicast_ether_addr(addr) && !is_zero_ether_addr(addr); 
 +}</sxh>nach:<sxh c>/** 
 + * is_valid_ether_addr - Determine if the given Ethernet address is valid 
 + * @addr: Pointer to a six-byte array containing the Ethernet address 
 + * 
 + * Check that the Ethernet address (MAC) is not 00:00:00:00:00:00, is not 
 + * a multicast address, and is not FF:FF:FF:FF:FF:FF. 
 + * 
 + * Return: true if the address is valid. 
 + * 
 + * Please note: addr must be aligned to u16. 
 + */ 
 +static inline bool is_valid_ether_addr(const u8 *addr) 
 +
 + return true 
 +}</sxh> 
 +  * den Kernel konfigurieren 
 +  * den Kernel kompilieren 
 +  * die Module kompilieren 
 +  * den neuen Kernel booten 
 +  * <WRAP center round alert 60%> 
 +Dieser Kernel sollte nicht produktiv verwendet werden, sondern nur für die Reparatur dieses Fehlers. 
 +</WRAP> 
× iphelper toolbox

you see this when javscript or css is not working correct

Untested
IP Address:
First usable:
Subnet:
Last usable:
CIDR:
Amount of usable:
Network address:
Reverse address:
Broadcast address:

  • linux/changemacnvramethtool.1770913716.txt.gz
  • Zuletzt geändert: 2026/02/12 16:28
  • von devnull