# 排查systemd-networkd配置问题

## 小结

树莓派连接公司wifi的问题困扰了我很久，最初是时好时不好，后来就是根本连接不上。配置完全相同情况下(百分百肯定账号及配置正确)，在ThinkPad笔记本上工作正常，但是树莓派会奇怪地连接并不存在的 `bssid=00:00:00:00:00:00` 无线AP：

```bash
Nov 05 16:18:51 pi-worker2 wpa_supplicant[1932]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:27 pi-worker2 wpa_supplicant[1849]: wlan0: Trying to associate with SSID 'SSID-OFFICE'
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="SSID-OFFICE" auth_failures=1 duration=23 reason=CONN_FAILED
```

下面的排查过程很长，反复折腾走了很多弯路，但是实际上解决方法很简单：

* 由于5G频段是一个受控频率，需要根据不同国家进行调整country code，否则无法连接。在 `wpa_supplicant.conf` 中需要明确指定 `country=CN` 参数(其他国家代码，如US可能也行)
* ubuntu server使用netplan配置网络目前没有提供`country`参数，所以可以通过 `iw reg set CN` 命令动态设置。
* 要持久化上述country配置，修改 `/etc/default/crda` 配置，将默认的

```
REGDOMAIN=
```

修改成

```
REGDOMAIN=CN
```

然后重启就可以看到5GHz的WiFi正常工作了。

`以下是我一周多折腾的笔记，仅供参考`

## 问题

我在使用Ubuntu for Raspberry Pi 2020.4.1时候，采用服务器版本，所以默认的网络配置是采用netplan。netplan可以使用NetworkManager作为后端，也可以使用systemd-networkd作为后端。为了减少服务组件，我采用 netplan 调用默认的 systemd-networkd 来配置无线网络。

我有2个树莓派，安装操作系统一致，并且采用了相同的 netplan 配置，即在 `/etc/netplan` 目录下创建2个配置文件：

* `01-netcfg.yaml`

```
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      optional: true
      dhcp4: no
      dhcp6: no
      addresses: [192.168.6.15/24, ]
      gateway4: 192.168.6.9
      nameservers:
        addresses: [192.168.6.1,192.168.6.2 ]
```

* `02-wifi.yaml`

```
network:
  version: 2
  renderer: networkd
  wifis:
    wlan0:
      optional: true
      dhcp4: yes
      dhcp6: no
      macaddress: xx:xx:xx:xx:xx:xx
      access-points:
        "SSID-HOME":
          password: "home-passwd"
        "SSID-OFFICE":
          auth:
            key-management: eap
            identity: "office-id"
            password: "office-passwd"
```

执行配置生效:

```
netplan apply
```

没有报错，但是非常奇怪，重启系统之后，只有有线网络IP配置正确，无线网络始终没有激活。

```
# ifconfig wlan0
wlan0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether xx:xx:xx:xx:xx:xx  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

# ip addr
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
```

* 检查 `systemd-networkd` 服务状态::

```
# systemctl status systemd-networkd
● systemd-networkd.service - Network Service
     Loaded: loaded (/lib/systemd/system/systemd-networkd.service; enabled; vendor preset: enabled)
     Active: active (running) since Tue 2020-11-03 21:47:04 CST; 11h ago
TriggeredBy: ● systemd-networkd.socket
       Docs: man:systemd-networkd.service(8)
   Main PID: 1600 (systemd-network)
     Status: "Processing requests..."
      Tasks: 1 (limit: 9257)
     CGroup: /system.slice/systemd-networkd.service
             └─1600 /lib/systemd/systemd-networkd

Nov 03 21:47:04 pi-worker1 systemd[1]: Starting Network Service...
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: Enumeration completed
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: Link DOWN
Nov 03 21:47:04 pi-worker1 systemd[1]: Started Network Service.
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: Link UP
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: IPv6 successfully enabled
Nov 03 21:47:05 pi-worker1 systemd-networkd[1600]: eth0: IPv6 successfully enabled
Nov 03 21:47:05 pi-worker1 systemd-networkd[1600]: eth0: Link UP
Nov 03 21:47:10 pi-worker1 systemd-networkd[1600]: eth0: Gained carrier
Nov 03 21:47:11 pi-worker1 systemd-networkd[1600]: eth0: Gained IPv6LL
```

这里可以看到 eth0 `Gained carrier` 但是 waln0 没有链接成功。

* 检查 `networkctl list` 输出如下::

```
IDX LINK  TYPE     OPERATIONAL SETUP      
  1 lo    loopback carrier     unmanaged  
  2 eth0  ether    routable    configured 
  3 wlan0 wlan     no-carrier  configuring
```

* 检查 `networkctl status -a` 输出如下::

```
● 1: lo                                                         
             Link File: /usr/lib/systemd/network/99-default.link
          Network File: n/a                                     
                  Type: loopback                                
                 State: carrier (unmanaged)        
                   MTU: 65536                                   
  Queue Length (Tx/Rx): 1/1                                     
               Address: 127.0.0.1                               
                        ::1                                     

● 2: eth0                                                                     
             Link File: /usr/lib/systemd/network/99-default.link              
          Network File: /run/systemd/network/10-netplan-eth0.network          
                  Type: ether                                                 
                 State: routable (configured)       
                  Path: platform-fd580000.ethernet                            
                Driver: bcmgenet                                              
            HW Address: dc:a6:32:c5:48:9c (Raspberry Pi Trading Ltd)          
                   MTU: 1500 (min: 68, max: 1500)                             
  Queue Length (Tx/Rx): 5/5                                                   
      Auto negotiation: yes                                                   
                 Speed: 1Gbps                                                 
                Duplex: full                                                  
                  Port: mii                                                   
               Address: 192.168.6.15                                          
                        fe80::dea6:32ff:fec5:489c                             
               Gateway: 192.168.6.9 (Wistron Infocomm (Zhongshan) Corporation)
                   DNS: 30.11.17.1                                            
                        30.17.16.1                                            
                        30.17.16.2                                            

Nov 03 21:47:05 pi-worker1 systemd-networkd[1600]: eth0: IPv6 successfully enabled
Nov 03 21:47:05 pi-worker1 systemd-networkd[1600]: eth0: Link UP
Nov 03 21:47:10 pi-worker1 systemd-networkd[1600]: eth0: Gained carrier
Nov 03 21:47:11 pi-worker1 systemd-networkd[1600]: eth0: Gained IPv6LL

● 3: wlan0                                                                        
             Link File: /run/systemd/network/10-netplan-wlan0.link                
          Network File: /run/systemd/network/10-netplan-wlan0.network             
                  Type: wlan                                                      
                 State: no-carrier (configuring)               
                  Path: platform-fe300000.mmcnr                                   
                Driver: brcmfmac                                                  
            HW Address: xx:xx:xx:xx:xx:xx (LG Electronics (Mobile Communications))
  HW Permanent Address: dc:a6:32:c5:48:9d (Raspberry Pi Trading Ltd)              
                   MTU: 1500 (min: 68, max: 1500)                                 
  Queue Length (Tx/Rx): 1/1                                                       

Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: Link DOWN
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: Link UP
Nov 03 21:47:04 pi-worker1 systemd-networkd[1600]: wlan0: IPv6 successfully enabled
```

可以看到 `wlan0` 接口状态不正确： `State: no-carrier (configuring)`

为何这个无线网卡始终处于配置状态呢？

## debug

要排查 systemd-networkd 问题，可以开启日志debug模式，添加一个 `/etc/systemd/system/systemd-networkd.service.d/override.conf` 内容如下::

```
[Service]
Environment=SYSTEMD_LOG_LEVEL=debug
```

然后执行journalctl 的 `-u` 参数指定服务单元，并加上 `-f` 进行tail::

```
journalctl -u systemd-networkd.service -f
```

然后执行一次 `netplan apply` 就可以查看日志:

```
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: Bus bus-api-network: changing state UNSET → OPENING
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: Bus bus-api-network: changing state OPENING → AUTHENTICATING
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: timestamp of '/etc/systemd/network' changed
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: timestamp of '/run/systemd/network' changed
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: No virtualization found in DMI
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: No virtualization found in CPUID
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: Virtualization XEN not found, /proc/xen does not exist
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: No virtualization found in /proc/device-tree/*
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: UML virtualization not found in /proc/cpuinfo.
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: This platform does not support /proc/sysinfo
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: Found VM virtualization none
Nov 05 11:45:08 pi-worker1 systemd-networkd[5061]: /usr/lib/systemd/network/80-container-host0.network: Conditions in the file do not match the system environment, skipping.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: New device has no master, continuing without
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Flags change: +MULTICAST +BROADCAST
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link 3 added
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: udev initialized link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Saved original MTU: 1500
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: New device has no master, continuing without
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Flags change: +UP +LOWER_UP +RUNNING +MULTICAST +BROADCAST
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Link 2 added
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: udev initialized link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Saved original MTU: 1500
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: New device has no master, continuing without
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Flags change: +LOOPBACK +UP +LOWER_UP +RUNNING
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Link 1 added
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: udev initialized link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Saved original MTU: 65536
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering foreign address: fe80::dea6:32ff:fec5:489c/64 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Gained IPv6LL
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering foreign address: ::1/128 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering foreign address: 192.168.6.15/24 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering foreign address: 127.0.0.1/8 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: ff00::/8, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: local, proto: boot, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: fe80::dea6:32ff:fec5:489c/128, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: ::1/128, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: fe80::/64, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: main, proto: kernel, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: ::1/128, src: n/a, gw: n/a, prefsrc: n/a, scope: global, table: main, proto: kernel, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: 192.168.6.255/32, src: n/a, gw: n/a, prefsrc: 192.168.6.15, scope: link, table: local, proto: kernel, type: broadcast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: 192.168.6.15/32, src: n/a, gw: n/a, prefsrc: 192.168.6.15, scope: host, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: 192.168.6.0/32, src: n/a, gw: n/a, prefsrc: 192.168.6.15, scope: link, table: local, proto: kernel, type: broadcast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: 127.255.255.255/32, src: n/a, gw: n/a, prefsrc: 127.0.0.1, scope: link, table: local, proto: kernel, type: broadcast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: 127.0.0.1/32, src: n/a, gw: n/a, prefsrc: 127.0.0.1, scope: host, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: 127.0.0.0/8, src: n/a, gw: n/a, prefsrc: 127.0.0.1, scope: host, table: local, proto: kernel, type: local
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Remembering route: dst: 127.0.0.0/32, src: n/a, gw: n/a, prefsrc: 127.0.0.1, scope: link, table: local, proto: kernel, type: broadcast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: 192.168.6.0/24, src: n/a, gw: n/a, prefsrc: 192.168.6.15, scope: link, table: main, proto: kernel, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering route: dst: n/a, src: n/a, gw: 192.168.6.9, prefsrc: n/a, scope: global, table: main, proto: static, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received rule message with invalid family 129, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: rtnl: received rule message with invalid family 128, ignoring.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Enumeration completed
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Bus bus-api-network: changing state AUTHENTICATING → HELLO
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=method_call sender=n/a destination=org.freedesktop.DBus path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=Hello cookie=1 reply_cookie=0 signature=n/a error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=method_call sender=n/a destination=org.freedesktop.DBus path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=RequestName cookie=2 reply_cookie=0 signature=su error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=method_call sender=n/a destination=org.freedesktop.DBus path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=AddMatch cookie=3 reply_cookie=0 signature=s error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=4 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=5 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_31 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=6 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=7 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=8 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=9 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Flags change: +UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=10 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=method_return sender=org.freedesktop.DBus destination=:1.32 path=n/a interface=n/a member=n/a cookie=1 reply_cookie=1 signature=s error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Bus bus-api-network: changing state HELLO → RUNNING
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=signal sender=org.freedesktop.DBus.Local destination=n/a path=/org/freedesktop/DBus/Local interface=org.freedesktop.DBus.Local member=Connected cookie=4294967295 reply_cookie=0 signature=n/a error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=signal sender=org.freedesktop.DBus destination=:1.32 path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=NameAcquired cookie=2 reply_cookie=0 signature=s error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=signal sender=org.freedesktop.DBus destination=:1.32 path=/org/freedesktop/DBus interface=org.freedesktop.DBus member=NameAcquired cookie=3 reply_cookie=0 signature=s error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=method_return sender=org.freedesktop.DBus destination=:1.32 path=n/a interface=n/a member=n/a cookie=4 reply_cookie=2 signature=u error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Successfully acquired requested service name.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Got message type=method_return sender=org.freedesktop.DBus destination=:1.32 path=n/a interface=n/a member=n/a cookie=5 reply_cookie=3 signature=n/a error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Match type='signal',sender='org.freedesktop.login1',path='/org/freedesktop/login1',interface='org.freedesktop.login1.Manager',member='PrepareForSleep' successfully installed.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Flags change: -UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=11 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link DOWN
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link state is up-to-date
Nov 05 11:45:09 pi-worker1 systemd[1]: Started Network Service.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: found matching network '/run/systemd/network/10-netplan-wlan0.network'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/wlan0/disable_ipv6' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: IPv6 successfully enabled
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/wlan0/proxy_ndp' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/wlan0/use_tempaddr' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/wlan0/accept_ra' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Setting address genmode for link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Link state is up-to-date
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: found matching network '/run/systemd/network/10-netplan-eth0.network'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/eth0/disable_ipv6' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: IPv6 successfully enabled
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/eth0/proxy_ndp' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/eth0/use_tempaddr' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Setting '/proc/sys/net/ipv6/conf/eth0/accept_ra' to '0'
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: LLDP: Started LLDP client
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Started LLDP.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Setting address genmode for link
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: Link state is up-to-date
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: lo: State changed: pending -> unmanaged
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_31 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=12 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Setting address genmode done.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: State changed: pending -> configuring
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=13 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Bringing link up
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Flags change: +UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_33 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=14 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Link UP
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: LLDP: Started LLDP client
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: wlan0: Started LLDP.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Setting address genmode done.
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Discovering IPv6 routers
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: NDISC: Started IPv6 Router Solicitation client
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: State changed: pending -> configuring
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=15 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Setting addresses
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Remembering updated address: 192.168.6.15/24 (valid forever)
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Addresses set
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Configuring route: dst: n/a, src: n/a, gw: 192.168.6.9, prefsrc: n/a, scope: global, table: main, proto: static, type: unicast
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Setting routes
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: Routes set
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: eth0: State changed: configuring -> configured
Nov 05 11:45:09 pi-worker1 systemd-networkd[5061]: Sent message type=signal sender=n/a destination=n/a path=/org/freedesktop/network1/link/_32 interface=org.freedesktop.DBus.Properties member=PropertiesChanged cookie=16 reply_cookie=0 signature=sa{sv}as error-name=n/a error-message=n/a
Nov 05 11:45:10 pi-worker1 systemd-networkd[5061]: NDISC: Sent Router Solicitation, next solicitation in 4s
Nov 05 11:45:14 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:14 pi-worker1 systemd-networkd[5061]: rtnl: received non-static neighbor, ignoring.
Nov 05 11:45:14 pi-worker1 systemd-networkd[5061]: NDISC: Sent Router Solicitation, next solicitation in 8s
Nov 05 11:45:21 pi-worker1 systemd-networkd[5061]: NDISC: No RA received before link confirmation timeout
Nov 05 11:45:21 pi-worker1 systemd-networkd[5061]: NDISC: Invoking callback for 'timeout' event.
Nov 05 11:45:23 pi-worker1 systemd-networkd[5061]: NDISC: Sent Router Solicitation, next solicitation in 17s
Nov 05 11:45:40 pi-worker1 systemd-networkd[5061]: NDISC: Sent Router Solicitation, next solicitation in 34s
```

上述日志中有

```
Nov 05 11:45:21 pi-worker1 systemd-networkd[5061]: NDISC: No RA received before link confirmation timeout
Nov 05 11:45:21 pi-worker1 systemd-networkd[5061]: NDISC: Invoking callback for 'timeout' event.
```

[eth network stuck at routable (configuring)#8686](https://github.com/systemd/systemd/issues/8686) 提到了通过禁止DHCPv6但是设置 `IPv6AcceptRA=true` 来解决这个报错。看起来在办公网络DHCP并没有提供RA，参考 [Networkd DHCPv6 client do not start if no RA #13770](https://github.com/systemd/systemd/issues/13770)

参考 [netplan reference](https://netplan.io/reference/)提到 `accept-ra (bool)` 意思是接受路由器公告(Accept Router Advertisement)是内核配置IPv6。当激活是接受路由器公告，禁用是就不响应路由器公告。

不过，我加了这个配置无效

```
accept-ra: yes
```

我发现系统日志中有

```
[Thu Nov  5 11:45:10 2020] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[Thu Nov  5 14:55:12 2020] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
[Thu Nov  5 15:30:03 2020] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled
```

我使用 `iwconfig` 检查可以看到

```
wlan0     IEEE 802.11  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=31 dBm   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on
```

不过，使用iwlist尝试扫描:

```
iwlist wlan0 scan
```

提示错误

```
wlan0     Interface doesn't support scanning : Device or resource busy
```

这是什么原因，我对比了另一个正常的树莓派，执行上述 `iwlist wlan0 scan` 是完全正常的，可以输出所有扫描到的SSID。我使用了 `rfkill list` 检查，可以看到这个无线网卡并没有被软件或硬件关闭

```
0: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no
```

经过尝试，原来是wlan0没有UP导致上述 iwlist scan失败，即使看上去 ifconfig wlan0 显示UP，也可能没有UP起来。所以重新激活一次wlan0

```
ifconfig wlan0 down
ifconfig wlan0 up
```

然后就可以执行 `iwlist wlan0 scan` 命令了。

我后来发现，还是要检查网络连接认证，通过命令

```
systemctl status netplan-wpa-wlan0.service
```

检查发现是认证错误

```
● netplan-wpa-wlan0.service - WPA supplicant for netplan wlan0
     Loaded: loaded (/run/systemd/system/netplan-wpa-wlan0.service; enabled-runtime; vendor preset: enabled)
     Active: active (running) since Thu 2020-11-05 16:17:34 CST; 2min 7s ago
   Main PID: 1932 (wpa_supplicant)
      Tasks: 1 (limit: 9257)
     CGroup: /system.slice/netplan-wpa-wlan0.service
             └─1932 /sbin/wpa_supplicant -c /run/netplan/wpa-wlan0.conf -iwlan0

Nov 05 16:18:51 pi-worker2 wpa_supplicant[1932]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:27 pi-worker2 wpa_supplicant[1849]: wlan0: Trying to associate with SSID 'SSID-OFFICE'
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
Nov 05 16:10:30 pi-worker2 wpa_supplicant[1849]: wlan0: CTRL-EVENT-SSID-TEMP-DISABLED id=0 ssid="SSID-OFFICE" auth_failures=1 duration=23 reason=CONN_FAILED
```

搜索关键字 `wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16` 可以看到

我发现有实际上办公室有多个Access Point使用了相同的SSID，根据 [How can I connect to a specific BSSID?](https://askubuntu.com/questions/833905/how-can-i-connect-to-a-specific-bssid) 是可以指定AP的MAC地址的，也就是设置bssid参数，则在 02-wifi.yaml 添加

```
network:
  version: 2
  renderer: networkd
  wifis:
    wlan0:
      optional: true
      dhcp4: yes
      dhcp6: no
      macaddress: xx:xx:xx:xx:xx:xx
      access-points:
        "SSID-HOME":
          password: "home-passwd"
        "SSID-OFFICE":
          bssid: "xx:xx:xx:xx:xx:xx"
          auth:
            key-management: eap
            identity: "office-id"
            password: "office-passwd"
```

这样生成的wpa配置文件中有了BSSID参数。

> 注意，只有树莓派3B+和4B才支持 5GHz WiFi，所以，如果你使用的是早期产品，例如树莓派Zero W，就无法连接5GHz无线路由器。

[wpa\_supplicant: Failed to initiate AP scan](https://forums.gentoo.org/viewtopic-t-993126-start-0.html) 提供了一个非常好的debug方式：

```
wpa_supplicant -B -c /etc/wpa_supplicant/wpa_supplicant.conf -D nl80211 -dd -f /var/log/wpa.log -i wlo1 -t
```

这种方式可以留下详细的debug日志。

## 直接使用wpa\_supplicant

我准备直接使用wpa\_supplicant来连接，所以使用 netplan 生成的配置 `/run/netplan/wpa-wlan0.conf`

```
ctrl_interface=/run/wpa_supplicant

network={
  ssid="SSID-OFFICE"
  key_mgmt=WPA-EAP
  eap=PEAP
  identity="office-id"
  password="office-passwd"
  phase1="peaplabel=0"
  phase2="auth=MSCHAPV2"
}
network={
  ssid="SSID-HOME"
  key_mgmt=WPA-PSK
  psk="home-passwd"
}
```

我尝试采用 [wpa\_supplicant not connecting](https://forums.gentoo.org/viewtopic-t-997890-start-0.html) 的建议方法

```
wpa_supplicant -D wext -c /run/netplan/wpa-wlan0.conf -i wlan0
```

输出显示

```
Successfully initialized wpa_supplicant
ioctl[SIOCSIWENCODEEXT]: Invalid argument
ioctl[SIOCSIWENCODEEXT]: Invalid argument
wlan0: Trying to associate with YY:YY:YY:YY:YY:YY (SSID='SSID-OFFICE' freq=5220 MHz)
Failed to add supported operating classes IE
wlan0: Authentication with YY:YY:YY:YY:YY:YY timed out.
wlan0: CTRL-EVENT-DISCONNECTED bssid=YY:YY:YY:YY:YY:YY reason=3 locally_generated=1
ioctl[SIOCSIWSCAN]: Resource temporarily unavailable
wlan0: CTRL-EVENT-SCAN-FAILED ret=-1 retry=1
wlan0: Trying to associate with XX:XX:XX:XX:XX:XX (SSID='SSID-OFFICE' freq=5320 MHz)
Failed to add supported operating classes IE
wlan0: Authentication with XX:XX:XX:XX:XX:XX timed out.
wlan0: CTRL-EVENT-DISCONNECTED bssid=XX:XX:XX:XX:XX:XX reason=3 locally_generated=1
ioctl[SIOCSIWSCAN]: Resource temporarily unavailable
wlan0: CTRL-EVENT-SCAN-FAILED ret=-1 retry=1
ioctl[SIOCSIWSCAN]: Resource temporarily unavailable
wlan0: CTRL-EVENT-SCAN-FAILED ret=-1 retry=1
```

可以看到实际上wpa\_supplicant尝试连接到 `SSID-OFFICE` ，并且会尝试不同的BSSID（也就是无线路由器的不同mac地址）

等等，为何会有 ioctl 参数错误？

```
ioctl[SIOCSIWENCODEEXT]: Invalid argument
```

[Raspberry Pi Wireless Network Setup](http://www.bciuca.com/2014/06/14/raspberrypi-wifi/)提到上述报错是正常的。不过，我参考 [\[SOLVED\] wpa\_supplicant ioctl\[SIOCSIWENCODEEXT\]](https://bbs.archlinux.org/viewtopic.php?id=244485)，看起来是 `-D` 参数导致的，如果使用 `-D nl80211` 就不再报 `ioctl[SIOCSIWENCODEEXT]: Invalid argument` 错误

```
wpa_supplicant -D nl80211 -c /run/netplan/wpa-wlan0.conf -i wlan0
```

> 后来我查了arch linux资料，原来wpa\_supplicant有两种驱动，默认是使用 `nl80211` ，只有这个驱动无法支持的硬件才需要使用已经停止开发的 `wext` 驱动。所以，如果强制指定 `-D wext` 就是会有上述报错，可以忽略。

提示信息

```
Successfully initialized wpa_supplicant
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
```

比较奇怪，我连接的bssid怎么都是 `00:00:00:00:00:00` ，但是我按下`ctrl-c`时候输出信息

```
nl80211: deinit ifname=p2p-dev-wlan0 disabled_11b_rates=0
p2p-dev-wlan0: CTRL-EVENT-TERMINATING 
wlan0: CTRL-EVENT-DISCONNECTED bssid=80:a2:35:45:83:28 reason=3 locally_generated=1
nl80211: deinit ifname=wlan0 disabled_11b_rates=0
wlan0: CTRL-EVENT-TERMINATING
```

### 改为纯手工设置 wpa\_supplicant

* 移除 `/etc/netplan/02-wifi.yaml` ，然后执行一次 `netplan apply` 可以看到现在 `ifconfig` 已经不再包含无线网卡 `wlan0`
* 检查rfkill是否block了无线网卡

```
rfkill list
```

显示正常

```
0: phy0: Wireless LAN
    Soft blocked: no
    Hard blocked: no
```

* 检查无线网卡 `iwconfig` 输出:

```
wlan0     IEEE 802.11  ESSID:off/any  
          Mode:Managed  Frequency:5.32 GHz  Access Point: Not-Associated   
          Retry short limit:7   RTS thr:off   Fragment thr:off
          Encryption key:off
          Power Management:on

lo        no wireless extensions.

eth0      no wireless extensions.
```

* 使用 `ifconfig` 命令启用无线网卡

```
sudo ifconfig wlan0 up
```

* 扫描周边无线网络

```
iwlist wlan0 scan | grep ESSID
```

我找到archlinux的wiki文档，指出有些硬件不支持驱动会有类似错误。例如，我前面看到

```
wlan0: Authentication with XX:XX:XX:XX:XX:XX timed out.
```

文档说明：

On some (especially old) hardware, wpa\_supplicant may fail with the following error:

```
Successfully initialized wpa_supplicant
nl80211: Driver does not support authentication/association or connect commands
wlan0: Failed to initialize driver interface
```

This indicates that the standard nl80211 driver does not support the given hardware. The deprecated wext driver might still support the device:

(判断错误）我怀疑我复制树莓派firmware文件覆盖ubuntu的firmware来支持USB移动硬盘启动破坏了firmware加载。但是我测试了从正常的树莓派主机上(没有使用USB存储)复制.dat和.elf文件到异常服务器上，重启系统无线依然无法工作。

### 脚本启动

* 配置文件 `/etc/wpa_supplicant/wpa_supplicant-office.conf`:

```bash
ctrl_interface=/var/run/wpa_supplicant
ap_scan=1
network={
  ssid="SSID-OFFICE"
  key_mgmt=WPA-EAP
  eap=PEAP
  phase1="peaplabel=0"
  phase2="auth=MSCHAPV2"
  identity="user_name"
  password="user_password"
}
```

* 执行脚本 `start_wifi`:

```bash
sudo ifconfig wlan0 down
sleep 1
sudo ifconfig wlan0 up
sudo wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-office.conf -i wlan0 &
sleep 5
sudo dhcpcd wlan0
```

在异常的树莓派主机上执行上述脚本，显示信息

```
Successfully initialized wpa_supplicant
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
wlan0: Trying to associate with SSID 'SSID-OFFICE'
wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16
wlan0: Trying to associate with SSID 'SSID-OFFICE'
```

我对比了一台正常的ThinckPad笔记本脚本执行启动脚本，显示信息则

```
Successfully initialized wpa_supplicant
wlp3s0: SME: Trying to authenticate with xx:yy:zz:aa:bb:cc (SSID='SSID-OFFICE' freq=5280 MHz)
wlp3s0: Trying to associate with xx:yy:zz:aa:bb:cc (SSID='SSID-OFFICE' freq=5280 MHz)
wlp3s0: Associated with xx:yy:zz:aa:bb:cc
wlp3s0: CTRL-EVENT-SUBNET-STATUS-UPDATE status=0
wlp3s0: CTRL-EVENT-EAP-STARTED EAP authentication started
wlp3s0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=13 -> NAK
wlp3s0: CTRL-EVENT-EAP-PROPOSED-METHOD vendor=0 method=25
wlp3s0: CTRL-EVENT-EAP-METHOD EAP vendor 0 method 25 (PEAP) selected
wlp3s0: CTRL-EVENT-EAP-PEER-CERT depth=1 subject='......' hash=......
wlp3s0: CTRL-EVENT-EAP-PEER-CERT depth=0 subject='......' hash=......
wlp3s0: CTRL-EVENT-EAP-PEER-ALT depth=0 EMAIL:XXXXX Radius
EAP-MSCHAPV2: Authentication succeeded
EAP-TLV: TLV Result - Success - EAP-TLV/Phase2 Completed
wlp3s0: CTRL-EVENT-EAP-SUCCESS EAP authentication completed successfully
wlp3s0: PMKSA-CACHE-ADDED xx:yy:zz:aa:bb:cc 0
wlp3s0: WPA: Key negotiation completed with xx:yy:zz:aa:bb:cc [PTK=CCMP GTK=CCMP]
wlp3s0: CTRL-EVENT-CONNECTED - Connection to xx:yy:zz:aa:bb:cc completed [id=0 id_str=]
```

这里我观察到出现比较奇怪的是，树莓派运行的wpa\_supplicant尝试连接到 `'SSID-OFFICE'` 现实的 bssid 是 `00:00:00:00:00:00` ，这明显不是正常的无线AP的MAC地址，正常应该连接的是 `xx:yy:zz:aa:bb:cc`

在 [RPI4 cannot connect to WIFI - status\_code=16](https://www.raspberrypi.org/forums/viewtopic.php?t=274715) 找到了相同的案例，提示信息是：

> have found the root cause -- and surprisingly it's wifi-HDMI interference of RPI4.
>
> Though I have known about this issue, I believed it's not my case, because:
>
> * I was able to connect to another wifi (mobile hotspot)
> * my resolution was only 1920x1080
>
> When I lowered screen resolution to 1600x1200, wifi started to work with both of my networks.

在 [CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status\_code=16](https://www.spinics.net/lists/hostap/msg08413.html) 提到了和我相同的困扰，也是树莓派4，重启后随机会连接不了wifi。

在 [USB3 and 2.4 GHz Wifi #1430](https://github.com/raspberrypi/firmware/issues/1430) 提到了用户发现将任何设备插入到某个USB3接口上，就会导致无线无法连接2.4GHz Wifi网络，但是5.0 GHz无线网络工作正常。

似乎这个问题和USB3的HDMI解析问题有关 ，据说这是一个已知的问题 [USB 3.0\* Radio Frequency Interference on 2.4 GHz Devices](https://www.intel.com/content/www/us/en/products/docs/io/universal-serial-bus/usb3-frequency-interference-paper.html)。

> 上述Intel手册需要仔细阅读一下，似乎USB 3.0影响无线接收器的性能(如果靠得很近的话)，我觉得这个问题确实是硬件设计问题，包括前面提到的HDMI解析度，或许就是频率影响

在这个帖子中，GithubUser5462用户说明的问题和我一样，也是在USB 3接口上连接外接移动硬盘(他使用的是My Passport WD 2TB外接HDD，而我使用的是My Passprot WD 1TB外接SSD)。另外在 [Pi4, USB3, and Wireless 2.4Ghz interference](https://www.indilib.org/forum/general/6576-pi4-usb3-and-wireless-2-4ghz-interference.html) 有所讨论。

在树莓派论坛已经讨论了这个问题 [Problems adding a USB 3.0 SSD to PI4](https://www.raspberrypi.org/forums/viewtopic.php?f=36\&t=266353\&p=1693114#p1693114)

我参考前面有人说的修改HDMI分辨率，参考 [Video options in config.txt](https://www.raspberrypi.org/documentation/configuration/config-txt/video.md) 在 `/boot/firmware/config.txt` 中添加2行：

```
hdmi_group=2
hdmi_mode=51
```

似乎有一个安全模式:

```
hdmi_safe=1
```

安全模式相当于启动时最大的HDMI兼容：

```
hdmi_force_hotplug=1
hdmi_ignore_edid=0xa5000080
config_hdmi_boost=4
hdmi_group=2
hdmi_mode=4
disable_overscan=0
overscan_left=24
overscan_right=24
overscan_top=24
overscan_bottom=24
```

但是我设置了 `hdmi_mode=51` 或者 `hdmi_safe=1` 都没有解决这个问题

### 尝试raspbian

我尝试通过TF卡启动到raspbian系统中，使用同样的启动脚本来启动，发现还是出现相同的报错信息。并且这次我是没有外接USB设备，仅仅使用TF卡。我要不要在raspbian中也使用 `hdmi_safe=1` 呢？

实际测试下来还是失败，看来这个问题和直接外接SSD存储没有关系，但是确实和树莓派系统更新有关。

### 可能找到解决方法了

我在树莓派4上通过Raspberry OS官方系统启动，只使用TF卡不使用外接SSD移动硬盘，排除了USB3.0影响因素，所以导致问题的原因应该是wpa\_supplicant配置问题。

由于我发现执行 `sudo wpa_supplicant -c /etc/wpa_supplicant/wpa_supplicant-office.conf -i wlan0` 命令提示信息显示 wpa\_suuplicant 尝试连接MAC地址 `bssid=00:00:00:00:00:00` ，这明显是错误的不存在MAC，所以我尝试在 `wpa_supplicant-office.conf` 配置中添加指定 bssid 参数，类似如下

```
...
  ssid="SSID-OFFICE"
  bssid=xx:yy:zz:aa:bb:cc
...
```

但是发现此时报错

```
Successfully initialized wpa_supplicant
wlan0: Failed to initiate sched scan
wlan0: Failed to initiate sched scan
...
```

经过多次对比参数，我发现原来不能同时指定 `ssid=` 和 `bssid=` ，同时设置上述两个参数就会导致无法发起iwlist scan。所以，把上述 `ssid="SSID-OFFICE"` 注释掉就能够正常运行。

另外，还有一个非常奇特的参数必须在`wpa_supplicant.conf`中指定，就是 `country=US` ，这个参数是表明无线使用的国家，因为每个国家的2,4GHz使用了不同的通道 [List\_of\_WLAN\_channels](https://en.wikipedia.org/wiki/List_of_WLAN_channels) (参考 [Raspbian - wpa\_supplicant.conf Country meaning](https://raspberrypi.stackexchange.com/questions/93679/raspbian-wpa-supplicant-conf-country-meaning) ) 。有可能你需要根据你的路由器来设置这个参数(或者可以在配置中指定channel?)

我测试了如果不指定这个 `country=US` ，就会导致wpa\_supplicant启动时候显示 `wlan0: Failed to initiate sched scan` ，使用了这个参数就能正常发起扫描。看起来，应该是某次升级过 wpa\_supplicant 版本导致默认的country失效了，就会去连接 `00:00:00:00:00:00` ，但是如果你强制同时指定 ssid 和 bssid ，也会导致 `wlan0: Failed to initiate sched scan` 。

> [Setup WiFi on a Pi Manually using wpa\_supplicant.conf](https://www.raspberrypi-spy.co.uk/2017/04/manually-setting-up-pi-wifi-using-wpa_supplicant-conf/) 提供了country解释：
>
> The Country Code should be set the [ISO/IEC alpha2 code](https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2#Officially_assigned_code_elements) for the country in which you are using your Pi. Common codes include :
>
> * gb (United Kingdom)
> * fr (France)
> * de (Germany)
> * us (United States)
> * se (Sweden)

经过验证，指定 `bssid=` 参数可以正常启动`wpa_supplicant`客户端，然后完成连接认证。存在的问题是，会反复出现EAP认证，显示认证成功，然后又断开重新认证成功。不过，反复多次以后，终于不再断开，也就完成认证，稳定连接，最终就能够完成无线认证并通过dhcpcd获得IP地址。

总之，最终的 `wpa_supplicant-office.conf` 如下:

```bash
ctrl_interface=/var/run/wpa_supplicant
#update_config=1
#ap_scan=1
country=US
network={
#  ssid="alibaba-inc"
  bssid=xx:yy:zz:aa:bb:cc
  key_mgmt=WPA-EAP
  eap=PEAP
  phase1="peaplabel=0"
  phase2="auth=MSCHAPV2"
  identity="user_name"
  password="user_password"
}
```

折腾了好几天，终于能够完成无线连接。

不过，我在设置netplan中没有找到设置 `country` 的参数，例如配置 `02-wifi.yaml` 配置

```yaml
network:
  version: 2
  renderer: networkd
  wifis:
    wlan0:
      optional: true
      dhcp4: yes
      dhcp6: no
      accept-ra: yes
      macaddress: 11:22:33:zz:yy:xx
      access-points:
        "SSID-HOME":
          password: "user_password"
        "":
          bssid: xx:yy:zz:aa:bb:cc
          band: 5GHz
          channel: 149
          auth:
            key-management: eap
            method: peap
            phase2-auth: MSCHAPV2
            identity: "user_name"
            password: "user_password"
```

但是 `netplan apply` 生成的配置 `/run/netplan/wpa-wlan0.conf` 内容并没有country参数

```
ctrl_interface=/run/wpa_supplicant

network={
  ssid=""
  bssid=xx:yy:zz:aa:bb:cc
  key_mgmt=WPA-EAP
  eap=PEAP
  identity="user_name"
  password="user_password"
  phase2="auth=MSCHAPV2"
}
```

`journalctl -u netplan-wpa-wlan0.service` 还是看到如下报错

```
Nov 13 15:56:48 pi-worker2 wpa_supplicant[2520]: Successfully initialized wpa_supplicant
Nov 13 15:57:05 pi-worker2 wpa_supplicant[2520]: wlan0: Failed to initiate sched scan
Nov 13 15:57:12 pi-worker2 wpa_supplicant[2520]: wlan0: Failed to initiate sched scan
...
```

不过，既然已经知道是 country 导致的问题，我进一步搜索找到了 [Help: Unable to connect to 5G Wifi on raspberry pi 4 using ubuntu server 18.04](https://askubuntu.com/questions/1214902/help-unable-to-connect-to-5g-wifi-on-raspberry-pi-4-using-ubuntu-server-18-04) ，关键点就是country code，因为5GHz是一个受控频率，需要根据不同国家进行调整country code，否则无法连接。临时的解决方法就是使用 `wireless-tools` 工具设置:

```
sudo apt update
sudo apt install network-manager wireless-tools
sudo iw reg set CN
```

然后就能够正常连接。

要持久化上述country配置，修改 `/etc/default/crda` 配置，将默认的

```
REGDOMAIN=
```

修改成

```
REGDOMAIN=CN
```

然后重启就可以看到5GHz的WiFi正常工作了。

**OMG** 这真是一个折磨人的故障问题，我估计我断断续续花了一周时间才解决这个问题。

## 参考

* [eth network stuck at routable (configuring) #8686](https://github.com/systemd/systemd/issues/8686)
* [networkctl – Query the Status of Network Links in Linux](https://www.tecmint.com/networkctl-check-linux-network-interface-status/)
* [systemd-networkd](https://wiki.archlinux.org/index.php/systemd-networkd)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://huataihuang.gitbook.io/cloud-atlas-draft/os/linux/redhat/system_administration/systemd/debug_systemd_networkd.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
