树莓派,iPad最佳DevOps配件

虽然Macbook现在已经非常轻便了,然而iPad显然比Macbook更加优雅。我的大部分工作现在都能在iPad上完成了,然而还有很大一部分代码相关的工作不能在iPad上完成。尤其是有些时候需要测试简单的代码,iPad基本不能为力。

树莓派,iPad最佳DevOps配件

虽然Macbook现在已经非常轻便了,然而iPad显然比Macbook更加优雅。我的大部分工作现在都能在iPad上完成了,然而还有很大一部分代码相关的工作不能在iPad上完成。尤其是有些时候需要测试简单的代码,iPad基本不能为力。
之前,iPad上有一款App,iSH(https://ish.app),通过JIT模拟x86指令来实现Linux访问,然而,由于iPad本身CPU不支持硬件虚拟化,只能通过JIT的形式转译,一方面访问速度受到了极大的限制,另一方面很多软件并不能正常运行,基本上只能拿来当做一个简单的SSH客户端。
拥有一个完整的Linux Shell对iPad的Dev能力扩展至关重要。这次疫情在酒店隔离,突然想到能够利用树莓派做一个随身的Linux Shell环境,甚至还能通过VNC还能拓展成一个简单易用的vscode编程环境,于是便淘宝了4GB的树莓派尝试一番。

VNC连接树莓派

配件选购

首先树莓派选择的是四代B型。这是因为,四代的树莓派是支持低电压模式,意味着能够直接从笔记本或者从iPad Pro的Type-C接口上进行供电。这一点至关重要,从iPad进行供电意味着随时随地都能使用树莓派。另外,这根Type-C数据线除了供电意外,还充当了数据接口,配置完成以后,插上USB便能够SSH/VNC登入树莓派。
Type-C数据线我直接使用我的三星SSD移动硬盘的数据线。注意一定要买带数据和充电功能的Type-C数据线,否则将无法连通树莓派。
对于iPad来说,我使用的是iPad Pro。并没有在Air上测试。毕竟iPad的供电并不高,实际上,iPad Pro来说也不能让树莓派满血状态上使用。选择供电效率更高的设备,对驱动树莓派有一定的优势。

配置需求

  1. 树莓派四代
  2. SD卡
  3. Type-C数据电源线
  4. SD卡读卡器
  5. 笔记本和iPad(很不幸,iPad不能烧录数据卡,这一步必须在笔记本上完成)
  6. WiFi或者手机热点(仅仅用于首次配置)

配置过程

首先下载官方的树莓派镜像,这里推荐官方的Desktop Lite版本。Lite版本包含了最基础的桌面,必要的服务器,同时也去掉了不必要的第三方软件(任何第三方软件都可以之后自行安装)。通过官方的镜像烧录工具,可以快速简单的将树莓派镜像烧录到SD卡中。等待烧录完毕后,拔出SD卡,并重新插回电脑,此时可以看到插入的SD卡有一个可访问的boot分区。

配置远程访问

第一步,我们配置SSH访问以便我们登入系统。

开启SSH

进入到boot分区后,使用命令touch sshboot文件夹中创建一个名为ssh的文件。当树莓派系统识别到该文件后,能够自动启动SSH服务器。

配置WiFi连接

boot文件夹下,新建一个wpa_supplicant.conf文件。并且在该文件写入以下内容:

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=<Insert 2 letter ISO 3166-1 country code here>

network={
 ssid="<Name of your wireless LAN>"
 psk="<Password for your wireless LAN>"
}

将Country换成对应的两位国家代码,例如CN,SG,US等。SSID则填入WiFi名称,PSK处填入WIFI密码。

启动并SSH访问树莓派

此时,启动并且稍作等待,树莓派将自动连上WiFi。通过查看路由器的DHCP分配界面即可获得树莓派的IP地址。
我在酒店的时候,使用的是公共WiFi,无法访问路由控制界面,因此我直接使用了iPhone的热点共享。当然热点共享同样无法获知IP,好在一般来说DHCP的分配区间不会太大,通过笔记本上的IP和子网掩码,凑几次就能凑出树莓派分配到的IP地址。
树莓派默认的SSH账户密码:

账户:pi
密码:raspberry

配置USB-C连接

  • /boot/config.txt末尾写入dtoverlay=dwc2
  • /boot/cmdline.txt末尾写入modules-load=dwc2
  • /etc/modules末尾写入libcomposite
  • /etc/dhcpcd.conf 末尾写入denyinterfaces usb0
  • 安装dnsmasq,sudo apt-get install dnsmasq
  • 创建/etc/dnsmasq.d/usb,并写入
  • 创建/etc/network/interfaces.d/usb0,并写入
  • 创建/root/usb.sh,并写入
  • /root/usb.sh 设置为可执行,chmod +x /root/usb.sh
  • /etc/rc.local文件的exit 0之前添加/root/usb.sh
  • 重新启动树莓派
interface=usb0
dhcp-range=10.55.0.2,10.55.0.6,255.255.255.248,1h
dhcp-option=3
leasefile-ro
auto usb0
allow-hotplug usb0
iface usb0 inet static
  address 10.55.0.1
  netmask 255.255.255.248
#!/bin/bash
cd /sys/kernel/config/usb_gadget/
mkdir -p pi4
cd pi4
echo 0x1d6b > idVendor # Linux Foundation
echo 0x0104 > idProduct # Multifunction Composite Gadget
echo 0x0100 > bcdDevice # v1.0.0
echo 0x0200 > bcdUSB # USB2
echo 0xEF > bDeviceClass
echo 0x02 > bDeviceSubClass
echo 0x01 > bDeviceProtocol
mkdir -p strings/0x409
echo "fedcba9876543211" > strings/0x409/serialnumber
echo "Ben Hardill" > strings/0x409/manufacturer
echo "PI4 USB Device" > strings/0x409/product
mkdir -p configs/c.1/strings/0x409
echo "Config 1: ECM network" > configs/c.1/strings/0x409/configuration
echo 250 > configs/c.1/MaxPower
# Add functions here
# see gadget configurations below
# End functions
mkdir -p functions/ecm.usb0
HOST="00:dc:c8:f7:75:14" # "HostPC"
SELF="00:dd:dc:eb:6d:a1" # "BadUSB"
echo $HOST > functions/ecm.usb0/host_addr
echo $SELF > functions/ecm.usb0/dev_addr
ln -s functions/ecm.usb0 configs/c.1/
udevadm settle -t 5 || :
ls /sys/class/udc > UDC
ifup usb0
service dnsmasq restart

配置iPad

此时树莓派已经能通过USB启动,并且通过USB进行SSH通信。将树莓派通过Type-C线插入iPad,树莓派将会自动启动。稍等一会后,在iPad设置中会出现一个新的名为PI4 USB Device的设备,并且能看到分配的IP地址。此时树莓派已经属于可连接状态。
使用任何一个SSH客户端(推荐使用Blink,一个简洁好用的SSH客户端),连接

ssh pi@10.55.0.1

即可连入树莓派。
通过

sudo raspi-config

即可配置树莓派。选择配置Interface Options,可将VNC服务器设置为默认开启。开启VNC以后,重启树莓派,在iPad上下载RealVNC即可连入树莓派。

最后的一些问题

虽然我们可以通过USB直连树莓派,然而,网络并不能同享。这里可以通过VNC登入树莓派后,手动配置树莓派的WiFi实现树莓派的网络访问。
另外则是文件共享的问题。这里推荐ShellFish这个App,通过它,能够将SFTP分区挂载到iPad的文件App下,实现iPad无缝访问树莓派上的文件。另外多款iPad的代码编辑软件均支持ShellFish。