macOS(Hackintosh)で USB Wi-Fi 子機「MT7601U」を使えるようにした

macOS
スポンサーリンク
スポンサーリンク

はじめに

安価な USB Wi-Fi 子機の中には、Linux では普通に動くのに、macOS 用のドライバが存在しないものがたくさんあります。MediaTek の MT7601U(USB ID は 148f:7601)を積んだ小型の子機も、その一つです。

この記事で紹介するのは、MT7601U の子機を macOS で使えるようにした自作ドライバです。Linux 本家の mt7601u ドライバを、書き換えずに近い形で、macOS のユーザー空間で動かしています。

  • 2.4GHz の Wi-Fi(802.11n)に接続できます
  • WPA2-PSK(一般的な家庭用ルーターの設定)と、パスワードなしのネットワークに対応しています
  • IPv4(DHCP)と IPv6 のアドレスを取得できます
  • メニューバーのアプリから、接続状況の確認、ネットワークの一覧表示、接続ができます
  • ダブルクリックで入れられる GUI インストーラー(.pkg)があります

最初に、できないことも書いておきます。

  • macOS 標準の「システム設定 > Wi-Fi」には表示されません。 専用のメニューバーアプリから操作します
  • 5GHz には対応していません(チップが 2.4GHz 専用です)
  • WPA3 には対応していません
  • 通信は専用のネットワークインターフェース(utun)経由です。macOS のデフォルトの経路は変えません(後述)

実験的なプロジェクトで、無保証です。 自己責任でお試しください。

動作環境

項目内容
OSmacOS 26(Tahoe)
CPUIntel(x86_64)
子機MediaTek MT7601U(USB 148f:7601)搭載のもの
動作確認した環境Hackintosh の Mac Pro(MacPro7,1)、家庭用ルーター 1 台(2.4GHz、WPA2)

動作確認は、上の 1 つの環境だけです。Apple Silicon の Mac や、ほかの macOS のバージョンは確認していません。

子機を挿したときに、USB の情報が 802.11 n WLAN、ベンダー ID 0x148f、製品 ID 0x7601 になっていれば対象です。

「このMacについて > システムレポート > USB」で確認できます。

インストール方法(GUI)

  1. GitHub の Releases から、MT7601U-WiFi-0.1.pkg をダウンロードします
  2. ダウンロードしたファイルを、右クリック →「開く」 で開きます。署名のないインストーラーなので、ダブルクリックだけでは警告が出て開けないことがあります
  3. 画面の案内に従って、インストールします。管理者のパスワードを聞かれます
  4. インストール後に「アプリのバックグラウンドでのアクティビティ」という通知が出ます。これは、メニューバーアプリとデーモンが、バックグラウンドで動く設定を登録したという意味です。許可してください
  5. MT7601U を USB に挿します
  6. 少し待つと、メニューバーに Wi-Fi のアイコンが出ます

インストールされるものは、次のとおりです。

場所内容
/usr/local/libexec/mt7601u/mt7601udドライバ本体(常駐デーモン)
/usr/local/share/mt7601u/mt7601u.binチップのファームウェア
/Applications/MT7601U Wi-Fi.appメニューバーアプリ
/usr/local/bin/mt7601u-wifiコマンドラインのランチャー
/Library/LaunchDaemons/local.mt7601ud.plistデーモンを自動起動する設定
/Library/LaunchAgents/local.mt7601u.wifi.plistログイン時にメニューバーアプリを起動する設定

使い方

メニューバーアプリ

アイコンをクリックすると、次のものが表示されます。

  • 接続中のネットワーク名、IP アドレス、電波の強さ、チャンネル
  • 周辺のネットワークの一覧(電波の強い順。鍵のマークは、パスワードが必要なもの)
  • 再スキャン、切断、保存済みネットワークの削除

ネットワークを選ぶと、パスワードの入力画面が出ます。入力したパスワードは保存され、次回からは、選ぶだけで接続できます。起動後は、保存済みのネットワークに自動で再接続します。

アイコンは、状態によって変わります。電波の強さに合わせて、Wi-Fi のマークの濃さが変わります。

表示状態
Wi-Fi のマーク接続中
斜線入りのマーク未接続、またはアダプタが見つからない
ビックリマーク付き接続処理中、または接続に失敗
三角の警告デーモンが動いていない

コマンド

ターミナルから、同じ操作ができます。

mt7601u-wifi scan                  # 周辺のネットワークを検索して一覧表示
mt7601u-wifi connect "SSID名"      # パスワードを聞かれ、保存されて自動接続されます
mt7601u-wifi status                # 接続状況(JSON)
mt7601u-wifi disconnect            # 切断
mt7601u-wifi forget "SSID名"       # 保存したネットワークを削除
mt7601u-wifi log                   # ログを表示

通信を確認する

接続できたら、次のコマンドで確認できます。utun4 の番号は、環境によって変わることがあります。ifconfig で、接続先の IP アドレスが付いたものを探してください。

ping -c 4 -b utun4 192.168.0.1     # ルーター(ゲートウェイ)に届くか

インターネットへの疎通は、次のように、取得した IP アドレスを指定して確認できます。

ping -c 4 -S 192.168.0.227 8.8.8.8

筆者の環境では、ルーターへの ping が 4〜50 ミリ秒、8.8.8.8 への ping が 50〜100 ミリ秒ほどでした。最初の数回は、1 秒前後かかることがあります。受信のレートは、HT MCS2 20MHz と表示されていました。1 本のアンテナの 20MHz 幅の接続で、理論上の最大は 72 Mbit/s ですが、実際の速度は計測していません。

デフォルトの経路は変えません

このドライバは、接続しても、macOS のデフォルトの経路(インターネットへの出口)を変えません。有線の LAN などがあれば、そちらが使われます。有線がないときに、この Wi-Fi が使われます。

Wi-Fi を、標準のネットワークとして使いたい場合は、設定の変更が必要です。この記事では扱いません。

アンインストール

sudo /usr/local/libexec/mt7601u/uninstall.sh

デーモン、アプリ、ファームウェアなど、インストールしたものを削除します。保存したネットワーク(パスワードを含む)は、/var/db/mt7601ud に残ります。完全に消したい場合は、このフォルダも削除してください。

仕組み

Linux には、MT7601U 用の mt7601u ドライバが入っています。これを、macOS のユーザー空間で動かしています。

メニューバーアプリ(Swift)/ mt7601u-wifi コマンド
      │  制御ソケット(/var/run/mt7601ud.sock)
mt7601ud(root で動く常駐デーモン)
      ├─ mt7601u(Linux 本家のソース、ほぼ無改変)
      ├─ Linux カーネル API の互換層、簡易 mac80211、MLME、WPA2 の supplicant
      ├─ IOKit USB ── MT7601U の子機
      └─ utun(DHCP・ARP・IPv6 をデーモンが処理)

macOS には、Wi-Fi ドライバを作るための公開された仕組みがありません。そのため、次のように割り切っています。

  1. ドライバ(mt7601u)は、Linux のものをそのまま使う。 チップの制御は、これに任せます
  2. Linux のカーネルの機能を、ユーザー空間で再現する。 skb などの Linux の部品を、互換層として用意しました
  3. Wi-Fi の「接続」の手順(認証、アソシエーション、4-way ハンドシェイク)は、自前で書く。 Linux では mac80211 と wpa_supplicant が担当している部分です
  4. 通信は、utun に載せる。 暗号化は、チップのハードウェアが行います

この方式は、先に作った TP-Link Archer TX20U Nano(RTL8852B)用のドライバ(rtw89-macos)と同じです。今回は、その土台を使って、別のチップに対応させました。

苦労した点

動かすまでに、次のような問題がありました。

  • チップが固まる。 ファームウェアが動いたままのチップを、もう一度初期化すると、受信がでたらめになることがありました。起動時に USB のポートをリセットして、解決しました
  • AP のチャンネルを取り違える。 このチップは、ファームウェアがスキャンしてくれないため、受信したときのチャンネルで AP の場所を判断していました。隣のチャンネルで拾った電波を、AP のチャンネルと取り違えて、接続できなくなることがありました。AP が自分で申告するチャンネル番号(ビーコンの DS Parameter Set)を使うように直しました
  • 暗号化ヘッダ(IV)が二重になる。 このチップは、暗号化のヘッダ(IV)をハードウェアが付けます。ソフトウェア側で付けると二重になり、AP に捨てられていました。Linux の mac80211 と同じ規則に合わせました
  • スキャンのあとにチャンネルを戻さない。 スキャンしたままのチャンネルに、無線が残ってしまい、接続中の通信が止まっていました。スキャンのあとに、接続中のチャンネルへ戻すようにしました

困ったとき

  • 一覧が空のまま、または接続できない。 デーモンが、チップの固まりを検知すると、自動で再起動して初期化し直します。それでも直らない場合は、USB を挿し直してください
  • 「パスワードが違う」と出る。 まず、打ち間違いを疑ってください。実際に、筆者の失敗の原因の多くが、打ち間違いでした
  • 5GHz のネットワークが見えない。 このチップは、2.4GHz 専用です
  • ログを見る。 メニューの「ログを開く」、または mt7601u-wifi log で、デーモンのログ(/var/log/mt7601ud.log)が見られます

ソースからビルドする

Xcode の Command Line Tools が必要です。

git clone https://github.com/Long0823-1/mt7601u-macos.git
cd mt7601u-macos
scripts/fetch-firmware.sh      # ファームウェアを取得(リポジトリには含みません)
installer/build-pkg.sh         # dist/ にインストーラー(.pkg)を作成

デーモンだけ試す場合は、次のようにします。

cd port && make
RTW89_FW_DIR=../mt7601u ./mt7601ud scan

まとめ

  • MT7601U の USB 子機を、macOS で使えるようにしました。2.4GHz、WPA2、IPv4 / IPv6 で動作します
  • GUI のインストーラーと、メニューバーのアプリがあります
  • 標準の「システム設定」には出ません。通信は専用のインターフェース経由です
  • 動作確認は、筆者の環境 1 つだけです。実験的なソフトウェアなので、自己責任でお使いください

ソースコードとインストーラーは、GitHub で公開しています。

ライセンスは GPL-2.0 です。Linux の mt7601u ドライバ、MediaTek のファームウェアのライセンスは、リポジトリの THIRD_PARTY.md を参照してください。

コメント

タイトルとURLをコピーしました