Proxmox VE 8.3でTP-Link Archer T2U PLUS [RTL8821AU]を使う

※そもそもTP-LINK製品を買うな、という定説は省略する
ホスト機Proxmox VE 8.3なマシンで、TP-Link Archer T2U PLUS [RTL8821AU]を使ってプライマリNICとしたい（有線を引き回したくない場所に設置したいので）

# 前提

- 蟹チップ Realtek RTL8821AU こいつのドライバはUbuntuでは勝手に当たらない
- rtl8812auドライバ https://github.com/aircrack-ng/rtl8812au.git を当てる方法が出てくるが(実際ドライバ側も88xxauを名乗っていてrtl8821auでも動く製品もあるらしい?)うまく動かない（ssid scanができない）
  - 厄介なのは、scanプロセスを殺さないとデバイスがbusy状態になって何もできなくなる。`ps aux`あたりで探して`killall`すると良い

# 必要なパッケージのインストール

```
# apt install build-essential dkms git iw wpasupplicant
```

今回接続するためのCLIインタフェースは`iw`を使うが、たとえばNetworkManager (`nmcli`)を入れてしまうと、proxmox veで使っている`systemd-networkd`と競合し、管理画面につながらなくなる(ip unreachableになる)ので注意

# morrownr/8821au-20210708 ドライバを使う

```
# git clone https://github.com/morrownr/8821au-20210708.git
# cd 8821au-20210708

# sh ./install-driver.sh
: ---------------------------
: install-driver.sh v20240314
: x86_64 (kernel architecture)
: x86_64 (architecture to send to gcc)
: 6/6 (in-use/total processing units)
: 65765324 (total system memory)
: 6.8.12-4-pve (kernel version)
: gcc (version of gcc used to compile the kernel)
: gcc (Debian 12.2.0-14) 12.2.0
: dkms-3.0.10
: SecureBoot disabled
: ---------------------------

Checking for previously installed drivers...
Finished checking for and removing previously installed drivers.
: ---------------------------

Starting installation.
Installing 8821au.conf to /etc/modprobe.d
The dkms installation routines are in use.
Copying source files to /usr/src/rtl8821au-5.12.5.2
Creating symlink /var/lib/dkms/rtl8821au/5.12.5.2/source -> /usr/src/rtl8821au-5.12.5.2
The driver was added to dkms successfully.
: ---------------------------

Sign command: /lib/modules/6.8.12-4-pve/build/scripts/sign-file
Signing key: /var/lib/dkms/mok.key
Public certificate (MOK): /var/lib/dkms/mok.pub
Certificate or key are missing, generating self signed certificate for MOK...

Building module:
Cleaning build area...
kernelver=6.8.12-4-pve ./dkms-make.sh............
Signing module /var/lib/dkms/rtl8821au/5.12.5.2/build/8821au.ko
Cleaning build area...
Compile time: 116.47 seconds
The driver was built by dkms successfully.
: ---------------------------

8821au.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/6.8.12-4-pve/updates/dkms/
depmod...
The driver was installed by dkms successfully.
: ---------------------------

Info: Update this driver with the following commands as needed:

# git pull
# sudo sh install-driver.sh

Note: Updates to this driver SHOULD be performed before distro
      upgrades such as Ubuntu 23.10 to 24.04.
Note: Updates to this driver SHOULD be performed before major
      upgrades such as kernel 6.5 to 6.6.
Note: Updates can be performed as often as you like. It is
      recommended to update at least every 3 months.
Note: Work on this driver, like the Linux kernel, is continuous.

Enjoy!

Unable to run $ rfkill unblock wlan
Do you want to edit the driver options file now? (recommended) [Y/n] y
Do you want to apply the new options by rebooting now? (recommended) [Y/n] n
```

うまくいけば問題なく終わる、最後のドライバオプション編集とかは見る必要ないかも。
推奨は再起動することのようだが、しなくても別に動く

# 確認

dkmsで確認すればドライバがインストール済みであるかわかる。

```
# dkms status
8812au/5.6.4.2_35491.20191025: added
rtl8821au/5.12.5.2, 6.8.12-4-pve, x86_64: installed
```

もし8812auを試していて不安なら `$ modprobe -r 88XXau`しておいても良いかも
そのあとmodprobeで8821auを念のため追加、`iw`や`ethtool`でデバイス状況を確認してみる；

```
# modprobe 8821au

# iw dev
phy#0
        Interface wlx984827e06e24
                ifindex 11
                wdev 0x1
                addr 98:48:27:e0:6e:24
                type managed
                txpower -100.00 dBm

# ethtool -i wlx984827e06e24 
driver: rtl8821au
version: v5.12.5.2-0-g70054197b.20210708
firmware-version: 0.0
expansion-rom-version: 
bus-info: 3-2.4:1.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no
```

# ssid scan

※インタフェース名は`wlx984827e06e24`となっているが、ここは環境によって違うので注意
インタフェースをupさせて、scanしてみる（`$ ip a`してDOWNと書いてあったらupさせる必要がある）

```
# ip link set wlx984827e06e24 up
# iw dev wlx984827e06e24 scan
...数秒後ずらずらと出てくる...
```

なんか色々出てきたら成功。失敗してる場合、何も応答しない状態が続く。その場合はドライバが間違ってるのでやり直し。DOWNうんたらと出ていたら、set upせよ

実際のSSID scanはこのようなコマンドが便利
```
# iw dev wlx984827e06e24 scan | grep SSID
        SSID: aterm-xxxxx-g_EXT
        SSID: IO-Guest-xxxxx-2G
        SSID: aterm-xxxxx-g
        SSID: DXXXXXXXXXXX-2G
        SSID: AXXXXXXXXXXX-2G
        SSID: xxxxx
                 * SSID List
        SSID: xxxxx
                 * SSID List
...
```

# 接続

`wpasupplicant`で接続をしてみる。まずはSSID接続するための認証情報configを`wpa_passphrase`を使って作る；

```
# wpa_passphrase "Unko" "dechatta" > /etc/wpa_supplicant/unko.conf

# cat /etc/wpa_supplicant/unko.conf 
network={
        ssid="Unko"
        #psk="dechatta"
        psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
```

そのconfigをもとに、`wpa_supplicant`で接続させる。`-B`はバックエンド稼働、`-i`でインタフェース名を指定、`-c`でconfig pathを与えて問題なければ成功と帰ってくる

```
# wpa_supplicant -B -i wlx984827e06e24 -c /etc/wpa_supplicant/unko.conf 
Successfully initialized wpa_supplicant

# ip a
～略～
11: wlx984827e06e24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 98:48:27:e0:6e:24 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::9a48:27ff:fee0:6e24/64 scope link 
       valid_lft forever preferred_lft forever
```

このようにまだIPは貰えていない。dhcpが動いてる一般的環境であるなら、取りに行くようにする；

```
# dhclient wlx984827e06e24
# ip a
～略～
11: wlx984827e06e24: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 98:48:27:e0:6e:24 brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.112/24 brd 192.168.100.255 scope global dynamic wlx984827e06e24
       valid_lft 14397sec preferred_lft 14397sec
    inet6 fe80::9a48:27ff:fee0:6e24/64 scope link 
       valid_lft forever preferred_lft forever
```

問題なくIPがきて外部と疎通できれば成功。


# 接続先の固定化

作ったwpa_supplicant configで稼働するようなserviceを作って登録すればよい
vmbr0のデバイス指定先を変えるなり、vmbr1とか作って切り替えるなりすればよい