cyue 2022-11-24
使用 ubuntu 20.04/22.04 LTS 服务器版。
0.0 前言
iPadPro 的M1/M2 CPU性能很強大,但被Apple封印了。想直接利用iPadPro編程開發,目前較為有彈性的方案:
| app/方案 | 特性說明 |
|---|---|
| Code App | 一個付費的IDE開發環境,開發方式與VSCode類似(但沒有插件),可以在本地使用 Node.js、Python、C、C++、PHP 語言開發,也提供了40多個服務器端的開發語言。可連結自己的遠端sftp服務器開發。 |
| iSH | 一個居然通過了Apple審核的免費 x86 Linux模擬器。模擬了用戶模式的 Alpine Linux,可使用Alpine Linux的套件。雖然有些 x86指令未模擬,有相容性問題,底層相關的Driver不支持,但一些通用的應用可以在 iPad上開發。 |
| a-Shell | 一個iOS的原生終端,依循iOS的安全規則下,儘量提供了 unix基本的指令,並提供了clang、python等語言開發軟件。軟件是編譯成WASM在 iPad上執行。 |
| 远端服务器 | 可以有标准的编译开发平台,利用遠端强大的服务器资源开发。但输入输出性能受到网路带宽限制。VSCode提供网页前端,Code app可以用sftp连接编译服务器,但都还有一些问题,影响稳定。 此外,需要下载Code到本地目标机器时,可能不好操作,iPad的usb连线受限制,难连接开发平台。 |
iSH :開發非常接近Linux上的純文字實際體驗,要舒適的開發的話,還需要額外的整合環境app。另外,仍有許多項目不能在Alpine上開發,或遇到机器相容问题,編譯到一半出錯,令人惱火。
Code App :提供了類似VSCode的整合環境,對初學者學習語言非常友好,但要做大型項目,還缺了點意思。
a-Shell :最貼近 iPad的原生環境,但只有预置工具,不像 iSH可以下載多個套件,編譯後的 WASM非原生code,只可在a-Shell和瀏覽器環境下執行。
远端服务器 :在遠端服務器上開發雖然可以提供Linux或Windows環境開發,但開發穩定度將受限於網路環境。此外,要做MCU或需要燒錄Code的底層開發,還需要連結到本地機器,而iPad當本地機器卻難以連接MCU、燒錄code。。。。
能不能有完整的Linux開發環境,不要有太多限制和相容問題?可以做MCU、RTOS等底層開發嗎?
目前能提供的答案是 ——— 使用樹莓派4B(四核Arm64)當iPad的開發配件。透過一條 typeC連接線連接iPadPro和樹莓派4B,供電並有虚拟ethernet網路介面连接。樹莓派執行對開發友好的Ubuntu Arm64發行版,並可設置RDP服務讓iPad完全像在Ubuntu下工作。遇到需要远端服务器的大型项目,透过树莓派Linux提供的GUI和工具,也比重新在iPad上学(可能跛脚的)工具更容易。
0.1 希望的系统连线架构如下:

- 1 树莓派4透过 typeC连接线连接iPad,取得工作电源,并能透过USB虚拟网卡dwc2协议与iPad高速连线。 树莓派提供固定网址与dnsmasq服务,iPad可以不做设定,使用固定IP连树莓派工作。 可以透过 ssh 文字界面或 RDP 图形桌面连接树莓派。
- 2 树莓派和iPad各自透过Wifi与区域网路的路由器连接。树莓派需要网路资源时,可以使用Wifi取得。
- 3 更换不同的Wifi位置时,iPad可以ssh到树莓派,并通过设置 netplan来设定树莓派的Wifi连线。 其他PC也可以通过Wifi与树莓派连接。
- 4 若要长时间使用,需要提供iPad电源。可透过妙控键盘的电源或带电源的USB Hub供电。
- 5 在树莓派已经设定好Wifi的常用环境,iPad也可以使用Wifi连接树莓派工作,不必连着线,有更高的灵活性。当然,此时树莓派需要自己连接typeC电源。
0.2 需要的材料
一台樹莓派4B:配置4G到8G的RAM。
一個高速U盤或TF卡:用於樹莓派安裝軟件,建議128G以上。在此推薦Samsung Fit+,USB3.1介面,功耗低,性能優良。
一條 typeC連接線:不能有電源辨識晶片,樹莓派4B會辨認錯誤,無法聯網。
一個目前可用的Wifi網路環境:樹莓派在設置時,需要下載各種套件。iPadPro目前不能設置typeC當橋接網路,共享網路資源給樹莓派,樹莓派需要自己聯網。
一台PC或Mac或Linux機器:燒錄U盤或SD卡,並設置typeC和wifi網路連接。TF卡需要有相容PC的讀卡器。
PC軟件:
- Raspberry Pi Imager,可到樹莓派官網下載,
- 文字編輯器:修改boot image的軟件。
iPad軟件:
- a-Shell 或 iSH:文字模式app,連接樹莓派時需要的 ssh應用。當然其他 Terminal也可以。
- Microsoft 遠端桌面 app:微软免费的圖形化登入远端桌面的工具,當然,使用純文字開發的極客就不需要了。
1 PC/Mac/Linux上用树莓派镜像烧录器烧录
设定基本信息后,把ubuntu server 22.04 LTS 烧录到 SD/USB盘。
新版的树莓派4B应该可以直接使用高速U盘启动了。旧版的树莓派4B要用SD卡来更新 UEFI firmware(参考git),启动USB Boot。
自己下载ubuntu image 烧录比使用烧录器下载靠谱多了。
1.1 下载树莓派的 ubuntu 22.04 server image:

1.2 烧录前image的boot系统设置
下载完成后 imager选择 “使用自定义镜像” 烧录刚刚下载的image。烧录前可以点右下角设置按钮设置:
主要设定目的是允许 ssh登入,附带可以设定主机名和账户/密码(密码将被擾码)、系统时间、区域等基本信息。
网路的Wifi可以在此设置,密码也会被扰码。但我会在第二节再手动处理网路,以挂载多个 Acces Point,并添加usb0网卡。

1.3 镜像烧录到高速SD 卡 或 U盘。
推荐使用 SAMSUNG FIT+ USB3.1 U盘(128G/256G)当开机盘,小巧-高速-冷静-省电,价格也很香。

2 烧录后的 image手动设置
主要是处理boot磁盘(FAT格式)下的config.txt、cmdline.txt、network-config 3个文件。image烧录完成后,挂载到PC环境下编辑。
2.1 编辑 config.txt 并添加一行:
dtoverlay=dwc2,dr_mode=peripheral
2.2 编辑在 cmdline.txt 在 rootwait 之后添加项:
modules-load=dwc2,g_ether
如前所述,添加在 rootwait 之后,与前后项间隔各只有一个空格。
2.3 调整你的 network-config
⚠️注意:ymal格式,系统只做一次,内容会复制到
/etc/netplan/50-cloud-init.yaml。发生错误的话需要修改netplan的文件。之后再呼叫sudo netplan apply更正。renderer 先remark掉吧。。。NetworkManager似乎没图形会hang住。等X11/RDP完成再处理。。。
network: version: 2 # renderer: NetworkManager ethernets: eth0: dhcp4: true optional: true usb0: dhcp4: false optional: true addresses: [10.55.0.1/29] wifis: wlan0: dhcp4: true dhcp6: false optional: true access-points: "AP0": password: "PASSWORD0" "AP1": password: "PASSWORD1" "cyueXsMax": password: "PASSWORD2" "AsusCyue_2G4": password: "PASSWORD3"
2.4 另外可查看 user-data (或可微调)
烧录器的设定,除了网路,主要是在这里设置:
#cloud-config
hostname: rpi4
manage_etc_hosts: true
packages:
- avahi-daemon
apt:
conf: |
Acquire {
Check-Date "false";
};
users:
- name: cyue
groups: users,adm,dialout,audio,netdev,video,plugdev,cdrom,games,input,gpio,spi,i2c,render,sudo
shell: /bin/bash
lock_passwd: false
passwd: $5$_NOTREALPASSWORDKEYS_glQ6jJeOaPF/uXkVT8Z6Pj.5NhSbnRC4S0
ssh_pwauth: true
timezone: Asia/Taipei
runcmd:
- sed -i 's/^s*REGDOMAIN=S*/REGDOMAIN=TW/' /etc/default/crda || true
- localectl set-x11-keymap "us" pc105
- setupcon -k --force || true
3. 基本网路ssh设置
在MacBook上设置较方便。。。
3.1 尝试直接 typeC usb 网路连线。。。
我用2015 MacBookPro,使用typeC – typeA连线给树莓派上电。上电后等待绿灯不太闪烁时,查看 设定 – 网路,找到了 RNDIS/Ethernet Gadget 。。。网路枚举也成功。
先把MacBook的RNDIS 的 IPv4设成手动设置,IP:10.55.0.2,MASK:255.255.255.248。

等一会,mac的terminal下使用ifconfig 查看typeC网卡是否成功:
$ ifconfig | grep 'inet ' 3: inet 127.0.0.1 netmask 0xff000000 13: inet 192.168.1.118 netmask 0xffffff00 broadcast 192.168.1.255 91: inet 10.55.0.2 netmask 0xfffffff8 broadcast 10.55.0.7
嗯,网卡似乎被枚举成功了。
尝试 ssh:
但。。。 ssh cyue@10.55.0.1 失败。。。😥
改 planB,尝试wifi连线。。。
3.2 PlanB,透过Wifi暴力查IP登入机器
使用跨平台的 Angry IP Scanner,只看有连上的机器,看能不能找到 rpi4.local 。。。

找到了。。。来ssh看看。。。
ssh cyue@rpi4.local
登入信息看得到已经有 usb0网路了,只是还没工作。。。。
$ ssh cyue@rpi4.local
The authenticity of host 'rpi4.local (fe80::dea6:32ff:fe26:9b7e%en0)' can't be established.
ED25519 key fingerprint is SHA256:9cbPD3V/2nNspc1YC/DfFtqrdHCqi5E/5xmEXDaV4R4.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'rpi4.local' (ED25519) to the list of known hosts.
cyue@rpi4.local's password:
Welcome to Ubuntu 22.04.1 LTS (GNU/Linux 5.15.0-1012-raspi aarch64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Fri Nov 25 11:03:46 CST 2022
System load: 1.7197265625 Processes: 157
Usage of /: 1.2% of 235.00GB Users logged in: 0
Memory usage: 11% IPv4 address for usb0: 10.55.0.1
Swap usage: 0% IPv4 address for wlan0: 192.168.1.189
Temperature: 56.0 C
85 updates can be applied immediately.
35 of these updates are standard security updates.
To see these additional updates run: apt list --upgradable
*** System restart required ***
The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.
To run a command as administrator (user "root"), use "sudo <command>".
See "man sudo_root" for details.
cyue@rpi4:~$
PlanB 的 ssh 登入成功!!
从Wifi登入信息,看得到已经有 usb0网路了,但此时 usb网路仍不通。。。。。
有信息:* System restart required * ==> reboot 后再登入usb看看?
。
。
。
?居!然?!可!以!了!。。。撒花庆祝🎉。。。不用 PlanC 了 !!
此时,iPad或其他支持USB RNDIS 网卡的,可以手动设定IP登入树莓派了。
想要自动登录?。。。。树莓派对usb0网卡要提供dnsmasq服务。。。
3.3 安装、设定 dnsmasq。
设定 dnsmasq,可以让树莓派在usb0提供dhcp服务,让不同的iPad、PC能在typeC连线时自动取得IP地址,方便连线使用:
# 安装dnsmasq
sudo apt install dnsmasq -y
mkdir -p /etc/dnsmasq.d
# 设定usb0连线上的dhcp服务
echo "interface=usb0
dhcp-range=10.55.0.3,10.55.0.6,255.255.255.248,1h
dhcp-option=3
leasefile-ro
port=0" |sudo tee /etc/dnsmasq.d/usb
# 会冲突,取消注释 /etc/default/dnsmasq 的 `DNSMASQ_EXCEPT`
sudo sed -i 's/#DNSMASQ_EXCEPT="lo"/DNSMASQ_EXCEPT="lo"/g' /etc/default/dnsmasq
# 重启 dnsmasq 并查看服务,没有奇怪颜色就成功了。。。
sudo service dnsmasq restart
sudo service dnsmasq status
将 10.55.0.3 ~10.55.0.6 交给dnsmasq的 DHCP服务管理。
由于端口53会与其他服务冲突,会需要设置 DNSMASQ_EXCEPT=”lo”,再重启 dnsmasq 服务。
参考 DNSMASQ_EXCEPT 问题处理解释: https://askubuntu.com/questions/818205/ …
之后的 typeC网路连线可以自动连接,不必手动设IP和Mask了。。。
3.4 设置ssh免密登入(可选)
ssh-keygen 为用户添加 ssh 的密钥对。预设密钥放在~/.ssh/。
ssh-keygen
在 iPad的iSH或mac上,也可以使用 ssh-keygen 生成自己的 id_rsa 密钥对。透过 ssh-copy-id 将公钥提供给树莓派,这样就可以免密登入树莓派了。
ssh-copy-id -i ~/.ssh/id_rsa.pub cyue@rpi4.local
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: ".ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
cyue@rpi4.local's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'cyue@rpi4.local'"
and check to make sure that only the key(s) you wanted were added.
之后ssh到树莓派,直接命令带密钥key,就可以免密登入。
3.5 更新系统源(可选国内源置换)、安装简单网路工具
sudo cp /etc/apt/sources.list /etc/apt/sources.list.org
sudo sed -i 's/ports.ubuntu.com/mirrors.ustc.edu.cn/g' /etc/apt/sources.list
sudo apt -y update
sudo apt -y upgrade
sudo apt -y install net-tools # 安装网路工具
4 安装 XRDP 远端桌面服务
虽然 VSCode 提供远端编译服务,透过浏览器就可以工作,但是,还是没有本地作业好用。。。我们直接把桌面图像引入 iPad即可像本地一样的工作。可选用免费的VNC或RDP协议。
4.0 RDP or VNC?参考比较表:
| VNC | RDP | |
|---|---|---|
| BIOS屏幕显示 | 能 | 不能 |
| 全彩支持 | 能 | 能 |
| 更改分辨率 | 能 | 能 |
| 多显示器 | 只有一个屏幕 | 多显示器支持 |
| 图像传输 | 图像传输 | 图像和图形传输 |
| 视频播放支持 | 不能 | GPU加速支持 |
| 音频传输 | 不能 | 双向语音可以控制 |
| 鼠标控制 | 服务器端控制 | 服务器端控制 |
| USB传输 | 不能 | USB可以通过网络传输 |
似乎RDP比较好?那么,继续吧。。。
4.1 最小化安装设定ubuntu桌面与 xRDP服务
安装
ssh进入树莓派,执行:
# 1. 安装最小桌面环境与 xrdp
sudo apt install -y ubuntu-desktop-minimal xrdp
# 2. 解决RDP登录时反复验证问题
echo "[Allow Wifi Scan]
Identity=unix-user:*
Action=org.freedesktop.NetworkManager.wifi.scan;org.freedesktop.NetworkManager.enable-disable-wifi;org.freedesktop.NetworkManager.settings.modify.own;org.freedesktop.NetworkManager.settings.modify.system;org.freedesktop.NetworkManager.network-control
ResultAny=yes
ResultInactive=yes
ResultActive=yes" | sudo tee /etc/polkit-1/localauthority/50-local.d/47-allow-wifiscan.pkla
# 3. 解决“色彩管理设备” / “color managed device” 弹窗
echo "[Allow Colord all Users]
Identity=unix-user:*
Action=org.freedesktop.color-manager.create-device;org.freedesktop.color-manager.create-profile;org.freedesktop.color-manager.delete-device;org.freedesktop.color-manager.delete-profile;org.freedesktop.color-manager.modify-device;org.freedesktop.color-manager.modify-profile
ResultAny=no
ResultInactive=no
ResultActive=yes" | sudo tee /etc/polkit-1/localauthority/50-local.d/45-allow-colord.pkla
# 解决“刷新系统软件源需要认证” / “refresh the system repositories” 弹窗
echo "[Allow Refresh Repository all Users]
Identity=unix-user:*
Action=org.freedesktop.packagekit.system-sources-refresh
ResultAny=no
ResultInactive=no
ResultActive=yes" | sudo tee /etc/polkit-1/localauthority/50-local.d/46-allow-packagekit.pkla
# 重启RDP服务
sudo systemctl restart xrdp
⚠️注意:要使用最新的apt源,避免已知的连线问题。
安装后系统可能要求重启,若修改后长时间黑屏也试试看重启。。。
sudo reboot
4.2 图形化网路设置:为netplan添加 NetworkManager renderer
有X11/XRDP后,可以在图形界面下设置网路系统
sudo pico /etc/netplan/50-cloud-init.yaml
在 network: 下添加一行(或在Wifi 前?):
renderer: NetworkManager
应用设定:
sudo netplan apply
GUI右上方就可以控制网路设定了。
4.3 NetManager 的 Ovpn 支持。。。
有了NetManager,就可以安装 openvpn、network mamager、和 gnome 的 gui:
sudo apt install -y openvpn network-manager-openvpn network-manager-openvpn-gnome
安装好后,网路的设定页的 VPN项目,就可以添加 OVPN设定文件,加入OpevVPN服务器了。

老路由的OpenVPN安全等级较低,假设文件 tw-rpi4.ovpn指定的服务器,在安装后打不开VPN,可以编辑文件设定tls安全等级:
sudo pico /etc/NetworkManager/system-connections/tw-rpi4.nmconnection在
[vpn]段的 ca=…. 下添加一行,依据服务器/路由器能力设定安全等级(SECLEVEL)值 0~5:tls-cipher=DEFAULT:@SECLEVEL=0设成0级,然后重启网路服务:
sudo systemctl restart NetworkManager此时 就能打开OpenVPN工作了。
新的Ovpn服务器就没这个问题。。。
4.4 有RDP声音回传需求?
参考: xRDP – Explaining Sound Redirection issue in Ubuntu 22.04
还没尝试。
5 浏览器安装
Chromium 或 Firefox?
sudo snap install chromium
6 编程工具
6.1 安装 VsCode
使用RDP,就直接采用 linux版的 VSCode 当开发工具好了。官网 https://code.visualstudio.com/
https://code.visualstudio.com/Download 找arm64的deb下载包。
# 目前是 1.73.1 版
wget https://az764295.vo.msecnd.net/stable/6261075646f055b99068d3688932416f2346dd3b/code_1.73.1-1667966450_arm64.deb
# 安装
sudo dpkg -i code_1.73.1-1667966450_arm64.deb
安装后可以从桌面 Activities下找到 应用执行。可长按icon,选 pin to dash,保留icon在 dashboard上。

iPad上可以用屏幕手势全屏应用,开始Vscode之旅。。。

Vscode的一些设定参考:
6.2 安装常用語言编译/解译器
sudo apt install -y clang gcc cmake python3 python3-tk python3-pip thonny
Thonny是很好的教学用 Python。可以Trace变量行为。

8 iPad 连线
8.1 查看typeC网路连线
树莓派关机后,使用 typeC 线连接 iPad Pro (iPadOs 14.01) 上,启动树莓派后,在设定看到一个以太网适配器:“RNDIS/Ethernet Gadget”,并且本地 IP 已经经由 树莓派提供(可能为 10.55.0.4),子网掩码为 255.255.255.248。

8.2 使用 a-Shell 透过 usb0 直连 ubuntu终端
此时已可以使用 a-Shell 或 iSH或其他 terminal工具 ssh 连接树莓派:ssh cyue@10.55.0.1。

从 ifconfig 看到 有 usb0 和 wlan0 两张网卡有inet网路连接,usb0 是type-c 连接 iPad,wlan0是wifi连外网路。
树莓派4启动时的工作瞬间电流可能会很高,使用typeC直接供电时,或许需要关闭冷却风扇。在有高性能需求时,建议使用带供电的USB HUB对iPad和树莓派供电,并隔离大电流。
8.3 使用 RDP连接树莓派的ubuntu
typeC连线无误,可以透过typeC直接RDP连接,不透过Wi-Fi。
添加编辑一个树莓派服务器, IP:10.55.0.1、账户、密码,自定名称:typeC-rpi4:

即可连接。。。

。。。未完成。。。