我在我的机器上双启动 Windows 和 Linux 已经有大约 2 年了,从来没有遇到过 dhcp 冲突的问题。
最近的 Windows 20H2 更新后,如果之前启动过 Windows,我突然无法在 Linux 上使用 dhcp。
这似乎不是一个时间问题,因为我等了几天后得到了相同的结果。我使用 AVM Fritz Box 作为我的路由器/dhcp 服务器,让 dhcp 在 Linux 上工作的唯一方法是重置 Fritz Box,然后它会立即工作。
我之前使用更广泛的术语“Linux”,因为我使用各种发行版(Arch、Gentoo、Ubuntu)对其进行了测试,但它们都无法让各自的 dhcp 客户端与我的 Fritz Box 一起使用。我什至尝试过 FreeBSD 以排除 Linux 的问题。他们都打印了某种形式的“DHCP租约到期无法获取IP”。
重置路由器并再次获得 dhcp 租约后,我启动了 Windows,然后尝试再次启动 *nix 并遇到了同样的问题。
老实说,我不知道这可能是什么原因,因为正如我之前所说,在将我的 Windows 10 升级到最新版本之前它可以工作,而且我的 dhcp 服务器在应答 dhcp 后突然拒绝工作对我来说没有意义向 Windows 10 发出请求。
编辑:我的主板是华硕 Sabertooth Z87,配有 Intel Intel I217-V NIC。由于用户 AB 正确地怀疑问题与获取 DHCP 租用无关,而是关闭 Windows 后 I217-V NIC 的状态问题。解决方法请看这个帖子:https://unix.stackexchange.com/a/620766/442856
答案1
据华硕称,OP 的 SABERTOOTH Z87包括 Intel I217-V NIC。这让我在 ArchLinux 论坛上找到了对该问题的描述:
[已解决] 启动 Windows 后的以太网问题(Intel I217-V (e1000e))
您应该在您的系统上测试这两个注释中的方法(以及三个)这个导致第一个解决方法)更正 Linux 中的 NIC 行为:
-
我们有一个赢家!
关闭所有电源管理功能确实可以解决问题。关闭它们,像往常一样启动 linux,没有发现任何问题。然后回到 Windows,功能恢复,Linux 开启,坏了。所以我认为这些证据足以宣告这个问题已经解决(尽管牺牲了 WoL,我一点也不介意) 实际解决方案是重置 PCI 设备,因此它将回到冷启动状态,这是预期的状态通用e1000e驱动程序可能无法正确处理此特定的 NIC。
我的解决方案非常简单:在启动网络接口之前重置 PCI 设备
您可能需要根据同一注释改编(并稍微清理一下)下面的脚本,特别是如果您有多个 NIC。运行为根用户。
#!/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
我希望这能解决您的问题。然后您应该让它在每次启动时自动运行。
答案2
不同的流程 - 有一个项目使用没有init.d/networking
.
查看 sys 目录找到数据后,过程很简单。似乎很多设备都有重置选项,因此搜索了具有重置选项的设备max_link_speed
。在我的系统上,这只是有线以太网和无线。然后通过替换 info 的开头和结尾,将要重置的行写入到文件 call out2 中。
cd /sys
find . | grep max_link_speed | sed 's_./dev_echo 1> /sys/dev_g;s/max_link_speed/reset/g' > /out2
sh ./out2
但 Windows 10 也遇到了同样的问题,搞乱了dhcpd
.谢谢。由于第二行换行,因此在上面添加空行。
答案3
更简单的修复…启动 Linux 后只需运行 /etc/init.d/networkingforce-reload
这解决了我的问题。虽然每次从Windows切换到Linux时都需要运行它