Turning PinePhone into a Linux server like Raspberry Pi.
Linuxスマホ「PinePhone」を、Raspberry PiもどきのLinuxサーバーにします。
これは台湾の小さいエッグロールではありません。アメリカの大きいスマホです。
2019年に発表された無印版PinePhoneは、私が買って開封レビューしてからもう2年経ちました。当時買って実際に数か月手元で使ったあと、引き出しにしまって保管していました。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には大きい画面があり、電子書籍を読むくらいはできます。
塵は塵に、土は土に。今x86マシン上で動かしているself-hostingサービスを置き換えるためにRaspberry Pi 5を買おうかと思ったこともありますが、まずは廃物利用してみます。もともと開発ボードを改造したようなPinePhoneスマホを、開発ボードの用途へ戻すわけです。
PinePhoneと一般的なARM開発ボードの違いは、バッテリー、カメラ、センサーが増えている一方で、I/Oポートが不足しており、GPIOピンもない点です。Android TVシステムを書いている人もいないので、テレビボックスにするのはまず無理です。となると、PinePhoneに残された道はサーバー用途くらいです。
なぜpostmarketOSを動かせる、もっと高性能な古いAndroidスマホを使わないのか?PinePhoneのようにハードウェアドライバーが全面的にLinuxでサポートされている端末なんてないからです…特にUSB周り。
ネット上の資料によると、PinePhoneのAllwinner A64プロセッサの性能はRaspberry Pi 4のBroadcom BCM2711の半分程度しかありません。ただし少なくともRaspberry Pi 3のBroadcom BCM2837よりは少し良いので、まだ使い道はあります。
何を動かせるのか?
DockerでNextclouldファイルサーバー、Immich写真クラウド、Sonarr BTトレントダウンロードサービスを動かすくらいなら、まあ何とかなります。貧者版NASです。ただしJellyfin動画ストリーミングは無理です。PinePhoneはサーバー側での1080pデコードがとても遅い。動画再生をしたいなら、SAMBAサーバー方式でストリーミングし、再生側で動画をデコードさせるしかありません。
PinePhoneはPiHoleを動かして広告ブロックにも使えます。ネットワークカードを2枚用意すれば、簡単なルーターにもできます。あるいはVPNの入口として使う手もあります(ただし私はTailScaleやZeroTierを使うことが多く、家庭用VPNは実際あまり必要ありません)。PinePhoneは結局のところ開発ボード改造品なので、消費電力は低く、24時間稼働でも問題ないはずです。
1. 環境#
- システム:Mobian (Debian Trixie)
- スマホ:Pine64 PinePhone
- アクセサリ:USB拡張ポート、外付けHDDケースx1、HDDx1、microSDカードx1、USB Wifi兼Bluetoothネットワークカードx1、鉄の箱1つ
これが最終形です。装置一式を鉄の箱に入れています。これなら燃えても周囲に被害が及ばないでしょう(?)。
画像のとおり、PinePhoneの下にあるのは外付けHDDで、USB経由で接続しています。PinePhoneはさらにUSB拡張ポート経由でWifi、イーサネット、充電ケーブルへ接続します。
PinePhone内蔵eMMCは不良セクタがある疑いがあるため、システムはSDカードへインストールし、重要データは外付けHDDへ置くしかありませんでした。
この構成はまだ改善が必要です。小米のキューブ型電源タップでも買って中の電源をまとめて管理し、電源オンオフしやすい延長ケーブルのボタンを設計するかもしれません。
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 now3. サーバー向けのハードウェア改造#
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とHDDアクセスランプでシステムが正常に起動したか判断するしかないため、起動サービスを作り、システムサービス起動後に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サーバーでも用意してからデスクトップ環境を起動します。
外付けHDDをEXT4でフォーマットし、起動時に自動マウントするよう設定します。
# HDDのデバイス名を探す
lsblk
# HDDをパーティション分割し、GPTパーティションを新規作成
sudo fdisk /dev/sdb
g
n
w
q
mkfs.ext4 /dev/sdb1
sudo mkdir /run/media
sudo mkdir /run/media/mobian/HDD
# HDDのUUIDを一覧表示
sudo blkid
su
echo 'UUID="uuid" /run/media/mobian/HDD ext4 defaults,rw 0 1' >> /etc/fstab

