Turning PinePhone into a Linux server like Raspberry Pi.
將Linux手機「PinePhone」變成擬似樹莓派的Linux伺服器。
這不是台灣小蛋捲,這是美國大手機。
2019年發表的無印版PinePhone,距離我 買來開箱已經兩年了啊。當初買來實際拿在手上幾個月後就放到抽屜保存了,因為Wifi晶片自己燒壞了。開著4G隨便就飆到50度的手機真不適合放在口袋帶著走。
如今,PinePhone的核心已經從特製版kernel-megi
變成主線linux-sunxi
了,看來開發者統一了這個板子系列了,讓同一個板子的裝置都能夠跑主線Linux核心。
感謝開發者的付出,postmarketOS和Mobian皆使用了linux-sunxi核心,那麼PinePhone硬體方面的開發應該算是「完成」了吧。儘管開發過程艱困,postmarketOS、Mobian、Ubuntu touch仍支援PinePhone,Arch Linux ARM已經放棄更新。
考慮到我已經 買了PineTab 2當作新主力裝置,PinePhone就沒什麼用了。儘管PineTab 2的RK3566處理器也很慢,但是至少PineTab 2有塊大螢幕,能看看電子書。
塵歸塵,土歸土,我曾想過要買樹莓派5取代目前架在x86主機上的self-hosting服務的,但是先廢物利用看看吧,將原本就是開發板改裝的PinePhone手機,變回開發板的用途。
PinePhone跟一般ARM開發板的差別在於多了電池、相機、傳感器,但是缺乏I/O傳輸埠、沒有GPIO接腳等。沒有人寫Android TV系統不太可能當電視盒子,那麼PinePhone就剩下當伺服器一途了。
為什麼不選其他能跑 postmarketOS的高性能舊Android手機來跑呢?他們沒有一台像PinePhone一樣硬體驅動全受Linux支援的啊…尤其是USB部份。
根據網路資料,PinePhone的Allwinner A64處理器性能只有樹苺派4 Broadcom BCM2711的二分之一,但起碼比樹苺派3 Broadcom BCM2837好一些,還是有用處的!
它能跑什麼?
用Docker跑 Nextclould檔案伺服器、 Immich照片雲端、 Sonarr BT種子下載服務還湊合,窮人版的NAS。但是 Jellyfin影片串流就不行了,PinePhone在伺服端1080p解碼很慢。如果要影片播放只能用SAMBA伺服器的模式串流,讓影片在播放端解碼了。
PinePhone還可以跑PiHole擋廣告,準備二個網路卡的話當簡單的路由器也行。或者是作為VPN的入口(不過我比較常用TailScale或ZeroTier,家用VPN實無必要)。PinePhone畢竟是開發板改裝的,耗電量低,開24小時應該沒問題的。
1. 環境#
- 系統:Mobian (Debian Trixie)
- 手機:Pine64 PinePhone
- 配件:USB擴充埠、硬碟外接盒x1、硬碟x1、microSD卡x1、USB Wifi兼藍芽網路卡x1、一個鐵盒子
這是最終的樣子,整組裝置放在鐵盒子裡面。這樣就算燒起來也不會央及周遭(?)。
如圖所示,PinePhone下方的是外接硬碟,透過USB連接。PinePhone再透過USB擴充埠連線到Wifi、乙太網路、充電線。
PinePhone內置eMMC疑似壞軌了,所以只得將系統安裝到SD卡,重要資料放在外接硬碟。
這個結構還需要改進,可能買個小米的方塊集線器統一管理裡面電器的電源,並設計一個延長線按鈕方便開關電源。
2. 先重裝系統#
裝系統的目的在於確認硬體正常與否。
系統選擇Mobian,基於Debian Testing分支開發,目前是Trixie
參考 PinePhone系統安裝教學,先裝好 Tow-Boot,再寫入 Mobian映像檔到SD卡。
我使用遠端登入SSH方式搭配Phosh圖形環境下設定系統。如果要用UART也是可以的但是得另外買轉接頭(PinePhone的UART位於手機耳機孔部份)
- 開機之後,進入Phosh圖形界面,到系統設定關閉自動暗停模式。再加入
~/.bashrc
,防止休眠
if [[ -n $SSH_CONNECTION ]]; then
sh -c "gnome-session-inhibit --inhibit suspend --reason \"SSH connection active\" --inhibit-only > /dev/null 2>&1 &"
fi
大部分時候用SSH遠端存取之, 使用nmcli設定固定IP
因為Debian是自由軟體發行版,Linux主線核心支援的MT7601 Wifi驅動需要安裝
linux-firmware-nonfree
套件才能載入。其他不支援的Wifi自行用DKMS編譯安裝驅動。使用
ip addr
列出Wifi裝置設定Wfii和開機自動連線
sudo nmcli dev wifi connect "SSID" password "password"
sudo nmcli device set wlan0 autoconnect yes
- 設定防火牆和SSH服務
sudo apt install openssh-server ufw
sudo systemctl enable ssh
sudo ufw enable
sudo ufw allow ssh
sudo ufw reload
- 裝好系統後將PinePhone關機,開始改造硬體。
sudo shutdown now
3. 針對伺服器的硬體改造#
PinePhone機殼用螺絲起子就可以拆解,理論上我可以把螢幕和外殼拆掉,露出板子部分再自己找一個盒子裝,不過我手太笨了,暫時不想這麼做。
僅拆開塑膠背板,保留螢幕當作底座,露出整塊主機板。拆掉背板後要記得把黏在塑膠殼上的揚聲器零件裝回去。
就在我拆開框架的時候,塑膠殼因為脆化…斷了
為了讓開機鍵比較好按(Tow-Boot需要手動按音量鍵才會從SD卡開機),把音量鍵模組撬開,使其平放。
PinePhone需要電池才可以開機,這個沒辦法,除非自製電容。這裡電池就當作廉價UPS系統吧,電池充電上限用軟體控制。
再來是4G模組部分,不當手機用的情況下這個東西基本沒用,所以我就利用PinePhone設計的Kill Switch將其關閉。金屬部份留著當散熱板。
PinePhone只要螢幕亮著就會額外發熱,且跑伺服器也不用螢幕,所以將螢幕拔掉。參照下圖,把電池上面這條線拆掉就不會對螢幕輸出訊號了。
PinePhone待機大概40 ~ 50度左右,工作的時候約60度,如果溫度壓不下來得買個USB風扇。
4. 後續的服務安裝#
- 根據測試,PinePhone只要螢幕亮著就會發熱,所以裝好系統後將桌面環境Phosh服務關掉。
sudo systemctl disable phosh
- 設定電池充電上限為80%
echo 80 > /sys/class/power_supply/axp20x-battery
/charge_control_end_threshold
- Debian Testing的Docker沒有官方套件庫支援,只能從Debian的套件庫裝
sudo apt install docker.io docker-compose
- 沒有螢幕下只能從LED燈和硬碟讀取燈號判別系統有無正常開機,為此設計開機服務,讓PinePhone的LED在系統服務啟動後亮藍燈。
cat <<EOF > /etc/systemd/system/bootled.service
[Unit]
Description=Booting LED service
[Service]
ExecStart=/bin/bash -c "/usr/bin/echo 1 > /sys/class/leds/blue:indicator/brightness"
[Install]
WantedBy=multi-user.target
EOF
echo 1 > '/sys/class/leds/blue:indicator/brightness'
sudo systemctl daemon-reload
sudo systemctl enable bootled.service
如果臨時需要圖形界面,不插硬體螢幕的話就是搞個TigerVNC伺服器再開桌面環境。
外接硬碟格式化為EXT4,並設定開機自動掛載。
# 找出硬碟代號
lsblk
# 分割硬碟,新增GPT分割區
sudo fdisk /dev/sdb
g
n
w
q
mkfs.ext4 /dev/sdb1
sudo mkdir /run/media
sudo mkdir /run/media/mobian/HDD
#列出硬碟UUID
sudo blkid
su
echo 'UUID="uuid" /run/media/mobian/HDD ext4 defaults,rw 0 1' >> /etc/fstab