Zenn
🌉

Raspberry Pi OS(bookworm)でWindowsから有線接続したいときの設定方法

2025/03/25に公開

結論

ラズパイのNetworkManagerで、usb0を自動で有効にしましょう。

はじめに

ラズパイ4にRaspberry Pi OS(bookworm)をインストールして、いつもの手順(/boot/config.txtなどに追記する作業)を実施しても有線接続できませんでした。
色々試して解決したので、共有します。

バージョン情報

Windows

OS: Microsoft Windows 11
バージョン: 10.0.26100 ビルド 26100

ラズパイ

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 12 (bookworm)"
NAME="Debian GNU/Linux"
VERSION_ID="12"
VERSION="12 (bookworm)"
VERSION_CODENAME=bookworm
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"
$ uname -a
Linux raspberrypi 6.6.51+rpt-rpi-v8 #1 SMP PREEMPT Debian 1:6.6.51-1+rpt3 (2024-10-08) aarch64 GNU/Linux
$ cat /proc/cpuinfo | grep Model
Model       	: Raspberry Pi 4 Model B Rev 1.5

(参考)
Raspberry Pi OS(bookworm)はRaspberry Pi ImagerでSDカードに焼きました。

手順

初期状態の確認

この状態ではUSBで両者を接続しても、何も起きません。
Windows側はネットワークとインターネット>ネットワークの詳細設定」や「デバイスマネージャー」に出てきません。。
ラズパイ側のネットワークインターフェースを確認しても、usb0は出てきません。

pi@raspberrypi:~ $ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
    	ether 2c:cf:67:37:22:9f  txqueuelen 1000  (Ethernet)
    	RX packets 0  bytes 0 (0.0 B)
    	RX errors 0  dropped 0  overruns 0  frame 0
    	TX packets 0  bytes 0 (0.0 B)
    	TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
    	inet 127.0.0.1  netmask 255.0.0.0
    	inet6 ::1  prefixlen 128  scopeid 0x10<host>
    	loop  txqueuelen 1000  (Local Loopback)
    	RX packets 17  bytes 2189 (2.1 KiB)
    	RX errors 0  dropped 0  overruns 0  frame 0
    	TX packets 17  bytes 2189 (2.1 KiB)
    	TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    	inet 192.168.112.88  netmask 255.255.255.0  broadcast 192.168.112.255
    	inet6 fe80::5d93:7165:33f9:a3f2  prefixlen 64  scopeid 0x20<link>
    	ether 2c:cf:67:37:22:a0  txqueuelen 1000  (Ethernet)
    	RX packets 1040  bytes 1106672 (1.0 MiB)
    	RX errors 0  dropped 0  overruns 0  frame 0
    	TX packets 903  bytes 73853 (72.1 KiB)
    	TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

USBガジェットモードの有効化(テキストファイルの書き換え)

手順は今までと一緒です。
設定ファイルに追記し、USBガジェットモードを有効にします。

ラズパイ環境に入る

Wi-Fi経由でsshするか、ラズパイにディスプレイとキーボードを接続し、ターミナルが操作可能な環境を整えてください。

テキストエディタのインストール

テキストファイル操作用にvimをインストールしておきます。
(テキストエディタであれば何でも良いですが、本記事ではvimでご説明します。)

$ sudo apt update && sudo apt install -y vim

config.txtの追記

最終行にdtoverlay=dwc2を追加します。

$ sudo vim /boot/firmware/config.txt # 追記する。
$ tail -2 /boot/firmware/config.txt # 確認する。
[all]
dtoverlay=dwc2

cmdline.txtの書き換え

rootwaitの後に、modules-load=dwc2,g_etherを追記します。

$ sudo vim /boot/firmware/cmdline.txt # 追記する。
$ tail -1 /boot/firmware/cmdline.txt # 確認する。
console=serial0,115200 console=tty1 root=PARTUUID=a2071dc5-02 rootfstype=ext4 fsck.repair=yes rootwait modules-load=dwc2,g_ether quiet splash plymouth.ignore-serial-consoles cfg80211.ieee80211_regdom=JP

再起動

$ sudo reboot now

この状態で再起動すると、ガジェットモードが有効になり、
Windowsからは「未接続」のUSB Ethernet/RNDIS Gadgetとして認識されます。

ラズパイ側はまだインターフェイス(usb0)が立ち上がっていません。

$ ifconfig
eth0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500
        ether 2c:cf:67:37:22:9f  txqueuelen 1000  (Ethernet)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 97  bytes 8633 (8.4 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 97  bytes 8633 (8.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.112.88  netmask 255.255.255.0  broadcast 192.168.112.255
        inet6 fe80::5d93:7165:33f9:a3f2  prefixlen 64  scopeid 0x20<link>
        ether 2c:cf:67:37:22:a0  txqueuelen 1000  (Ethernet)
        RX packets 649  bytes 458631 (447.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 422  bytes 39421 (38.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

よって、ネットワークとしては接続できていない状態です。

なぜ繋がらないのか?

2023年10月の「bookworm」バージョンから、ネットワーク管理ツールを従来の「dhcpcd」から「NetworkManager」へ変更したようです。
dhcpcdではAPIPA(Automatic Private IP Addressing)が有効になっているため、Windowsと接続すると、リンクローカルアドレスで自動的にIPアドレスが割り当てられていたようです。
しかし、同機能が初期状態のNetworkManagerには備わっておらず、設定を追加する必要がありました。
また、参考記事の通り、NetworkManagerは標準でusb0を立ち上げない設定のようです。

対応

今回やることは以下の2つです。

  1. NetworkManagerの設定で、IPv4設定を「共有モード」にし、DHCPサーバ機能を有効にする。
  2. デバイス管理システムの設定で、usb0を自動で立ち上がるようにする。

まずは、NetworkManagerを使ってusb0の設定を行います。
設定する前にWindowsとラズパイ(USB Type-C)を接続しておきます。

状態把握

まずは状態を把握します。

$ nmcli device status
DEVICE         TYPE      STATE                   CONNECTION
wlan0          wifi      connected               preconfigured
lo             loopback  connected (externally)  lo
p2p-dev-wlan0  wifi-p2p  disconnected            --
eth0           ethernet  unavailable             --
usb0           ethernet  unmanaged               --

usb0のSTATEがunmanagedなので、NetworkManagerの管理化に入っていないことがわかります。

NetworkManagerの設定

そこで、nmcliコマンドを利用して、usb0をNetworkManagerの管理化にします。

$ sudo nmcli connection add type ethernet ifname usb0 con-name usb0-dhcp ipv4.method shared connection.autoconnect yes
Connection 'usb0-dhcp' (9298cf41-f0cc-4477-aa2c-0879f1aed0c6) successfully added.

各オプションの意味

オプション 意味・解説
sudo 管理者権限で実行
nmcli NetworkManagerのコマンドラインインターフェース(ネットワーク設定を操作)
connection add 新しいネットワーク接続を追加
type ethernet 接続タイプを「イーサネット」と指定(USB Ethernetガジェットなども対象)
ifname usb0 対象インターフェースをusb0に指定(USBネットワークデバイス)
con-name usb0-dhcp この接続の名前をusb0-dhcpと指定(任意の名前)
ipv4.method shared IPv4設定を「共有モード」に設定。DHCPサーバ機能付きで、接続先デバイスにIPアドレスを割り当てる
connection.autoconnect yes 接続した際に、自動で立ち上げるようにする。

立ち上げます。

$ sudo nmcli connection up usb0-dhcp
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)

再度ステータスを確認し、usb0がconnectedになっていることを確認します。

$ nmcli device status
DEVICE         TYPE      STATE                   CONNECTION
wlan0          wifi      connected               preconfigured
usb0           ethernet  connected               usb0-dhcp
lo             loopback  connected (externally)  lo
p2p-dev-wlan0  wifi-p2p  disconnected            --
eth0           ethernet  unavailable             --

ラズパイ側でusb0が立ち上がり、プライベートIPアドレスが割り振られていることを確認します。

$ ifconfig usb0
usb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.42.0.1  netmask 255.255.255.0  broadcast 10.42.0.255
        inet6 fe80::acf5:4c4e:4935:a8d5  prefixlen 64  scopeid 0x20<link>
        ether 2e:3a:07:e5:92:b4  txqueuelen 1000  (Ethernet)
        RX packets 1801  bytes 651486 (636.2 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 1585  bytes 1005465 (981.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Windowsから見ても、有効になっています。

Windowsからpingを打つとラズパイのusb0のIPアドレスである、10.42.0.1に変わっています。

$ ping raspberrypi-mascot.local
PING raspberrypi-mascot.local (10.42.0.1) 56(84) bytes of data.
64 bytes from 10.42.0.1: icmp_seq=1 ttl=64 time=0.654 ms
64 bytes from 10.42.0.1: icmp_seq=2 ttl=64 time=1.23 ms

自動設定

nmcli connection upコマンドは再起動すると、なかったことになってしまいます。
そこで、USB接続されたら自動で、NetworkManagerの管理化に置くようにします。

udevadmでUSB EthernetのID_PATHを調べます。

$ udevadm info /sys/class/net/usb0 | grep ID_PATH=
E: ID_PATH=platform-fe980000.usb

/etc/udev/rules.d/85-usb-otg.rulesファイルに以下の情報を入力します。
platform-fe980000.usbの部分は環境に合わせて修正してください。
NM_UNMANAGEDにすることで、自動起動させます。

$ sudo vim /etc/udev/rules.d/85-usb-otg.rules # 以下の設定ファイルの情報を入力してください。
設定ファイル
SUBSYSTEM=="net", ACTION=="add|change|move", ENV{DEVTYPE}=="gadget", ENV{ID_PATH}=="platform-fe980000.usb", ENV{NM_UNMANAGED}=""

最後に、再起動してusb0が自動で立ち上がることを確認します。

おわりに

ラズパイはバージョンアップごとに仕様が変わることが多いので、キャッチアップが大変ですね!

参考記事

大変感謝いたします。

更新履歴

  • ipv4.methodをautoからshareに変更しました。
    • autoにすると、APIPAが機能して、リンクローカルアドレスが振られるのですが、うまくいかないときもあったので、意図的にラズパイをDHCPサーバにします。
    • それにともない、リンクローカルアドレス(169.254.x.x)からプライベートIPアドレス(10.x.x.x)に変更になりました。
ユカイ工学テックブログ

Discussion

ログインするとコメントできます