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'"
結局ネットワーク設定をしなきゃならんので udev
の RUN+=
に書くのをやめて /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