免刷機,免Root,在Android上跑postmarketOS系統,以及專為Linux手機設計的Phosh桌面。
我採取非官方認可的縫合怪做法,透過Termux Proot跑postmarketOS系統,讓我們可以體會一把手機上的Linux系統長怎樣。
影片演示。Phosh + postmarketOS執行於Sony Xperia 10 V Android 14。
1. 動機#
為什麼要這麼做呢?探索在Android手機體驗Linux系統的可能性,所以我們需要專為觸控螢幕設計的桌面環境。
這是我個人的悲願,想在Sony Xperia 5 & 10系列手機跑行動Linux系統,奈何沒有太多人移植,我自己也沒成功。所以就用Termux過過癮,將這個實驗性質濃厚的作法與大家分享。
postmarketOS為對一款針對過季手機設計的GNU/Linux系統,基於Alpine Linux開發,它具有完整的Linux功能,能夠執行電腦版Linux的軟體,也成為PinePhone的熱門系統人選之一。但是postmarketOS不是所有Android手機都能刷的,參考 postmarketOS的pmbootstrap安裝教學,製作ROM需要給Linux核心打很多patch,由於Android與Linux很多驅動不通用,製作ROM的難度比移植LineageOS還高。即使最後跑起來了,還很容易缺一堆專有驅動致使用起來不愉快。
還有,體驗postmarketOS的門檻很高,對許多手機用戶而言他們連bootloader都無法解鎖,自然不可能刷機了。由此,Termux便成為一個可以考慮的方案,它能夠免root在Android執行Linux容器,並用Termux X11顯示Linux容器X伺服器的畫面。那我們首先要問,pmbootstrap能否在Termux執行?根據 這個Github issue,chroot環境是難以在沒有root權限的Android跑起來的。因此改用較為緩慢的proot吧。
Termux有提供Alpine Linux的proot rootfs,而postmarketOS本來就是基於Alpine Linux開發,所以施點小手段將Alpine Linux轉成postmarketOS系統,就能夠取得那些專為手機設計的套件了。為什麼不直接用Alpine Linux?因為postmarketOS有些套件沒有upstream,容易導致依賴缺東缺西的。
最後來談 Phosh,這個桌面環境是自由軟體公司Purism開發,背後使用名為Phoc的Wayland合成器,基於wlroots寫成,專為Linux手機設計的桌面。在PinePhone社群中,Phosh是評價最好的一個界面了。再根據我個人的PinePhone使用經驗,我覺得Phosh雖然界面很簡陋,但卻是最穩定的一個界面,而且Phosh非常省資源,在性能超爛的PinePhone (搭載Allwinner A64處理器) 動畫依然十分流暢。我認為,Phosh對想要在Termux X11與Linux系統互動的用戶非常有用,大部分Android手機都沒有鍵盤滑鼠,所以在Termux X11跑XFCE、KDE Plasma、GNOME之類的傳統Linux桌面用起來就會很尷尬,而針對觸控手勢特別優化過的Phosh便是一個極佳選擇。
但是,你可能會問說,Phosh是Wayland合成器,要怎麼在Termux X11跑起來?雖然我們無法直接使用Wayland,但是X11下的巢狀Wayland工作階段還是辦得到,有些合成器能做到這點,例如 Weston或者 Cage,即使在X環境下依然能夠使用Wayland的部份功能。不過單純跑cage會導致不出現不完整的X工作階段,沒辦法偵測到手機的解析度。所以在跑cage之前,我還會啟動一個X視窗管理器,為節省性能,選擇Openbox。
2. 前置項目#
請先設定以下項目:
- Termux
- Termux X11
- virglrenderer:選擇性的硬體加速
- Hacker’s keyboard:用以與桌面環境互動,模擬電腦的鍵盤輸入很有用。
3. 安裝proot Alpine Linux#
postmarketOS提供Edge與Stable二個更新頻道,Stable頻道版本號到 Wiki查詢,目前是v24.06。
Termux預設的Alpine Linux套件庫是Edge分支,但是此分支不穩定,所以建議將其切換為Alpine 3.20(對應postmarketOS v24.06)
- 開啟Termux 安裝proot Alpine Linux
pkg update
pkg install proot-distro pulseaudio
proot-distro install alpine
- 將Alpine Linux的套件庫從Edge切換為v3.20
proot-distro login alpine --shared-tmp
apk update
apk add vim
vim /etc/apk/repositories
# 將"http://dl-cdn.alpinelinux.org/alpine/edge/main"修改為"http://dl-cdn.alpinelinux.org/alpine/v3.20/main"
# 將"http://dl-cdn.alpinelinux.org/alpine/edge/community"修改為"http://dl-cdn.alpinelinux.org/alpine/v3.20/community"
apk update
apk upgrade
- 新增一個使用者,加入sudo群組,設定時區
apk add sudo
addgroup storage
adduser -g wheel,storage,video,audio user
visudo
passwd
sudo ln -sf /usr/share/zoneinfo/Asia/Taipei /etc/localtime
sudo setup-timezone
- 在Termux proot啟用SSH遠端連線。
sudo vim /etc/ssh/sshd_config
# 將`Port`從22改為8023
ssh-keygen -A
rc-update add sshd
rc-serive sshd start
# 檢查IP位址。
ip addr
4. 將Alpine Linux轉換為postmarketOS#
- 加入postmarketOS v24.06 (Alpine v3.20) 套件庫
vim /etc/apk/repositories
# 在最上面新增這行:
https://mirror.postmarketos.org/postmarketos/v24.06
# 僅供參考,Edge頻道的網址為: https://mirror.postmarketos.org/postmarketos/master/
- 安裝postmarketos-keys
apk add -u --allow-untrusted postmarketos-keys
apk update && apk upgrade
- 將以下內容加入至
/etc/os-release
PRETTY_NAME="postmarketOS v24.06"
NAME="postmarketOS"
VERSION_ID="v24.06"
VERSION="v24.06"
ID="postmarketos"
ID_LIKE="alpine"
HOME_URL="https://www.postmarketos.org/"
SUPPORT_URL="https://gitlab.com/postmarketOS"
BUG_REPORT_URL="https://gitlab.com/postmarketOS/pmaports/issues"
LOGO="postmarketos-logo"
5. 安裝Phosh桌面環境#
- 安裝Openbox與Cage:
sudo apk add openbox cage
- Phosh套件名稱是
postmarketos-ui-phosh
,推薦一併安裝postmarektOS設計的一些行動裝置套件:
sudo apk add postmarketos-ui-phosh \
postmarketos-tweaks \
firefox \
mobile-config-firefox \
font-noto \
font-noto-cjk \
font-noto-cjk-extra \
font-noto-emoji
6. 啟動Termux X11和Phosh#
在proot啟動Phosh的靈感來自於 phosh-vnc和 termux-phosh,雖然用WayVNC跑是一種方式,但有效能更好的Termux X11何不善加利用呢?
啟動Phosh桌面的過程為:啟動Termux端的PulseAudio音訊伺服器,啟動Termux X11,再登入proot Alpine,啟動Openbox與cage與Phosh。
整個過程如下:
- 開啟Termux,啟動PulseAudio
pulseaudio --start --load="module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1" --exit-idle-time=-1
pacmd load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1
- 開啟Termux X11,再從Termux啟動Termux X11
export DISPLAY=:0
termux-x11 :0 &
- 啟動virglrenderer
virgl_test_server_android &
- 登入Alpine Linux
proot-distro login alpine --user user --shared-tmp
- 啟動Openbox與cage與Phosh
export DISPLAY=:0
export XDG_RUNTIME_DIR=/tmp
openbox &
cage phoc -E '/usr/libexec/phosh' -U &
在Termux X11的視窗等Openbox的視窗跑出來,點兩下標題欄放到最大。
在手機通知欄點選Preferences,將Termux X11的Output設定為Scaled,放大畫面到適合你手機的尺寸。
並將Termux X11的Pointer改為Direct Touch,模擬觸控螢幕。
7. Phosh的使用體驗#
大部分觸控手勢都能用,Phosh的操作邏輯就是從底部上滑檢視所有工作,將APP視窗上滑關閉。
注意proot裡面的Phosh不是完整Linux系統環境,因此部份功能無法使用。
例如Phosh使用GNOME Control Center調整系統設定,但是圖形化界面開不起來,所以很多地方得變成要用指令改,要修改檔案管理器Portfolio開啟特定檔案格式預設的APP,你應該使用xdg-mime
修改。還有GNOME Software無法使用,請使用apk
指令安裝軟體。
若要使用輸入法打字:Phosh內建的Squeekboard僅支援英文,長按Phosh底部的長條喚醒(似乎proot環境叫不出來)。打中文你得使用Android手機的鍵盤,在Termux X11的畫面按下返回鍵就能叫出手機鍵盤。然後在Termux X11底部的工具列往左滑,就能夠輸入中文。
8. 試試其他桌面環境?#
除了Phosh外,postmarketOS的桌面環境還有Plasma Mobile和SXMO,但我覺得他們問題更多就是了,一個不穩定,一個太複雜。
Plasma Mobile
Plasma Mobile是基於電腦版KDE Plasma開發的桌面,可以使用X11或者Wayland後端啟動。
個人覺得這個桌面非常不穩定,不如用電腦版KDE。
套件名稱:postmarketos-ui-plasma-mobile
。X11啟動指令:startplasma-x11
,Wayland版啟動指令:startplasma-wayland
X11版可以用這個指令啟動:dbus-launch --exit-with-session startplasma-x11 &
SXMO
SXMO號稱手機版的Sway,套件名稱為postmarketos-ui-sxmo
,但是Termux X11僅支援X,所以我改裝postmarketos-ui-sxmo-de-dwm
。
- 安裝SXMO相關套件
sudo apk add postmarketos-ui-sxmo-de-dwm postmarketos-tweaks-sxmo-x11 feh dwm svkbd conky clickclack
在啟動SXMO前執行此指令:
export XDG_RUNTIME_DIR=/tmp
接著啟動SXMO:
dbus-launch --exit-with-session /usr/bin/sxmo_xinit.sh &
SXMO設定檔位於
~/.config/sxmo/
,事件鉤子位於/usr/share/sxmo/default_hooks/
雖然有畫面,但是觸控手勢無效。
SXMO硬體快捷鍵可能得重新綁定,此時需要修改dwm的原始碼:
git clone [email protected]:~mil/sxmo-dwm
# 修改config.def.h並重新編譯安裝dwm
在安裝自訂dwm前需先刪除sxmo-dwm
套件,或者您可以安裝原版dwm
套件並使用預設按鍵綁定。