Raspberry Pi OS(bookworm)でWindowsから有線接続したいときの設定方法
結論
ラズパイの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つです。
- NetworkManagerの設定で、IPv4設定を「共有モード」にし、DHCPサーバ機能を有効にする。
- デバイス管理システムの設定で、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