📱

Termuxの基礎知識

2024/02/24に公開

はじめに

Termux Wikiを翻訳機片手に読んでみて、少し理解できてきた気がするので、記事としてTermuxについての日本語情報をメモしておこうと思います。

概要

TermuxはAndroid向けターミナルエミュレーターアプリです。

https://termux.dev/en/

Androidに移植されたたくさんのコマンドラインユーティリティによって便利に使うことができます。Linuxのコマンドラインのエクスペリエンスをモバイルユーザーへ、root化やその他の特別なセットアップなく、届けることを目標に据えたプロジェクトです。

https://github.com/termux/termux-app

何ができるのか

Termuxの一般的な使われ方として、例えば以下のものがあります。

  • Pythonを用いたデータ処理
  • 開発環境を構築してプログラミング
  • 古きよきツールを活用したファイルのダウンロードや管理
  • Linuxのコマンドライン環境の基礎学習
  • SSHクライアントの実行
  • ファイルの同期やバックアップ

もちろん、用途はここに示したものに限定されません。Termuxのリポジトリには1000を超えるパッケージがありますし、自分でコンパイルすることも可能です。CやC++やGoやRustのためのコンパイラを含む、様々なビルドツールが提供されており、Node.jsやPythonやRubyのためのインタプリタも利用可能です。

インストール方法

F-Droidからインストールできます。Google Playからはインストールしてはならないとされています。

https://f-droid.org/packages/com.termux/

Termuxはデバイスがroot化されていることを要求しません。Termuxはnon-rootユーザーを主なターゲットとして開発されています。

動作原理

TermuxではGNU/Linuxシステム上で通常利用できる一般的なソフトウェアがAndroidへ移植されています。Termuxは仮想マシンではなく、他の何らかのエミュレート、またはシミュレートされた環境でもありません。提供されるすべてのパッケージはAndroid NDKによってクロスコンパイルされたものであり、Android上で動くように互換性を向上させるパッチを適用されただけのものです。

ファイルシステムについて

Termuxがセットアップした環境はモダンなLinuxディストリビューションと似通っていますが、Android上で動かしているため、いくつかの重要な違いがあります。OSがファイルシステムに対する完全なアクセスを提供しないため、Termuxは/bin/etcのような標準的なディレクトリにはパッケージをインストールできません。多くのLinuxディストリビューションと違って、TermuxはFHS(Filesystem Hierarchy Standard)に従っていないのです。

そのため、すべてのプログラムはTermux環境に適合させるためのパッチをあてた上でコンパイルされ直されています。そして、すべてのプログラムは次に示すアプリ専用ディレクトリの中にインストールされます。

/data/data/com.termux/files/usr

このディレクトリはprefixと呼ばれ、Termuxシェルの環境変数などでは$PREFIXとして参照されます。

補足として、このディレクトリは変更したりSDカードへ移動したりすることはできません。なぜなら、

  • ファイルシステムはUNIXパーミッションや、シンボリックリンクやソケットのような特殊なファイルをサポートしていなければなりません
  • prefixパスはすべてのバイナリにハードコードされています

また、従来の一般的なshebang(#!/bin/sh)を含むスクリプトの実行で問題が発生する可能性があります。termux-fix-shebangスクリプトを使用して、実行前にこれらのファイルを変更してください。最近のTermuxでは、termux-execという従来のshebangを使用できる特別なパッケージも提供されています。これはaptが依存するパッケージなため、すでにインストールされていることでしょう。

ユーザーについて

prefixに加えて、ユーザーは次に示すhomeディレクトリ($HOME)にファイルを配置できます。

/data/data/com.termux/files/home

Androidアプリケーションはサンドボックス化されており、それぞれでLinuxユーザーIDとSELinuxラベルを持ちます。Termuxも例外ではなく、すべての処理はそのユーザーIDで実行されることになります。よってTermuxはシングルユーザーです。ユーザー名はu0_a231のようになります。これは変更できません。

すべてのパッケージはシングルユーザーでの使用のためにパッチが適用されており、setuidsetgidのような機能は削除されています。また、サーバーアプリケーションのデフォルトポートも変更されており、例えばsshdは8022番ポートで起動します。

もしなんらかの理由でどうしてもFHSに従ったファイルシステムレイアウトが必要な場合は、prootパッケージに含まれるtermux-chrootコマンドを使うことを試してください。

prootとLinuxディストリビューションのインストールについて

https://wiki.termux.com/wiki/PRoot

prootchrootのユーザー空間実装です。一般ユーザーが任意のディレクトリを新しいルートファイルシステムとして使えるようにします。ただしこれを使っても、実際のroot権限を必要とするプログラムは動作しません。また、prootchrootと異なりネイティブではなく、ptrace()を使用する都合上、オーバーヘッドが発生します。

Termuxはproot-distroとして、Termux内でLinuxディストリビューションを管理できるパッケージを提供しています。例として、Arch Linuxをインストールする方法を示します。

pkg install proot-distro
proot-distro install archlinux
proot-distro login archlinux

インストールされたArch Linuxのルートファイルシステムは、次に示すディレクトリにあります。

$PREFIX/var/lib/proot-distro/installed-rootfs/archlinux/

TermuxへSSHできるようにするには

Termuxにパソコンなどの他の端末からSSHしに行くことができるようにするには、opensshパッケージをインストールした上でsshdを起動する必要があります。

https://wiki.termux.com/wiki/Remote_Access#Using_the_SSH_server

pkg upgrade
pkg install openssh

しかし起動前にまず、パスワード認証のためのパスワードを設定する必要があります。passwdコマンドを使用してください。

$ passwd
New password:
Retype new password:
New password was successfully set.

そうしたら、sshdを起動してください。デフォルト設定で、すでにパスワード認証は有効化されています。

sshd

公開鍵認証に切り替えるには、クライアント側でssh-copy-idコマンドを実行してください。

ssh-copy-id -i ~/.ssh/foo.pub -p 8022 <IP_ADDRESS>

<IP_ADDRESS>にはスマホのIPアドレスを入力してください。スマホ側でifconfigコマンドを実行すると確認できます。(Tailscaleを事前にインストールしてVPNを構築しておくと、TailscaleのIPアドレスを使って通信でき便利です。)

公開鍵を送れたら、スマホで起動しているsshdのための設定ファイルを編集し、パスワード認証を無効化する必要があります。設定ファイルは次に示すパスにあります。

$PREFIX/etc/ssh/sshd_config

設定ファイルを編集したら、sshdを再起動しましょう。pkill sshd; sshdを実行します。

Termux上でサービスを常時動かすには

termux-wake-locktermux-wake-unlockコマンドを使って、Androidがディープスリープモードへ移行しないようにする必要があります。

https://wiki.termux.com/wiki/Termux-wake-lock

https://developer.android.com/reference/android/os/PowerManager.WakeLock.html

lockするとunlockするまでディープスリープしません。

おわりに

ここでは紹介しませんでしたが、TermuxからサーバーへSSHすることも普通にできます。入院中にとてもお世話になりました。今、私はタスク管理用にGiteaを動かしてみています。楽しいです。

Discussion