在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啦!如果iOS裝置RAM有4GB以上,那麼跑Ubuntu Server也是可行的。
1. 建立Alpine Linux UTM虛擬機#
到 Alpine Linux官網下載x86_64或aarch64架構的映像檔,選取standard版本
安裝UTM APP,新增Linux虛擬機。RAM至少512MB,儲存空間至少8GB,CPU至少分配2核心。
將虛擬機開機,參考 Alpine Linux安裝教學,執行
seupt-alpine
指令稿,完成系統安裝。通常執行這個指令稿安裝十分鐘就能完成。為節省資源可以不安裝圖形界面,開機後會直接進入tty。登入一般使用者帳號,即可在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
2. 外部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虛擬機內的服務。
3. 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#
9Pfs大多數Linux發行版都有支援。
編輯UTM虛擬機,到共享資料夾啟用VirtFS (9Pfs),掛載iOS的「下載」資料夾給虛擬機存取。
然後在虛擬機內執行指令,掛載iOS的共享資料夾到
/mnt
:
sudo mount share -t 9p /mnt
- 如此一來兩邊的檔案就會互通了。