內容目錄

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-ShelliSH:文字模式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:

https://cdimage.ubuntu.com/releases/22.04.1/release/ubuntu-22.04.1-preinstalled-server-arm64+raspi.img.xz

1.2 烧录前image的boot系统设置

下载完成后 imager选择 “使用自定义镜像” 烧录刚刚下载的image。烧录前可以点右下角设置按钮设置:

主要设定目的是允许 ssh登入,附带可以设定主机名账户/密码(密码将被擾码)、系统时间区域等基本信息。

网路的Wifi可以在此设置,密码也会被扰码。但我会在第二节再手动处理网路,以挂载多个 Acces Point,并添加usb0网卡。

1.3 镜像烧录到高速SD 卡 或 U盘。

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

(图片源自官网 https://www.samsung.com/cn/memory-storage/usb-flash-drive/usb-3-1-flash-drive-fit-256gb-black-muf-256ab-cn/)

2 烧录后的 image手动设置

主要是处理boot磁盘(FAT格式)下的config.txtcmdline.txtnetwork-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?参考比较表:

VNCRDP
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的一些设定参考:

https://code.visualstudio.com/docs/setup/setup-overview

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:

即可连接。。。

。。。未完成。。。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *