Root済みAndroidにUbuntu 24.04をchroot構築する完全ガイド【Linux Deploy不要】

Root済みAndroidにUbuntu 24.04をchroot構築する完全ガイド【Linux Deploy不要】

Linux Deployを使わず、Termux + chroot でUbuntu 24.04をAndroid上に構築。SSHサーバー化して画面OFFでも24/7運用する方法。ハマりポイント全部書いた。

Linux Deployはもう要らない

Root済みAndroidにLinux環境を入れるとき、定番はLinux Deployだ。GUIでポチポチ、ディストロ選んでインストール。簡単。

…のはずが、実際には:

  • Archを入れたらSSHが起動しない(バグ)
  • Ubuntu 18が入る(古すぎてNode.js動かない)
  • 謎のエラーが頻発

結局、Termux + 手動chroot が最強だった。

この記事では、Root済みAndroidにUbuntu 24.04 (Noble Numbat) をchroot環境として構築し、SSHサーバーとして24/7運用するまでの手順を解説する。

前提条件

  • Root済みAndroid端末(Magisk推奨)
  • Termux インストール済み(F-DroidGitHub Releasesから)
  • ストレージに最低2GB以上の空き

今回使った端末は Nothing Phone (1)。Snapdragon 778G+、arm64。

1. rootfsを取得する

Termuxを開いて、root権限に入る:

pkg install tsu
su

Ubuntu Base のrootfs tarball をダウンロード:

cd /data/local
mkdir -p ubuntu
curl -kLO https://cdimage.ubuntu.com/ubuntu-base/releases/noble/release/ubuntu-base-24.04.4-base-arm64.tar.gz
tar -xzf ubuntu-base-24.04.4-base-arm64.tar.gz -C ubuntu

注意: URLのバージョンは変わる。公式ページで最新を確認。24.04.2は存在しない(ハマった)。

2. chroot環境をマウントする

mount --bind /dev /data/local/ubuntu/dev
mount -t devpts devpts /data/local/ubuntu/dev/pts
mount --bind /proc /data/local/ubuntu/proc
mount --bind /sys /data/local/ubuntu/sys

chrootに入る:

chroot /data/local/ubuntu /bin/bash

入ったら最初にやること:

export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
export TMPDIR=/tmp
export HOME=/root
mkdir -p /tmp

⚠️ TMPDIRの罠: TermuxのTMPDIR(/data/data/com.termux/files/usr/tmp/)がchroot内に漏れる。export TMPDIR=/tmp しないと、ca-certificatesのインストールなどで mktemp: failed to create file via template エラーが出る。

3. DNS・ホスト設定

echo "nameserver 8.8.8.8" > /etc/resolv.conf
echo "127.0.0.1 localhost" > /etc/hosts

4. Androidネットワークグループの設定

これをやらないとaptがダウンロードできない。 Android chroot特有の罠。

groupadd -g 3003 aid_inet
groupadd -g 3004 aid_net_raw
groupadd -g 1003 aid_graphics
usermod -g 3003 -G 3003,3004 -a _apt
usermod -G 3003 -a root

_aptユーザーにAndroidのネットワーク関連グループ(aid_inet, aid_net_raw)を追加しないと、aptのダウンロードプロセスがネットワークアクセスできない。

5. aptリポジトリの設定

Ubuntu 24.04からaptのソース定義がDEB822形式に変わった。

mkdir -p /etc/apt/sources.list.d

/etc/apt/sources.list.d/ubuntu.sources を以下の内容で作成:

Types: deb
URIs: http://ports.ubuntu.com/ubuntu-ports
Suites: noble noble-updates
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

注意: arm64はports.ubuntu.com/ubuntu-portsを使う。x86のarchive.ubuntu.comではない。

echoで書く場合(viが無いので):

echo 'Types: deb' > /etc/apt/sources.list.d/ubuntu.sources
echo 'URIs: http://ports.ubuntu.com/ubuntu-ports' >> /etc/apt/sources.list.d/ubuntu.sources
echo 'Suites: noble noble-updates' >> /etc/apt/sources.list.d/ubuntu.sources
echo 'Components: main restricted universe multiverse' >> /etc/apt/sources.list.d/ubuntu.sources
echo 'Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg' >> /etc/apt/sources.list.d/ubuntu.sources

⚠️ ファイルが書けてない罠: wc -l で確認すること。0行なら書き込み失敗してる。mkdir -p でディレクトリを先に作ってるか確認。

古いキャッシュが残ってるとbackportsやsecurityのエラーが出るので:

rm -rf /var/lib/apt/lists/*
apt update

20万パッケージくらい取得されれば成功。50個とかならComponentsが欠けてる。

6. 基本パッケージのインストール

Ubuntu Baseはマジで何も入ってない。catすら無い。

apt install -y coreutils openssh-server vim curl wget

7. SSHサーバーの設定

passwd root
mkdir -p /run/sshd
sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
/usr/sbin/sshd -p 2222

ポート22はAndroid側と競合する可能性があるので、2222を使う。

PCから接続テスト:

ssh root@<端末のIP> -p 2222

8. .profileの設定

毎回exportするのは面倒なので:

echo 'export TMPDIR=/tmp' >> /root/.profile
echo 'export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin' >> /root/.profile
echo 'export HOME=/root' >> /root/.profile

9. 自動起動(Magisk service.d)

再起動するとchroot環境は消える。Magiskのservice.dにスクリプトを置いて自動起動させる。

chroot外(Termuxのsu状態)で:

cat > /data/adb/service.d/chroot-ubuntu.sh << 'SCRIPT'
#!/system/bin/sh
sleep 10
mount --bind /dev /data/local/ubuntu/dev
mount -t devpts devpts /data/local/ubuntu/dev/pts
mount --bind /proc /data/local/ubuntu/proc
mount --bind /sys /data/local/ubuntu/sys
chroot /data/local/ubuntu /bin/bash -c "export TMPDIR=/tmp; export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; mkdir -p /run/sshd; /usr/sbin/sshd -p 2222"
SCRIPT
chmod +x /data/adb/service.d/chroot-ubuntu.sh

これでAndroid起動時に自動でchroot + SSHサーバーが立ち上がる。画面OFFでもOK。

ハマりポイントまとめ

今回踏んだ地雷を全部列挙する。未来の自分と読者のために。

問題原因解決
Linux Deploy ArchでSSH起動しないアプリのバグLinux Deploy捨ててTermux chroot
pacman Landlock エラーカーネルが古い--disable-sandbox
pacman alpmユーザー不在最小構成/etc/passwdに手動追加
Node.js動かないUbuntu 18のglibc古いUbuntu 24.04に入れ直し
tarball URL 404/503バージョン違い公式ページで最新確認
apt “not signed”backports/securityキャッシュ残りrm -rf /var/lib/apt/lists/*
apt パッケージ50個しかないsourcesファイル書き込み失敗wc -lで確認、mkdir -p忘れ
catが無いUbuntu Baseは超最小構成apt install coreutils
ca-certificates インストール失敗TermuxのTMPDIRが漏れてるexport TMPDIR=/tmp
SSH Connection refusedポート競合 or mount不足ポート変更 + mount確認

まとめ

Linux Deployを使わず、Termux + chroot でUbuntu 24.04環境を構築した。結果的に最小構成で最も軽量な環境になった。

rootさえあれば、余計なアプリもデーモンも不要。chroot + sshd だけ。Nothing Phone (1) がarm64サーバーとして静かに動いてる。

使い古しのAndroidがサーバーになる時代、Mac Miniを並べてる場合じゃない。