2

I'm dualbooting Windows and Linux on my machine for about 2 years now and never had a problem with dhcp conflicts.

After the recent Windows 20H2 update I suddently can't get dhcp on Linux to work if Windows was booted before.

This doesn't seem to be a timing problem because I got the same result after waiting for a few days. I'm using an AVM Fritz Box as my router/dhcp server and the only way to get dhcp to work on Linux was to reset the Fritz Box after which it worked immediately.

I was using the broader term "Linux" before because I tested it with various distributions (Arch, Gentoo, Ubuntu) and none of them could get their respective dhcp client to work with my Fritz Box. I even tried FreeBSD to rule out a problem with Linux. All of them printed some form of "DHCP lease expired could not get IP".

After resetting my router and getting a dhcp lease again I started Windows, then tried to boot a *nix again and got the same problem.

I honestly don't know what could be the cause of this because as I said before it worked before upgrading my Windows 10 to the latest version and it doesn't make sense to me that my dhcp server suddenly refuses to work after answering a dhcp request to Windows 10.

EDIT: My Mainboard is an ASUS Sabertooth Z87 with an Intel Intel I217-V NIC. As user A.B. correctly suspected the issue wasn't about getting a DHCP lease but rather a problem with the state of the I217-V NIC after shutting down Windows. See this post for the solution: https://unix.stackexchange.com/a/620766/442856

2
  • I found the DUID Windows is using and set the dhcp client on Linux accordingly. Unfortunaly that did not solve the problem. Here's another thing I found out during my tests: After restarting / shutting down Windows and then booting into Linux resulted in the problems mentioned. However, after pulling the plug of my machine and then booting into Linux/BSD made the dhcp client getting a lease again. Honestly at this point I'm suspecting an issue with the ethernet driver of Windows 20H2 that renders my ethernet port unavailable. My Mainboard is an Asus Sabertooth Z87.
    – rEsTrisA
    Commented Nov 20, 2020 at 23:42
  • My wild guess was a wrong guess. But you can also put this on the Linux/BSD side which assume the NIC in a certain state while it's not anymore. But your extra information led me to a solution I think. You should add the board name in the question (edit it)
    – A.B
    Commented Nov 21, 2020 at 0:35

3 Answers 3

3

According to Asus, OP's SABERTOOTH Z87 includes an Intel I217-V NIC. This led me to a description of the problem on ArchLinux forums:

[SOLVED] Ethernet issues after booting Windows (Intel I217-V (e1000e))

You should test on your system if the methods in these two comments (well three with this one leading to a first workaround) correct the NIC's behaviour in Linux:

  • Windows-based workaround

    And we have a winner!
    Turning off all the Power Management features does indeed fix the problem. Turned them off, booted linux as usual, found no issues. Then back to Windows, features back on, linux on, broken. So I consider that evidence enough to declare this problem solved (albeit by sacrificing WoL, which I don't mind at all)

  • The actual solution was to reset the PCI device, so it'll be back in a cold boot state, the state expected by the generic e1000e driver which might not deal correctly with this specific NIC.

    My solution is quiet simple: Reset the PCI Device before starting the Network Interface

    You might have to adapt (and clean a bit) the script below from the same comment, especially if you have more than one NIC. To be run as root user.

    #!/bin/bash
    
    #Get the PCI-Address of network card (Caution: This works ONLY with ONE NIC)
    PCI=`/usr/bin/lspci | /bin/egrep -i 'network|ethernet' | /usr/bin/cut -d' ' -f1`
    PCIPATH=`/usr/bin/find /sys -name *\${PCI} | /bin/egrep -i *pci0000*`
    
    #echo "PCI    =$PCI"
    #echo "PCIPATH=$PCIPATH"
    #ls -la $PCIPATH
    
    /usr/bin/logger -t "ResetNIC" "Resetting PCI NIC ${PCIPATH}"
    
    #Reset the PCI Device completely (like Power-ON/Off)
    echo 1 >${PCIPATH}/reset
    

I hope this will solve your problem. You should then have it run automatically at each boot.

3
  • Thank you very much for your help. This script indeed solves the problem. Now it's possible to reboot from Windows into Linux/BSD without any issues. I'll edit my question accordingly. Still, I would be interested in what exactly changed from Windows 20H1 to 20H2 causing this problem on my machine. If anybody knows please let me know.
    – rEsTrisA
    Commented Nov 21, 2020 at 10:42
  • Windows changes settings on the NIC that aren't default settings but that the generic driver, not taylored to this specific NIC, didn't expect. If this feature is not known at all by the driver it would be difficult to know. Still you could see if e1000e's module option SmartPowerDownEnable (check you are really using e1000e and then check the available params with modinfo -p e1000e) can do something.
    – A.B
    Commented Nov 21, 2020 at 10:53
  • Both workarounds worked for me. For the Windows-based one, on Windows 10 I had to install Intel's driver pack, and disable WoL and Energy Efficient Ethernet features via Intel's configuration software. After rebooting into Ubuntu, network connection was fine.
    – jasxun
    Commented Feb 26, 2022 at 7:46
0

Different process - have a project that uses a custom setup that doesn't have the init.d/networking.

Process is simple after looking at the sys directory to find the data. Seems lots of devices had reset option, so searched for the ones that had max_link_speed. On my system this is only the wired ethernet and wireless. Then write the lines to reset both to a file call out2 by replace the beginning and ending of info.

cd /sys

find . | grep max_link_speed | sed 's_./dev_echo 1> /sys/dev_g;s/max_link_speed/reset/g' > /out2

sh ./out2

But had the same issue with windows 10 messing up the setup for dhcpd. Thanks. Put blank lines in above since second line wraps.

2
  • Actual an error in that process better code. Commented Sep 22, 2021 at 16:56
  • for a in $(lspci | grep -i "ethernet" | cut -f1 -d\ ) ; do echo 1 $(find /sys | grep $a |grep reset) ; done Commented Sep 22, 2021 at 16:57
-1

Easier fix…after booting into Linux just run /etc/init.d/networking force-reload

This fixed my issue. Although you need to run it every time you switch from windows to Linux

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .