インストール - Wi-Fiドライバ

提供:MochiuWiki : SUSE, EC, PCB
ナビゲーションに移動 検索に移動

概要

LinuxでWi-Fiデバイスを使用する場合、専用ドライバをインストールする必要がある可能性がある。

ここでは、Wi-Fiデバイスの各チップにおいて、専用ドライバのインストール手順を記載する。


RTL8821AU

搭載しているデバイス

  • ALFA AWUS036ACS
  • Buffalo WI-U2-433DHP
  • Edimax EW-7811UTC
  • Edimax EW-7811UAC
  • Edimax EW-7811UCB
  • ELECOM WDC-433DU2H
  • GMYLE - AC450
  • Netgear A6100
  • Netis WF2180
  • Planex GW-450S
  • EDUP EP-1607


※注意1
Wi-Fiデバイスを選定するための情報を探す場合は、ここをクリックして、メインメニューの項目2を参照すること。
推奨デバイスの情報とリンクが表示される。

※注意2
上記で選定したWi-Fiデバイスを購入する場合、シングルステートかつシングルファンクションのWi-Fiデバイスを検索することを推奨する。
マルチファンクションアダプタ、無線LANおよびBluetoothは、問題がある可能性がある。

RTL8821AUチップセットはマルチファンクションであり、RTL8811AUチップセットはシングルファンクションである。
シングルステートおよびマルチステートアダプタに関する詳細は、ここをクリックして、メインメニューの項目1を参照すること。

ビルドに必要なライブラリのインストール

システムパッケージの更新とビルドに必要なライブラリのインストールする。

sudo zypper update
sudo zypper install -t pattern devel_kernel dkms


Wi-Fiデバイスの確認

Wi-FiデバイスをPCに接続して、デバイスが認識されているかどうかを確認する。

sudo hwinfo --network


ソースコードのダウンロード

RTL8821AUドライバのソースコードをダウンロードする。

git clone https://github.com/morrownr/8821au-20210708 RTL8821AU


RTL8821AUドライバのインストール (セキュアブートが無効の場合)

ダウンロードしたソースコードがあるディレクトリに移動して、RTL8821AUドライバをビルドする。

cd <RTL8821AUドライバのソースディレクトリ>
make -j $(nproc)


RTL8821AUドライバをインストールする。

sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au
sudo cp 8821au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au

# 任意
cd /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au
sudo zstd --rm 8821au.ko  または  sudo zstd --ultra -22 --rm 8821au.ko


※注意
Linuxカーネルをアップデートした場合は自動的にRTL8821AUドライバが削除されるため、再度、RTL8821AUドライバをインストールする必要がある。
RTL8821AUドライバをデプロイする。

sudo depmod -a $(uname -r)


RTL8821AUドライバを読み込む。

sudo modprobe -v 8821au


RTL8821AUドライバのインストール (セキュアブートが有効の場合)

ダウンロードしたソースコードがあるディレクトリに移動して、RTL8821AUドライバをビルドする。

cd <RTL8821AUドライバのソースディレクトリ>
make -j $(nproc)


まず、署名に必要な設定ファイルを作成する。

mkdir -p ~/MOK/RTL8821AU && cd ~/MOK/RTL8821AU
vi RTL8821AU.config


# ~/MOK/RTL8821AU/RTL8821AU.configファイル

[ req ]
default_bits = 4096
distinguished_name = req_distinguished_name
prompt = no
string_mask = utf8only
x509_extensions = myexts

[ req_distinguished_name ]
O = SUSE Linux Products GmbH (User Add RTL8821AU)            # 任意の名前
CN = SUSE Linux Enterprise Secure Boot (User Add RTL8821AU)  # 任意の名前
emailAddress = suse@localhost                                # 任意のメールアドレス

[ myexts ]
basicConstraints=critical,CA:FALSE
keyUsage=digitalSignature
subjectKeyIdentifier=hash
authorityKeyIdentifier=keyid


キーペアを作成する。

openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch -config ./RTL8821AU.config \
-outform DER -out ./RTL8821AU.der -keyout ./RTL8821AU.priv \
-addext "extendedKeyUsage=codeSigning"


次に、MOK(Module owned Key)にキーをインポートする。
--root-pwオプションを付加することにより、再起動時のRealtek RTL8821AUモジュールの署名において、rootパスワードが必要となる。

sudo mokutil --import ./RTL8821AU.der --root-pw


PCを再起動して、上記のキーの署名する。

sudo systemctl reboot


RTL8821AUドライバをインストールする。

sudo mkdir -p /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au
sudo cp 8821au.ko /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au


Realtek RTL8821AUドライバ(8821au.ko)を署名する。

sudo /lib/modules/$(uname -r)/build/scripts/sign-file sha256 \
./RTL8821AU.priv ./RTL8821AU.der \
/lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au/8821au.ko


必要であれば、Realtek RTL8821AUモジュールをXZ形式またはZstandard形式に圧縮する。(任意)

# XZ形式の場合
cd /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au
sudo xz -f 8821au.ko

# Zstandard形式の場合
cd /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au
sudo zstd --rm 8821au.ko



※注意
Linuxカーネルをアップデートした場合は自動的にRTL8821AUドライバが削除されるため、再度、RTL8821AUドライバをインストールする必要がある。
RTL8821AUドライバをデプロイする。

sudo depmod -a $(uname -r)


RTL8821AUドライバを読み込む。

sudo modprobe -v 8821au


RTL8821AUドライバのアンインストール (セキュアブートが無効の場合)

RTL8821AUドライバをアンインストールする。

cd <RTL8821AUドライバのソースディレクトリ>
sudo make uninstall


RTL8821AUドライバファイルを削除する。

sudo rm /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au/8821au.ko
# または
sudo rm /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au/8821au.ko.xz
# または
sudo rm /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au/8821au.ko.zst


ドライバ群をデプロイする。

sudo depmod -a $(uname -r)


RTL8821AUドライバのアンインストール (セキュアブートが有効の場合)

RTL8821AUドライバをアンインストールする。

cd <RTL8821AUドライバのソースディレクトリ>
sudo make uninstall


RTL8821AUドライバファイルを削除する。

sudo rm /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au/8821au.ko
# または
sudo rm /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au/8821au.ko.xz
# または
sudo rm /lib/modules/$(uname -r)/kernel/drivers/net/wireless/realtek/rtlwifi/rtl8821au/8821au.ko.zst


ドライバ群をデプロイする。

sudo depmod -a $(uname -r)


次に、Realtek RTL8821AUドライバの署名を削除する。
Realtek RTL8821AUモジュールの署名を削除する場合、以下のコマンドを実行して再起動する。
--root-pwオプションを付加することにより、再起動時のRealtek RTL8821AUデバイスの署名の削除において、rootパスワードが必要となる。

cd <Realtek RTL8821AUモジュールの署名ファイルが存在するディレクトリ>
sudo mokutil --delete ./RTL8821AU.der --root-pw
sudo systemctl reboot


設定ファイル

インストール

RTL8821AUの設定ファイルを/lib/modprobe.dディレクトリにコピーする。

Linuxディストリビューションが提供するmodprobe設定ファイルは、/lib/modprobe.dディレクトリである。
ユーザが任意で設定を変更する場合は、/etc/modprobe.dディレクトリにファイルを作成する。

sudo cp 8821au.conf /etc/modprobe.d


詳細を知りたい場合は、以下に示すファイルを参照すること。

  • /lib/modprobe.d/README
  • /usr/share/doc/packages/suse-module-tools/README.md
  • manページのmodprobe.d(5)


アンインストール

RTL8821AUの設定ファイルを/lib/modprobe.dディレクトリから削除する。

sudo rm /etc/modprobe.d/8821au.conf


DKMSの使用

RTL8821AUチップ向けカーネルモジュールにおいて、DKMSを使用して自動的にビルドおよびインストールする。

RTL8821AUチップ向けカーネルモジュールのDKMS設定ファイルを作成する。

sudo mkdir -p /usr/src/8821au-1.0
sudo vi /usr/src/8821au-1.0/dkms.conf


# /usr/src/8821au-1.0/dkms.confファイル

# 必須: モジュール名
# ディレクトリ名の前半部分と一致させる (ハイフンの前方部分の文字列)
PACKAGE_NAME="8821au"

# 必須: バージョン番号 (通常はモジュールのバージョン)
# ディレクトリ名の後半部分と一致させる (ハイフンの後半部分の文字列)
PACKAGE_VERSION="1.0"

# カーネルバージョンごとにモジュールをビルドする
BUILT_MODULE_NAME[0]="8821au"

# モジュールソースのディレクトリ
# このディレクトリは、/lib/modules/$(uname -r) ディレクトリが基点となる
# したがって、以下に示す設定では、/lib/modules/$(uname -r)/updates/dkms ディレクトリにカーネルモジュールがインストールされる
DEST_MODULE_LOCATION[0]="/updates/dkms"

# モジュールをビルドするためのソースディレクトリ
# DKMSはこのディレクトリ内でビルドプロセスを実行する
MAKE="make -j $(nproc) all"

# モジュールをクリーンアップする際に使用するコマンド
CLEAN="make clean"

# モジュールのビルド後に自動で実行されるフックスクリプト
POST_BUILD=""

# インストールが完了した際に実行されるフックスクリプト
# ここでは、MOK署名およびカーネルモジュールの圧縮を行うスクリプトを指定している
POST_INSTALL="bash ./post_install.sh"

# モジュールを削除する際に使用するフック
POST_REMOVE="make clean"

# モジュールバージョンの詳細な情報を提供するコメント
# モジュールのバージョンやDKMSの設定に関する情報を提供
COMMENT="RTL8821AU Wi-Fi driver with MOK signing"

# DKMSがインストールディレクトリを自動的に作成するように指定する
# 変数KDIRは、カーネルソースディレクトリを指定する
# 変数INSTALL_MOD_PATHは、モジュールのインストール先を指定する
# MAKE_ARGS="KDIR=/lib/modules/${kernelver}/build INSTALL_MOD_PATH=/lib/modules/${kernelver}"

# オプション: ビルドプロセスに使用する追加パラメータ
# KERNEL_VERSIONでターゲットのカーネルバージョンを指定
AUTOINSTALL="yes"


DKMSを通じてモジュールのビルドと共にMOKの署名を自動的に行う場合、dkms.confファイルにカスタムフックを追加する。
これにより、ビルド後に自動でモジュールに署名を行うスクリプトを設定することができる。

これは、dkms.confにビルド後のカスタムフック (post_build) を追加して、その中でMOKの署名スクリプトを実行する。

sudo vi /usr/src/8821au-1.0/post_install.sh


 # /usr/src/8821au-1.0/post_install.shファイル
 
 #!/usr/bin/env bash
 
 # キーペアを作成
 openssl req -x509 -new -nodes -utf8 -sha256 -days 36500 -batch \
             -config  ./RTL8821AU.config \
             -outform DER                \
             -out     ./RTL8821AU.der    \
             -keyout  ./RTL8821AU.priv   \
             -addext "extendedKeyUsage=codeSigning"
 
 # MOKの登録
 mokutil --import ./RTL8821AU.der --root-pw
 
 # モジュールへの署名に使う秘密鍵と公開鍵
 PRIVATE_KEY="/usr/src/8821au-1.0/RTL8821AU.priv"
 PUBLIC_KEY="/usr/src/8821au-1.0/RTL8821AU.der"
 MODULE_PATH="/lib/modules/$(uname -r)/updates/dkms/8821au.ko"
 
 # モジュールの署名
 /lib/modules/$(uname -r)/build/scripts/sign-file sha256 $PRIVATE_KEY $PUBLIC_KEY $MODULE_PATH 
 
 # 署名結果の確認
 if [ $? -eq 0 ]; then
    echo "Module signed successfully."
 else
    echo "Failed to sign the module."
    exit 1
 fi
 
 # カーネルモジュールを圧縮
 cd /lib/modules/$(uname -r)/updates/dkms/8821au.ko
 zstd --ultra -22 --rm /lib/modules/$(uname -r)/updates/dkms/8821au.ko
 
 # 圧縮と署名の成功を確認
 if [ $? -eq 0 ]; then
    echo "Module signing and compression successful."
 else
    echo "Failed to sign or compress the module."
    exit 1
 fi


カスタムフックスクリプトに実行権限を付加する。

sudo chmod u+x /usr/src/8821au-1.0/post_install.sh


RTL8821AUチップ向けカーネルモジュールのソースコードをダウンロードして、DKMS設定ファイルと同階層のディレクトリにコピーする。

git clone https://github.com/morrownr/8821au-20210708.git
cd 8821au-20210708
sudo cp -r .  /usr/src/8821au-1.0


DKMSを使用して、RTL8821AUチップ向けカーネルモジュールをビルドおよびインストールする。

sudo dkms add rtl8821au/1.0      または  sudo dkms add -m rtl8821au -v 1.0
sudo dkms build rtl8821au/1.0    または  sudo dkms build -m rtl8821au -v 1.0
sudo dkms install rtl8821au/1.0  または  sudo dkms install -m rtl8821au -v 1.0


モジュールがロードされていることを確認する。

lsmod | grep 8821au


これにより、RTL8821AUチップ向けカーネルモジュールがDKMSにより自動的にビルドおよびインストールされる。
Linuxカーネルがアップデートされた場合でも、DKMSが自動的にカーネルモジュールを再ビルドするため、手動でカーネルモジュールを再インストールする必要はない。

ただし、カーネルモジュールのソースコードが更新された場合は、最新のソースコードをダウンロードして、該当するDKMSの設定ファイルがある同階層のディレクトリにコピーする必要がある。


Qualcomm QCA

エラー関連

通信が不安定

Wi-Fiは50~60[Mbps]で通信を始めるが、暫く時間が経つと10[Mbps]に低下し始め、その後、通信速度が3~30[Mbps]の間で不安定な通信となる。
この問題は、Linuxでのみ見られる。

ルータ設定にて、2.4[GHz]の帯域で通信する場合、チャネル幅(倍速モード)を20[MHz]/40[MHz]から20[MHz]に変更することにより、この問題が解決できる可能性がある。
また、5[GHz]の帯域で通信する場合、チャネル幅(倍速モード)を40[MHz]に設定する方がよい場合もある。

また、ルータの設定において、無線チャンネルを[自動]ではなく、任意のチャンネルを選択する。

Wi-Fiカードが認識されない

現状、解決策は存在しない。
ただし、PCを再起動することにより、Wi-Fiカードが認識する場合がある。