###### tags: `raspberrypi` # Raspberry Pi の USB Ethernet/RNDIS Gadget で 固定 IP アドレスを使う(その2) 「Raspberry Pi の USB Ethernet/RNDIS Gadget で 固定 IP アドレスを使う(その1)」で、Raspberry Pi の usb0 に固定 IP アドレスでアクセスする方法を書きました。 https://hackmd.io/@yuzuafro/raspi_rndis_staticipaddr この時は、`/boot/cmdline.txt` に `modules-load=dwc2,g_ether` を追加して、USB Ethernet/RNDIS Gadget を使えるようにしましたが、この設定は Raspberry Pi でのみ使える方法のようです。 「その2」では、一般的な Linux でも使える方法を記載していきます。 「その1」では、Raspberry Pi と USB ケーブルのみで疎通が可能でしたが、残念ながら「その2」の方法では Raspberry Pi にログインした状態で変更するファイルがあります。 スタンドアロン(マウス・キーボード・ディスプレイを接続する)でのログインか、Wi-Fi 設定をした状態で ssh 接続するなどの環境が必要になります。 ## Raspberry Pi の USB Gadget 設定 img を焼いた microSD の中身を PC で確認します。 以下のファイル(`/boot/config.txt`)を変更します。 ###### /boot/config.txt ``` dtoverlay=dwc2 ``` この状態で、Raspberry Pi を起動します。 スタンドアロンでログインするか、別 PC から Wi-Fi で ssh 接続をします。 ### Raspberry Pi 側の設定変更箇所 Raspberry Pi を起動したら、次の 3 ファイル(`/etc/modules`、`/usr/bin/myusbgadget`、`/etc/rc.local`)を変更、もしくは作成します。 #### Boot 時にロードする kernel モジュールの設定 一番下に、次の 2 行を追加します。 ###### /etc/modules ``` dwc2 libcomposite ``` #### USB デバイスの作成 次に、オリジナルの USB デバイスを作成していきます。 ここでは、`myusbgadget` という名前の USB デバイスを作成することにします。 次のような `/usr/bin/myusbgadget` というファイルを作成します。 ###### /usr/bin/myusbgadget ``` #!/bin/bash -e modprobe libcomposite cd /sys/kernel/config/usb_gadget/ mkdir -p myusbgadget cd myusbgadget echo 0x1d6b > idVendor # Linux Foundation echo 0x0104 > idProduct # Multifunction Composite Gadget echo 0x0100 > bcdDevice # v1.0.0 echo 0x0200 > bcdUSB # USB 2.0 echo 0xEF > bDeviceClass echo 0x02 > bDeviceSubClass echo 0x01 > bDeviceProtocol mkdir -p strings/0x409 echo "deadbeef00115599" > strings/0x409/serialnumber echo "irq5 labs" > strings/0x409/manufacturer echo "Pi Zero Gadget" > strings/0x409/product mkdir -p functions/acm.usb0 # serial mkdir -p functions/rndis.usb0 # network mkdir -p configs/c.1 echo 250 > configs/c.1/MaxPower ln -s functions/rndis.usb0 configs/c.1/ ln -s functions/acm.usb0 configs/c.1/ # OS descriptors echo 1 > os_desc/use echo 0xcd > os_desc/b_vendor_code echo MSFT100 > os_desc/qw_sign echo RNDIS > functions/rndis.usb0/os_desc/interface.rndis/compatible_id echo 5162001 > functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id ln -s configs/c.1 os_desc udevadm settle -t 5 || : ls /sys/class/udc/ > UDC ``` こちらのページを参考にさせていただきました。 > Composite USB Gadgets on the Raspberry Pi Zero > http://www.isticktoit.net/?p=1383 #### 起動時実行スクリプトの設定 一番下の `exit 0` の手前に、作成した USB デバイス(`myusbgadget`)のスクリプトを登録します。 ###### /etc/rc.local ``` /usr/bin/myusbgadget exit 0 ``` ここまで準備ができたら、いったん Raspberry Pi の電源を落とし、PC と USB ケーブルで接続します。 ### PC 側の設定変更箇所(Windows の場合) PC 側の設定は「[その1](https://hackmd.io/@yuzuafro/raspi_rndis_staticipaddr#PC-%E5%81%B4%E3%81%AE%E8%A8%AD%E5%AE%9A%E5%A4%89%E6%9B%B4%E7%AE%87%E6%89%80%EF%BC%88Windows-%E3%81%AE%E5%A0%B4%E5%90%88%EF%BC%89)」と同じなので割愛します。 RNDIS ドライバがインストールされていれば、169.254.XXX.XXX の IP アドレスが割り当てられて、Raspberry Pi との通信ができるようになります。 こちらも毎回 IP アドレスが変わってしまって使いづらいので、固定 IP アドレスの設定をしていきます。 ## 固定 IP アドレスの設定(Raspberry Pi 側) ### DHCP 設定の変更 「[その1](https://hackmd.io/@yuzuafro/raspi_rndis_staticipaddr#DHCP-%E8%A8%AD%E5%AE%9A%E3%81%AE%E5%A4%89%E6%9B%B4)」の場合と同じです。 まずは、自動割り当て IP アドレスの状態で ssh で Raspberry Pi にログインして、以下のファイルを変更します。 ###### /etc/dhcpcd.conf ``` interface usb0 static ip_address=169.254.10.10/16 static routers=169.254.0.1 static domain_name_servers=169.254.0.1 ``` これは例なので、この通りでなくてもよいです。 この例では、Raspberry Pi に 169.254.10.10 を割り当てています。 ### USB デバイス設定スクリプトの変更 USB デバイス(`myusbgadget`)作成時に、指定した IP アドレスで usb0 インターフェイスを起動する設定をします。 `/usr/bin/myusbgadget` の一番下に以下の 3 行を追加します。 ###### /usr/bin/myusbgadget ``` sleep 10 ifconfig usb0 169.254.10.10 netmask 255.255.0.0 up route add -net default gw 169.254.10.1 ``` > (sleep を入れないとうまく設定できなかったです。) 設定ができたら、Raspberry Pi を再起動します。 ## 固定 IP アドレスの設定(Windows 側) Windows 側の設定は「[その1](https://hackmd.io/@yuzuafro/raspi_rndis_staticipaddr#%E5%9B%BA%E5%AE%9A-IP-%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E3%81%AE%E8%A8%AD%E5%AE%9A%EF%BC%88Windows-%E5%81%B4%EF%BC%89)」と同じなので割愛します。 ping を実行して疎通していれば OK です。 (例)PowerShell から Raspberry Pi への ping ``` PS C:\Users\username> ping 169.254.10.10 ```