Raspberry Pi ZeroのイーサネットガジェットとしてのPCからの扱い

Last modified: 2019-11-16

Raspberry Pi Zero(手元ではWH)でdwc2を周辺機器としての動作をするように有効化(dtoverlay=dwc2,dr_mode=peripheral)し、通信用USBケーブル(ホストケーブルではない)で接続したときの “イーサネットガジェット” としてのPCからの扱いについて。

Zero側で必要な起動時の設定などはRaspberry Pi ZeroなどをUSB接続したマシンからmicroSDなしでOS起動を参照。

GNU/Linux (Ubuntu) PCからの使用

GNU/Linuxでは、USBネットワークインターフェース用ドライバの1つであるcdc_etherというカーネルモジュールによって標準でサポートされている。自分でカーネルのビルド設定を編集してビルドしている場合はこのモジュールがビルドされるようにする必要がある。

ネットワーク設定

リンクローカルの接続としてNetworkManagerのGUIやTUIで設定して使用することができるが、手元の環境1では次回からのPC起動後に接続がうまくいかないことが頻繁に起きたため、ネットワーク設定のやり方を変えて

  • プライベートIPv4アドレスをZero側とPC側に固定で設定
    • 本記事においてはそれぞれ192.168.111.1192.168.111.2とする
  • PC側からはNetworkManagerを使用せずにnetplanを通してsystemd-networkdを使用してネットワークを設定

の形で運用することにした。

Zero側

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側

まず、手元のPCではNICはオンボードのものしか使用しておらず、Zero以外のUSBイーサネットガジェットとなるものもないため、カーネルにnet.ifnames=nパラメータを渡してeth0(NIC)やusb0(USBイーサネット)のようなネットワークインターフェース名で扱うようにした。

[一部]ファイル名:/etc/default/grub

GRUB_CMDLINE_LINUX="net.ifnames=n"

上の設定を反映するにはupdate-grubの実行後に起動し直す。

これを付けない場合は後述の設定でハードウェア環境ごとに異なる長い名前のネットワークインターフェース名でeth0usb0を置き換える。

下に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起動時に接続が失敗する場合の対処

Zeroを起動した後のPC起動時にネットワークインターフェースがPCのOSから認識されておりIPアドレスも付いているにも関わらずうまく接続できない場合がある。

PC側からの対処

cdc_ethercdc_subsetのカーネルモジュールを破棄してからcdc_etherを読み込み直すと通信できるようになる場合があるが、確実ではない印象がある。

(PC側でcdc_etherを再初期化して通信不具合を復旧させる)
PC$ sudo modprobe -r cdc_ether && sudo modprobe -r cdc_subset && sleep 5 && sudo modprobe cdc_ether

Zero側からの対処 (Zero W/WH)

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

こちらの方法はより確実に効果がある印象がある。

Windows PCからの使用

ドライバの指定

自動認識では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の接続とインターネット接続を共有する設定を行う。

Zeroconfの名前を指定してアクセスする場合

WindowsでZeroconfの名前(例:mypizero.local)を指定してZeroに接続する場合はApple社によるZeroconfの実装である “Bonjour” のWindows版をインストールしておく。

Windows版iTunesの配布ファイルから取り出したインストーラのファイルを実行して単独でインストールしたところ、正しくインストールが完了して動作も問題ない。

Windows版iTunesが既にインストールされている環境では特に追加の作業は必要ない。このBonjourはPCを含むGNU/Linuxマシンでavahi-daemonのサービスが動いているときにそのホスト名に対して.localを付けた名前で名前解決ができるようにするもの。


  1. PCの電源ユニットのスイッチを入れっぱなしにしているため、Zero WHはPCのシャットダウン後もずっとUSBケーブルから電源が供給され続けているのだが、これはZeroをmicroSDカードなしで動かしているときに都合がよい [return]