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


目次

1.はじめに
2.ハマった問題点
3.パッケージのダウンロード方法(有線LANを使えない方)
4.ドライバーの構築(有線LAN使える方はここから)
5.おわりに
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.ドライバーの構築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を作成します。(参照)

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メモリのdebsrtl8814auを適当なところに配置してください。
パッケージのインストールは以下のように行います。

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

4. ドライバーの構築(有線LAN使える方はここから)

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の2.Sign the moduleで行う$(modinfo -n rtl6612au)が動作しなかったため、それに相応するものに置き換えています。

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

5. おわりに

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

6. 参考