Tumbleweed开机无法连接Wi-Fi

前天在家里的服务器上安装了Tumbleweed,重启系统发现无法连接Wi-Fi。

systemctl status network查看了信息,网络是wicked管理的,无法连接Wi-Fi的原因是说我的无线网卡(外置的)没有运行(device-not-running)。
我尝试restart了wicked,然后Wi-Fi就能正常连接。但每次重启系统仍然会这样。

于是我写了一个service,每次在系统重启,wicked服务启动之后,重启一下wicked。

虽然这样可以连接Wi-Fi了,但是比较好奇为什么第一次wicked会说我的网卡没有运行呢?

YaST里面的“网络设置”功能模块里可以改为使用NetworkManager来管理网络。

多半是服务启动的时候环境没准备好,可以尝试调一下启动位置什么的

之前使用Leap15,没有遇到过这种问题。。

编辑 /etc/sysconfig/network/config,把 WICKED_DEBUG= 这个选项设为 all。然后下次重启后在 systemd journal 里看看 wicked 的日志

日志有点多。。我贴到gist了。

@john 我看到第一遍没起来的了。

Aug 24 22:17:03 home-server wicked[1359]: wlp0s29f7u1     device-not-running

说设备未运行。

你能看下你的 systemctl list-units -t service --all 的结果吗?我看看你的 service 跟我的有什么不一样。怀疑是:

  1. 出现了 racing problem,有的需要 network.service 的服务在它之前跑起来了,把它顶死了。
  2. 驱动问题,特殊网卡,驱动没在 initrd 里,启动时候网卡还没驱动就直接用它连接了。

这是输出的信息。
应该不是驱动的问题,用的是免驱的网卡,没有安装额外的驱动。

这个是重启wicked的服务。

你有我没有的服务:

chronyd
chrony-wait
minecraft

我觉得问题应该不大。你应该不会在 minecraft.service 丢掉 After=network-online.target。

那可能是 wickedd 和 wpa_supplicant 的老问题。你的 Wi-Fi 设置是在 YaST 里设置的不是在 wpa_supplicant.conf 里手动设置的吧?wickedd 通过 DBus 与 wpa_supplicant 通信,告诉它怎么连接,连接什么。但是有一个问题是所有的 wicked 相关服务都在 network.target 之前启动,而 wpa_supplicant.service 是在 network.target 之后启动。有可能 DBus 连接 wpa_supplicant 的时候它还没有启动。

我把我的 WiFi 也用 wickedd 设置一下试试看能不能重现你的问题。

我遇到你的情况了,一模一样。

问题出现在这里:

8月 25 12:26:21 linux-fpbk systemd[1]: Started wicked AutoIPv4 supplicant service.
8月 25 12:26:21 linux-fpbk systemd[1]: Started wicked DHCPv6 supplicant service.
8月 25 12:26:21 linux-fpbk systemd[1]: Started wicked DHCPv4 supplicant service.
8月 25 12:26:21 linux-fpbk systemd[1]: Starting wicked network management service daemon…
8月 25 12:26:21 linux-fpbk systemd[1]: Started wicked network management service daemon.
8月 25 12:26:21 linux-fpbk systemd[1]: Starting wicked network nanny service…
8月 25 12:26:21 linux-fpbk systemd[1]: Started wicked network nanny service.
8月 25 12:26:21 linux-fpbk systemd[1]: Starting wicked managed network interfaces…
8月 25 12:26:21 linux-fpbk kernel: No iBFT detected.
8月 25 12:26:21 linux-fpbk dbus-daemon[1050]: [system] Activating via systemd: service name=‘fi.epitest.hostap.WPASupplicant’ unit=‘wpa_supplicant.service’ requested by ':>
8月 25 12:26:21 linux-fpbk systemd[1]: Started Modem Manager.
8月 25 12:26:24 linux-fpbk ModemManager[1048]: Couldn’t check support for device ‘/sys/devices/pci0000:00/0000:00:14.0/usb1/1-9’: not supported by any plugin
8月 25 12:26:24 linux-fpbk ModemManager[1048]: Couldn’t check support for device ‘/sys/devices/pci0000:00/0000:00:1c.7/0000:03:00.0’: not supported by any plugin
8月 25 12:26:46 linux-fpbk dbus-daemon[1050]: [system] Failed to activate service ‘fi.epitest.hostap.WPASupplicant’: timed out (service_start_timeout=25000ms)
8月 25 12:26:46 linux-fpbk wickedd[1194]: ni_wpa_interface_bind(wlp0s20f0u9): Operation not permitted
8月 25 12:26:46 linux-fpbk wickedd[1194]: wpa_supplicant doesn’t know interface wlp0s20f0u9
8月 25 12:26:46 linux-fpbk wickedd-nanny[1198]: device wlp0s20f0u9: call to org.opensuse.Network.Wireless.changeDevice() failed: General failure
8月 25 12:26:46 linux-fpbk wickedd-nanny[1198]: wlp0s20f0u9: failed to bring up device, still continuing

8月 25 12:26:46 linux-fpbk kernel: Generic Realtek PHY r8169-300:00: attached PHY driver [Generic Realtek PHY] (mii_bus:phy_addr=r8169-300:00, irq=IGNORE)
8月 25 12:26:46 linux-fpbk kernel: r8169 0000:03:00.0 enp3s0: Link is Down
8月 25 12:26:51 linux-fpbk wicked[1199]: lo up
8月 25 12:26:51 linux-fpbk wicked[1199]: enp3s0 setup-in-progress
8月 25 12:26:51 linux-fpbk wicked[1199]: wlp0s20f0u9 device-not-running
8月 25 12:26:51 linux-fpbk systemd[1]: Started wicked managed network interfaces.
8月 25 12:26:51 linux-fpbk systemd[1]: Reached target Network.
8月 25 12:26:51 linux-fpbk systemd[1]: Starting WPA Supplicant daemon…

重启 network.service 后就是成功的,因为这时候 wpa_supplicant 已经是启动的了:

8月 25 12:57:27 linux-fpbk systemd[1]: Stopping wicked managed network interfaces…
8月 25 12:57:27 linux-fpbk kernel: ieee80211 phy0: rt2x00lib_request_firmware: Info - Loading firmware file ‘rt2870.bin’
8月 25 12:57:27 linux-fpbk kernel: ieee80211 phy0: rt2x00lib_request_firmware: Info - Firmware detected - version: 0.36
8月 25 12:57:27 linux-fpbk kernel: NET: Registered protocol family 17
8月 25 12:57:27 linux-fpbk wickedd[1173]: unable to translate eap protocol PWD
8月 25 12:57:28 linux-fpbk wicked[2248]: enp3s0 device-ready
8月 25 12:57:28 linux-fpbk wicked[2248]: wlp0s20f0u9 device-ready
8月 25 12:57:28 linux-fpbk systemd[1]: wicked.service: Succeeded.
8月 25 12:57:28 linux-fpbk systemd[1]: Stopped wicked managed network interfaces.
8月 25 12:57:28 linux-fpbk systemd[1]: Starting wicked managed network interfaces…
8月 25 12:57:28 linux-fpbk kernel: Generic Realtek PHY r8169-300:00: attached PHY driver [Generic Realtek PHY] (mii_bus:phy_addr=r8169-300:00, irq=IGNORE)
8月 25 12:57:28 linux-fpbk kernel: r8169 0000:03:00.0 enp3s0: Link is Down
8月 25 12:57:29 linux-fpbk kernel: wlp0s20f0u9: authenticate with 28:6c:07:c5:b6:f8
8月 25 12:57:29 linux-fpbk kernel: wlp0s20f0u9: send auth to 28:6c:07:c5:b6:f8 (try 1/3)
8月 25 12:57:29 linux-fpbk kernel: wlp0s20f0u9: authenticated
8月 25 12:57:29 linux-fpbk kernel: wlp0s20f0u9: associate with 28:6c:07:c5:b6:f8 (try 1/3)
8月 25 12:57:29 linux-fpbk kernel: wlp0s20f0u9: RX AssocResp from 28:6c:07:c5:b6:f8 (capab=0xc11 status=0 aid=3)
8月 25 12:57:29 linux-fpbk kernel: wlp0s20f0u9: associated
8月 25 12:57:29 linux-fpbk wickedd-dhcp4[1027]: wlp0s20f0u9: Request to acquire DHCPv4 lease with UUID d114625d-ecfd-0200-9504-00000a000000
8月 25 12:57:34 linux-fpbk wickedd-dhcp4[1027]: wlp0s20f0u9: Committed DHCPv4 lease with address 192.168.31.150 (lease time 43200 sec, renew in 21600 sec, rebind in 37800 >

问题出在 wicked 的这个函数:

ni_wpa_interface_bind(ni_wpa_client_t *wpa, ni_netdev_t *dev)
{
  ni_wpa_interface_t *wpa_dev = NULL;
  int rv;

  rv = ni_wpa_get_interface(wpa, dev->name, dev->link.ifindex, &wpa_dev);
  if (rv < 0) {
    if (rv != -NI_ERROR_DEVICE_NOT_KNOWN)
      goto failed;

    ni_debug_wireless("%s: interface does not exist", dev->name);
    rv = ni_wpa_add_interface(wpa, dev->name, dev->link.ifindex, &wpa_dev);
    if (rv < 0)
      goto failed;
  }

  return wpa_dev;

failed:
  ni_error("%s(%s): %s", __func__, dev->name, strerror(-rv));
  return NULL;
}

它在 ni_wpa_get_interface 这里返回了小于0的值,下一步需要知道为什么。

对,我是直接yast配置的Wi-Fi。

一个下午 debug 的结果:

先去改了 wicked,增加一些调试输出,主要是 ni_wpa_client_interface_by_index 这个函数这里我让它输出全部的 ifname 和 ifindex,然后又去学了 wicked 的 logging,配置 /etc/sysconfig/network/config 让它生效。

搞到一半,忽然感觉那个 Operation not permitted 也许就是我最后要找的 wicked 那个 bind 失败的原因。

基于这个假设,需要知道为什么 DBus 给出这个错误,于是又去学习如何调试 DBus。重编译 DBus 加上 —enable-verbose-mode,然后再去 dbus.service 里加上 Environment=DBUS_VERBOSE=1,终于得到了一点有用的东西。先是:

skipping rule because dest fi.epitest.hostap.WPASupplicant doesn’t exist 

然后是:

skipping rule because dest fi.epitest.hostap.WPASupplicant isn’t owned by receiver.
1赞

这正好是符合这个行为的

    if (rv < 0) {
	if (rv != -NI_ERROR_DEVICE_NOT_KNOWN)
		goto failed;

	ni_debug_wireless("%s: interface does not exist", dev->name);
	rv = ni_wpa_add_interface(wpa, dev->name, dev->link.ifindex, &wpa_dev);
	if (rv < 0)
		goto failed;
}

现在就是看 ni_wpa_add_interface 为什么涉及 receiver 的问题了。

https://bugzilla.opensuse.org/show_bug.cgi?id=1148444

1赞