USBのWiFiアダプター（TP-Link Archer T9UH）をUbuntu 20.04で使う方法

#目次
[1.はじめに](#1-はじめに)
[2.ハマった問題点](#2-ハマった問題点)
[3.パッケージのダウンロード方法（有線LANを使えない方）](#3-パッケージのダウンロード方法有線lanを使えない方)
[4.ドライバーの構築（有線LAN使える方はここから）](#4-ドライバーの構築有線lan使える方はここから)
[5.おわりに](#5-おわりに)
[6.参考](#6-参考)

#1. はじめに
実家でPCを購入したときに、一番評判の良いWiFiアダプターを買ったところ、Windowsには簡単につなげたものの、Ubuntu20.04にはつながらず、苦労したため、環境の構築方法を共有します。
これからWiFiアダプターを購入する方は、自分の使う全てのOSに対応しているものを購入することをおすすめします。

#2. ハマった問題点
TP-LinkのArcher T9UHを購入したところ、公式のLinuxの対応がUbuntu16.04で止まっており、なおかつ無線でつなぎたいからWiFiアダプターを買っているのに、初期設定では有線LANを必要としました。 
Ubuntu20.04にT9UHを挿すと、USB機器として認識するものの（下図`lsusb`）、ドライバーがない状態でした。Ubuntu18.04でうまくいっている記事と同様の処理もしてもドライバーがうまく機能せず、WiFiマークが出ませんでした。

```
$ lsusb | grep TP-Link
Bus 001 Device 002: ID 2357:0106 TP-Link Archer T9UH v1 [Realtek RTL8814AU]
```

#3. パッケージのダウンロード方法（有線LANを使えない方）
[4.ドライバーの構築](#4-ドライバーの構築)で`sudo apt install hogehoge`をする必要があるのですが、有線LANをつなげられない状況だったので、オフラインでのパッケージの落とし方について、調べました。

## 必要なもの
- ネット環境のあるUbuntu20.04（WSLでも可）
- USBメモリー

## ネット環境のあるPCで行う作業
まずネット環境のあるUbuntu20.04（以後ネットPCと呼びます）に、パッケージの依存関係を表示する`apt-rdepends`を入れます。 

```
sudo apt install apt-rdepends
```

作業するディレクトリを作成します。

```
mkdir -p debs && cd debs
```

`apt download <package>`で一つのパッケージに対する`.deb`ファイルを取得できるのですが、これと`apt-rdepends`を絡めたシェルスクリプト`getdepends.sh`を作成します。([参照](https://superuser.com/questions/1112525/ignore-apt-get-download-errors))

```getdepends.sh
#!/bin/bash
 export MAXPARAMETERS=255

 function array_contains_find_index() {
     local n=$#
     local i=0
     local value=${!n}

     for (( i=1; i < n; i++ )) {
         if [ "${!i}" == "${value}" ]; then
             echo "REMOVING $i: ${!i} = ${value}"
             return $i
         fi
     }
     return $MAXPARAMETERS
 }

 LIST=( $( apt-rdepends $1 | grep -v "^ " ) )
 echo ${LIST[*]}
 read -n1 -r -p "... Packages that will be downloaded (Continue or CTRL+C) ..."

 RESULTS=( $( apt-get download ${LIST[*]} |& cut -d' ' -f 8 ) )
 LISTLEN=${#LIST[@]}

 while [ ${#RESULTS[@]} -gt 0 ]; do
     for (( i=0; i < $LISTLEN; i++ )); do
         array_contains_find_index ${RESULTS[@]} ${LIST[$i]}
         ret=$?

         if (( $ret != $MAXPARAMETERS )); then
             unset LIST[$i]
         fi
     done

     FULLRESULTS=$( apt-get download ${LIST[*]} 2>&1  )
     RESULTS=( $( echo $FULLRESULTS |& cut -d' ' -f 11 | sed -r "s/'(.*?):(.*$)/\1/g" ) )
 done

 apt-get download ${LIST[*]}
```

これを使って下記のパッケージを依存関係含めて、`.deb`ファイルにします。

```
sudo chmod 755 getdepends.sh  # 実行権限を付与
./getdepends.sh build-essential
./getdepends.sh make
./getdepends.sh dkms
./getdepends.sh openssl
./getdepends.sh mokutil
```

これで必要なパッケージが揃いました。ネットのないPCでは、パッケージに加え、`git clone`もできないため、ネットPCでリポジトリを入れておきます。

```
git clone https://github.com/puuuuh/rtl8814au.git
```

以上で、ネットから引っ張る必要のあるものが揃ったので、パッケージ群の`debs`ディレクトリとリポジトリの`rtl8814au`をUSBメモリに移して、ネットのないPCに移します。

## T9UHをつなぐPCで行う作業
USBメモリの`debs`と`rtl8814au`を適当なところに配置してください。 
パッケージのインストールは以下のように行います。

```
cd debs
sudo apt install -y ./*.deb
```

#4. ドライバーの構築（有線LAN使える方はここから）
[github.com/puuuuh/rtl8814au](https://github.com/puuuuh/rtl8814au)を使って、ドライバーを入れていきます。 

```
sudo apt update && sudo apt install -y build-essential make dkms openssl mokutil # 3.を行った人は必要ない
git clone https://github.com/puuuuh/rtl8814au # 3.を行った人は必要ない
cd rtl8814au
make dkms_install
openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=Descriptive name/"
sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der /lib/modules/$(uname -r)/updates/dkms/8814au.ko
sudo mokutil --import MOK.der
sudo reboot
```

以上の処理はREADME.mdに従い、行っているのですが、今回のケースでは[UEFI Secure Boot](https://github.com/puuuuh/rtl8814au#uefi-secure-boot---boot-the-kernel-with-signed)の2.Sign the moduleで行う`$(modinfo -n rtl6612au)`が動作しなかったため、それに相応するものに置き換えています。 

再起動が終わったら、WiFiマークが点いて、使えるようになっていると思います。 
もしマークが点かない場合は、何度か再起動をしてみてください。

#5. おわりに
公式の対応がないWiFiアダプターを購入するととても苦労するので、買い物はよく考えてするようにしようと思いました。

#6. 参考
- Archer T9UH AC1900 ハイパワー デュアルバンド 無線LAN子機  
  https://www.tp-link.com/jp/home-networking/adapter/archer-t9uh/
- オフライン環境のパッケージのインストール  
  https://superuser.com/questions/1112525/ignore-apt-get-download-errors
- ドライバのgithub  
  https://github.com/puuuuh/rtl8814au
- 公式のドライバ（Ubuntu16.04）  
  https://www.tp-link.com/jp/support/download/archer-t9uh/
- Ubuntu18.04でTP-LinkのArcher T9UHを使う  
  https://qiita.com/Iyugo/items/8b93277398ef9cf7e084