古い Android スマホをサーバにする

定番の Termux

これは普通に Play ストアからインストールできる。
ので、サクッと導入しちゃえばいいと思うよ。

ただし、API使ってスマホのセンサーやらカメラやら弄りたい場合は F-Droid版 をインストールしなければならないらしい。
F-Droid 版というのは Play ストアからのインストールではなく APK ファイルを持ってきて導入するパターン。
とりあえずは、サクッと試せる Play ストア版から。

Termux でできそうなことできなさそうなこと

WSL や仮想マシンとは違い、Android のカーネル上で動くアプリみたいなものなので結構制限はありそう。
root 取ってないスマホだとユーザー権限でしか動かなそうだし、ハードウェア側を直接操作しようということも無理でしょう。
それでも、Nginx や Python が動くようなので、それなりに遊べると思う。

実際にやってみたこと

SSHで繋げる

さすがにスマホのソフトウェアキーボードじゃやりにくいからね。

$ pkg update
$ pkg install openssh

$ passwd
 New password:
 Retype new password:

$ sshd
$ whoami
 ux_axxx

$ ifconfig
 lo:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
 wlan0:xxxxxxxxxxxxxxxxxxxxxxxxxxxx

whoami コマンドで「今ログインしているユーザー名」がわかる。
Termux は Android 上で動いていることもあり、ユーザー名を自由に決められるわけではないので、このコマンドで「今、自分は誰なのか」を確認する。

そして、「ip a」も使えない。MAC アドレスを外部ツールが勝手に読めないようにしているのだとかで。
けど、「ifconfig」なら動くので、これで今繋がっている WiFi 上での IP アドレスが確認できる。

クライアントから接続する際にはポート番号が 8022 になっているので注意。

Pythonのインストール

よっぽど古い機種じゃない限りスマホのほうがラズパイよりも早いはず。
となると、Python もまぁまぁ快適よね、きっと。

$ pkg install python

とりあえずこれだけでOK

$ python -V
Python 3.13.13

といった感じでバージョン確認できればOK

Nginx と PHP ついでに mariadb もインストールしちゃえ

簡単。以下3行で良い。

pkg install nginx
pkg install php-fpm
pkg install mariadb

Nginx の config ファイルは以下にあるので、ちょこっと修正。
/data/data/com.termux/files/usr/etc/nginx/nginx.conf

#user nobody;
user ux_axxx;

Nginx は自動では立ち上がってないはずだけど、以下のようにしてプロセスをいったん切る。
その後、念のため設定ファイルの確認をして、Nginxを起動する。

$ pkill nginx
$ nginx -t
$ nginx

Nginx もポート番号に注意。
8080 になってる。

sshd、Nginx、mediamtx 等を Termux 起動と同時に立ち上げる

通常の Linux 環境と違って systemctrl が使えない。
なので、termux-service を使う。

$ pkg install termux-services

いくつかはすでに自動起動用のスクリプトがあらかじめ作られる。

今回、足らなかったのは mediamtx 起動用なので、それを例にしてみると、下記のようにする。

まずは自動実行のためのスクリプト。

$ mkdir $PREFIX/var/service/mediamtx
$ vi $PREFIX/var/service/mediamtx/run

$PREFIX/var/service/mediamtx/run の内容は以下。

cd ~/mediamtx
exec ./mediamtx 2>&1

その後、このファイルに実行権限を与え、sv-enableコマンドを使って起動時に実行するよう設定する。

$ chmod +x $PREFIX/var/service/mediamtx/run
$ sv-enable mediamtx

これで Termux の起動と同時にいろいろ立ち上がってくる。

実際にちゃんと起動しているかどうかはこんな感じで判断できる。

$ sv status mediamtx
run: mediamtx: (pid 4608) 418s

IP アドレスの通知欄への表示

本来なら IP アドレスは固定しておくのがサーバとしてはわかりやすい。
けど、スマホだからね。
「移動する」というメリットを生かしたい。
なので、DHCPから拾ってくる方法から変えずにおこうと思う。

その際に、「どうやってスマホに割り当てられた IP アドレスを調べるか」が重要になってくる。
いや、termux 使ってるくらいだから、調べるくらい簡単なんだろうけど、もっとこう、他の人が見た時にもわかりやすくしたい。

となると、通知欄へ表示させたりするのが一番いい。

通知欄へ表示させるためには Termux の API を使うと簡単なのでインストール。

$ pkg install termux-api

次に、以下のコードをどこかに置いておく。
個人的には ~/script/ipcheck あたりがいいかな、と。

#!/data/data/com.termux/files/usr/bin/sh

CACHE_FILE="/data/data/com.termux/files/home/script/ipcheck/last_ip.txt"
 
while true; do
    # 現在のIPを取得
    CURRENT_IP=$(ifconfig 2>/dev/null | grep 'inet ' | grep -v '127.0.0.1' | awk '{print $2}' | sed 's/addr://')
 
    # 以前のIPを確認
    if [ -f "$CACHE_FILE" ]; then
        LAST_IP=$(cat "$CACHE_FILE")
    else
        LAST_IP=""
    fi
 
    echo $CURRENT_IP
 
    # IPが取得できていて、かつ前回のIPと異なる場合
    if [ -n "$CURRENT_IP" ] && [ "$CURRENT_IP" != "$LAST_IP" ]; then
        # 通知を送る
        termux-notification \
            --id "ip_watcher" \
            --title "現在の IP アドレス" \
            --content "$CURRENT_IP" \
            --priority high \
            --ongoing 2>/dev/null
 
        # 新しいIPを保存
        echo "$CURRENT_IP" > "$CACHE_FILE"
    fi
 
    # 1分ごとにチェック
    sleep 60
done

これを先ほど有効化した termux-services に登録する。

$ mkdir $PREFIX/var/service/ipchecker
$ vi $PREFIX/var/service/ipchecker/run

みたいな感じにして、中身は以下のようにする。

#!/data/data/com.termux/files/usr/bin/sh
cd ~/script/ipcheck
exec sh ./check.sh

さっきまでの run ファイルとはちょっと違うところがある。 1行目。
今回はスクリプトを実行させ続けたいので、exec にも sh がある。
なので、1行目にシバンを書いておかないと実行されない。

意外とシバンは忘れがちなので注意したいところ。
(スクリプト書いてるときは忘れないんだけど、ほんの2行くらいで済んじゃう run の方は忘れがちだよねぇ…実際忘れたw)

そうすると、1分ごとに IP をチェックして、変化したら通知が上がる。
その通知は「ongoing」というパラメータを与えてあるので、消えない通知になるから、いつでも最新のIPアドレスが確認できる。

あ、作ったスクリプトと termux-services 用の run スクリプト、そのどちらにも chmod +x で実行権限与えるのを忘れずに。
これも忘れがちだよね。

この記事にコメントしてみる