Raspberry Pi Zero(手元ではWH)でdwc2
を周辺機器としての動作をするように有効化(dtoverlay=dwc2,dr_mode=peripheral
)し、通信用USBケーブル(ホストケーブルではない)で接続したときの “イーサネットガジェット” としてのPCからの扱いについて。
Zero側で必要な起動時の設定などはRaspberry Pi ZeroなどをUSB接続したマシンからmicroSDなしでOS起動を参照。
GNU/Linuxでは、USBネットワークインターフェース用ドライバの1つであるcdc_ether
というカーネルモジュールによって標準でサポートされている。自分でカーネルのビルド設定を編集してビルドしている場合はこのモジュールがビルドされるようにする必要がある。
リンクローカルの接続としてNetworkManagerのGUIやTUIで設定して使用することができるが、手元の環境1では次回からのPC起動後に接続がうまくいかないことが頻繁に起きたため、ネットワーク設定のやり方を変えて
192.168.111.1
と192.168.111.2
とするの形で運用することにした。
ZeroからUSBイーサネット経由でインターネットに接続しないのであればIPアドレスの指定のみでよい。
/etc/dhcpcd.conf
interface usb0
static ip_address=192.168.111.1/24
ZeroからPCを通してインターネットにアクセスできるようにするには、更にstatic routers=...
やstatic domain_name_servers=...
の記述を追記する。
手元の環境ではこのUSBイーサネットの主な用途がPCとのSSHやNetjackの通信のみでインターネット通信の必要があれば無線LANからできるようにしているため、USBイーサネットはPCとの間でのみ使用している。
まず、手元のPCではNICはオンボードのものしか使用しておらず、Zero以外のUSBイーサネットガジェットとなるものもないため、カーネルにnet.ifnames=n
パラメータを渡してeth0
(NIC)やusb0
(USBイーサネット)のようなネットワークインターフェース名で扱うようにした。
/etc/default/grub
GRUB_CMDLINE_LINUX="net.ifnames=n"
上の設定を反映するにはupdate-grub
の実行後に起動し直す。
これを付けない場合は後述の設定でハードウェア環境ごとに異なる長い名前のネットワークインターフェース名でeth0
やusb0
を置き換える。
下にnetplanでnetworkdを用いる設定の例を示す。/etc/netplan/
内にrenderer: NetworkManager
を含むファイルが既にある場合はそのファイルを消すか全内容をコメントアウトする。
/etc/netplan/02-custom.yaml
network:
version: 2
renderer: networkd
ethernets:
eth0:
# ... NICについての記述のため省略 ...
usb0:
addresses: [192.168.111.2/24]
optional: true
ZeroのUSBイーサネットからPCを通してインターネットにアクセスしたい場合、PCのIPv4フォワーディングとNAPTの両方を設定する方法と代わりにブリッジインターフェースを設定する方法がある。
Zeroを起動した後のPC起動時にネットワークインターフェースがPCのOSから認識されておりIPアドレスも付いているにも関わらずうまく接続できない場合がある。
cdc_ether
とcdc_subset
のカーネルモジュールを破棄してからcdc_ether
を読み込み直すと通信できるようになる場合があるが、確実ではない印象がある。
(PC側でcdc_etherを再初期化して通信不具合を復旧させる)
PC$ sudo modprobe -r cdc_ether && sudo modprobe -r cdc_subset && sleep 5 && sudo modprobe cdc_ether
ZeroのモデルがWやWHであれば無線LANからのSSHログインを行ってg_ether
モジュールを一旦破棄して読み込み直すと通信できるようになる。
(Zero側でg_etherを再初期化して通信不具合を復旧させる)
Zero$ sudo modprobe -r g_ether && sleep 5 && sudo modprobe g_ether host_addr=xx:xx:xx:xx:xx:xx
こちらの方法はより確実に効果がある印象がある。
自動認識ではPi Zeroがシリアル通信デバイスとして検出および設定されていることがあり、その場合はドライバを置き換える作業を行う必要がある。
USBイーサネットを使用するためのドライバは幾つかあるようだが、Acerのハードウェア用のinfファイルをMicrosoftのサイトからダウンロードして指定したところ動作した。ドライバの実体としてはOSに含まれているMicrosoft製のドライバが使われる。
正しくドライバが指定されれば、ネットワークインターフェースの一覧にUSBイーサネット用の項目が表示されるようになる。
WindowsでUSBイーサネットのネットワークインターフェースが認識されているのに接続できない場合はデバイスマネージャからデバイスの無効化をしてから有効化してみると動くことがある。
ZeroのIPアドレスが固定で設定されていなければ自動的にリンクローカルアドレスが設定されて通信できる状態となることを確認済みだが、手元の環境ではZeroのIPアドレスを固定したので、こちらもGNU/Linuxと同様にIPアドレスを固定で設定することにした。
Windowsのネットワークインターフェースごとの設定ではプロトコルの有効/無効が個別に設定できるが、チェックはIPv4のTCP/IPのみで他は全て外してよい。
ZeroからPCを通してインターネットにアクセスしたい場合はNICの接続とインターネット接続を共有する設定を行う。
WindowsでZeroconfの名前(例:mypizero.local
)を指定してZeroに接続する場合はApple社によるZeroconfの実装である “Bonjour” のWindows版をインストールしておく。
Windows版iTunesの配布ファイルから取り出したインストーラのファイルを実行して単独でインストールしたところ、正しくインストールが完了して動作も問題ない。
Windows版iTunesが既にインストールされている環境では特に追加の作業は必要ない。このBonjourはPCを含むGNU/Linuxマシンでavahi-daemon
のサービスが動いているときにそのホスト名に対して.local
を付けた名前で名前解決ができるようにするもの。
PCの電源ユニットのスイッチを入れっぱなしにしているため、Zero WHはPCのシャットダウン後もずっとUSBケーブルから電源が供給され続けているのだが、これはZeroをmicroSDカードなしで動かしているときに都合がよい ↩︎