mattintosh note

どこかのエンジニアモドキの備忘録

Raspberry Pi Zero を OTG で繋いでセットアップ

Raspberry Pi Zero を USB で繋いでディスプレイやキーボード無しでうんちゃらかんちゃらとかやったことなかったので。Bonjour というか avahi-daemon は使わない。

microSD/dev/sdb にあるものとする。とりあえず Raspbian のイメージを microSD に書き込んだところから。

boot パーティションのマウント。

$ sudo mount /dev/sdb1 /mnt

OTG を有効にする。なんかネットを見て回ると「rootwait の後ろに modules-load=dwc2,g_ether を入れる」とあるけど、別に最後でもいいんだよねこれ。

$ sudo sed -i'' 's/$/ modules-load=dwc2,g_ether/' /mnt/cmdline.txt

dtoverlay=dwc2 を追加する。

$ sudo tee -a /mnt/config.txt <<!

dtoverlay=dwc2
!

boot パーティションをアンマウント。

$ sudo umount /mnt

次に root パーティション

$ sudo mount /dev/sdb2 /mnt

最近だと IP アドレスの固定には /etc/dhcpcd.conf を使っているのでそっちに追記。Raspberry Pi Zero の IP アドレスを 10.0.0.2/24 にする。 母艦の PC を 10.0.0.1 にする。

$ sudo tee -a /mnt/etc/dhcpcd.conf <<!

interface usb0
static ip_address=10.0.0.2/24
static routers=10.0.0.1
static domain_name_servers=8.8.8.8 8.8.4.4
!

あと、最近になってから(?)sshd が自動で起動しないようになっているので systemctl enable ssh を手動でやる。

$ sudo ln -s /lib/systemd/system/ssh.service /mnt/etc/systemd/system/multi-user.target.wants/ssh.service

パーティションをアンマウントして microSD を取り外す。

$ sudo umount /mnt
$ sudo eject /dev/sdb

次に母艦の方。

インターフェイス名は使っている OS によって違うと思う。

IP アドレスを追加する。Raspberry Pi Zero を再起動する度にインターフェイスが消えるので udev に設定しておいた方が良さそう。

$ sudo ip a add 10.0.0.1/24 dev enp0s29u1u2

ルーティングとパケット転送の設定。

$ sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
$ sudo sysctl -w net.ipv4.ip_forward=1

で、母艦から SSH で接続すればよい。

$ ssh pi@10.0.0.2

母艦の PulseAudio で再生するようにしておけば母艦の負荷を上げずに YouTube の BGM なんかを再生しておける。

$ PULSE_SERVER=10.0.0.1 mpv --no-video 'https://www.youtube.com/watch?v=lt_c5RK4Cyg'

Kubuntu 17.04 に udevinfo がない。udevadm trigger -v で正しいかわからんが。

$ udevadm info -a `udevadm trigger -n -v -a idVendor=0525`

Udevadm info starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.1':
    KERNEL=="2-1.1"
    SUBSYSTEM=="usb"
    DRIVER=="usb"
    ATTR{authorized}=="1"
    ATTR{avoid_reset_quirk}=="0"
    ATTR{bConfigurationValue}=="1"
    ATTR{bDeviceClass}=="02"
    ATTR{bDeviceProtocol}=="00"
    ATTR{bDeviceSubClass}=="00"
    ATTR{bMaxPacketSize0}=="64"
    ATTR{bMaxPower}=="2mA"
    ATTR{bNumConfigurations}=="2"
    ATTR{bNumInterfaces}==" 2"
    ATTR{bcdDevice}=="0409"
    ATTR{bmAttributes}=="c0"
    ATTR{busnum}=="2"
    ATTR{configuration}==""
    ATTR{devnum}=="10"
    ATTR{devpath}=="1.1"
    ATTR{idProduct}=="a4a2"
    ATTR{idVendor}=="0525"
    ATTR{ltm_capable}=="no"
    ATTR{manufacturer}=="Linux 4.9.28+ with 20980000.usb"
    ATTR{maxchild}=="0"
    ATTR{product}=="RNDIS/Ethernet Gadget"
    ATTR{quirks}=="0x0"
    ATTR{removable}=="removable"
    ATTR{speed}=="480"
    ATTR{urbnum}=="313"
    ATTR{version}==" 2.00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1':
    KERNELS=="2-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceProtocol}=="01"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0000"
    ATTRS{bmAttributes}=="e0"
    ATTRS{busnum}=="2"
    ATTRS{configuration}==""
    ATTRS{devnum}=="2"
    ATTRS{devpath}=="1"
    ATTRS{idProduct}=="0024"
    ATTRS{idVendor}=="8087"
    ATTRS{ltm_capable}=="no"
    ATTRS{maxchild}=="8"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="fixed"
    ATTRS{speed}=="480"
    ATTRS{urbnum}=="233"
    ATTRS{version}==" 2.00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2':
    KERNELS=="usb2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{authorized}=="1"
    ATTRS{authorized_default}=="1"
    ATTRS{avoid_reset_quirk}=="0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bMaxPower}=="0mA"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bNumInterfaces}==" 1"
    ATTRS{bcdDevice}=="0410"
    ATTRS{bmAttributes}=="e0"
    ATTRS{busnum}=="2"
    ATTRS{configuration}==""
    ATTRS{devnum}=="1"
    ATTRS{devpath}=="0"
    ATTRS{idProduct}=="0002"
    ATTRS{idVendor}=="1d6b"
    ATTRS{interface_authorized_default}=="1"
    ATTRS{ltm_capable}=="no"
    ATTRS{manufacturer}=="Linux 4.10.0-24-generic ehci_hcd"
    ATTRS{maxchild}=="3"
    ATTRS{product}=="EHCI Host Controller"
    ATTRS{quirks}=="0x0"
    ATTRS{removable}=="unknown"
    ATTRS{serial}=="0000:00:1d.0"
    ATTRS{speed}=="480"
    ATTRS{urbnum}=="102"
    ATTRS{version}==" 2.00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0':
    KERNELS=="0000:00:1d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="ehci-pci"
    ATTRS{broken_parity_status}=="0"
    ATTRS{class}=="0x0c0320"
    ATTRS{companion}==""
    ATTRS{consistent_dma_mask_bits}=="32"
    ATTRS{d3cold_allowed}=="1"
    ATTRS{device}=="0x1c26"
    ATTRS{dma_mask_bits}=="32"
    ATTRS{driver_override}=="(null)"
    ATTRS{enable}=="1"
    ATTRS{irq}=="23"
    ATTRS{local_cpulist}=="0-3"
    ATTRS{local_cpus}=="000f"
    ATTRS{msi_bus}=="1"
    ATTRS{numa_node}=="-1"
    ATTRS{revision}=="0x04"
    ATTRS{subsystem_device}=="0x8338"
    ATTRS{subsystem_vendor}=="0x10f7"
    ATTRS{uframe_periodic_max}=="100"
    ATTRS{vendor}=="0x8086"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""

/etc/udev/rules.d/99-rpi-zero.rules を作成。久しぶりにいじったら RUN+= の中のコマンドをフルパスで書くのをすっかり忘れていた。IP アドレスは ip コマンドじゃ早すぎて追加できないので /etc/network/interfaces だな。

ACTION=="add", SUBSYSTEM=="usb", ATTR{idProduct}=="a4a2", ATTR{idVendor}=="0525", SYMLINK+="myzero", RUN+="/bin/sh -c 'iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE; sysctl -w net.ipv4.ip_forward=1'"

結局ネットワーク設定をしなきゃならんので udevRUN+= に書くのをやめて /etc/network/interfaces に書いた。

なんか address がうまく効かないので ip コマンドで付けた。

auto usb0
iface usb0 inet static
        address 10.0.0.1/24
        post-up   /sbin/ip a add 10.0.0.1/24 dev usb0
        post-up   /sbin/iptables -t nat -A POSTROUTING -s 10/24 -j MASQUERADE
        post-up   /sbin/sysctl -w net.ipv4.ip_forward=1
        post-down /sbin/sysctl -w net.ipv4.ip_forward=0
        post-down /sbin/iptables -t nat -D POSTROUTING -s 10/24 -j MASQUERADE