在iPhone/iPad執行Linux系統的虛擬機,跑Docker。
緣由:解決 iSH Shell過於老舊的問題。iSH Shell模擬的是32位元(i386)的Alpine Linux系統,然而32位元很多套件都無法安裝,還有一堆Bad System Call的bug,不利於跑Docker容器,所以改用UTM跑64位元Linux虛擬機解決這個問題。
我依然選用Alpine Linux,本身就是一個輕量的發行版,最低只要128MB RAM就能安裝,開機速度很快,安裝速度也很快。雖然UTM虛擬機啟動時間比iSH Shell要多上幾分鐘,但是環境相對完整,起碼QEMU對x86指令的支援度要比iSH Shell好多了。UTM執行指令的回應速度約5秒,所以是足夠跑一些純文字工具的,例如ffmpeg、ImageMagick、完整的Python-pip環境,寫寫小程式,當然還有Docker。
其實不一定要跑Alpine啦!如果裝置RAM有4GB以上且啟用JIT,那麼跑Ubuntu Server也是可行的。
影片安裝過程參考:
1. 建立Alpine Linux UTM虛擬機#
到 Alpine Linux官網下載x86_64或aarch64架構的映像檔,選取standard版本
安裝UTM APP,新增Linux虛擬機。RAM至少512MB,儲存空間至少8GB,CPU至少分配2核心,並啟用強制多核心模式。
可以的話順便給UTM啟用JIT,虛擬機執行速度會快很多。不方便的話也沒關係,用UTM SE跑Alpine Linux勉強能行。
將虛擬機開機,參考 Alpine Linux安裝教學,執行
seupt-alpine
指令稿,完成系統安裝。通常執行這個指令稿安裝十分鐘就能完成。為節省資源可以不安裝圖形界面,開機後會直接進入tty。
2. 安裝Docker#
- 登入一般使用者帳號,即可在Alpine Linux安裝Docker:
sudo apk add docker docker-cli-compose
sudo addgroup $USER docker
sudo rc-update add docker
sudo rc-service docker start
- 如果docker pull指令出現
No route to host
錯誤,嘗試設定DNS伺服器:
echo "nameserver 8.8.8.8" | sudo tee -a /etc/resolv.conf
3. 外部SSH連線到UTM虛擬機#
假設你覺得UTM的tty畫面太醜,那就用iSH Shell的ssh登入Alpine Linux虛擬機操作,還能用scp指令傳輸檔案。
UTM虛擬機預設網路無法從外部存取。編輯Alpine Linux虛擬機網路設定,新增通訊埠轉送,把虛擬機內部的22通訊埠導向localhost的2022通訊埠,這樣虛擬機的SSH服務才能從外部連線。若果Docker服務有用到通訊埠也請一併開啟。
將虛擬機開機,在Alpine Linux虛擬機安裝SSH套件:
sudo apk add openssh
sudo rc-update add sshd
sudo rc-service sshd start
開啟iSH Shell APP。注意UTM放在後台容易被iOS系統中止。如果是iPad的話使用「滑動置前」或「幕前調度」開啟iSH Shell視窗即可保證兩個APP不會被系統中止。
在iSH Shell的視窗,輸入
ssh user@localhost -p 2022
指令登入,就能用iSH Shell管理UTM虛擬機內的服務。你也可以在電腦用SSH客戶端,遠端登入UTM虛擬機:
ssh user@iOS裝置的IP -p 2022
4. iOS與UTM虛擬機共享資料夾#
此處介紹scp與VirtFS兩種共享資料夾方法。
SCP#
- 在iSH Shell使用scp指令傳輸,例如將虛擬機內的
/home/user/Downloads/file.txt
,傳送到iSH Shell的/root
目錄
scp -P 2022 -r user@localhost:/home/user/Downloads/file.txt /root
- 同樣的,iSH Shell也能傳送檔案到虛擬機內部:
scp -P 2022 -r /root/file.txt user@localhost:/home/user/Downloads/
- 若要將iSH Shell收到的檔案搬移到其他APP,開啟「檔案APP」,找到iSH Shell的
/root
目錄就能看到檔案了。
VirtFS#
UTM的VirtFS為VirtIO-9P,不是VirtIO-FS。
9Pfs大多數Linux發行版都有支援。
編輯UTM虛擬機,到共享資料夾啟用VirtFS (9Pfs),掛載iOS的「下載」資料夾給虛擬機存取。
然後在虛擬機內執行指令,掛載iOS的共享資料夾到
/mnt
:
sudo mount share -t 9p /mnt
- 如此一來兩邊的檔案就會互通了。
5. 虛擬機GPU加速#
GPU直通不可行。
Linux虛擬機請善用 UTM的virtio-gpu半虛擬化技術,增強虛擬機的圖形效能。