Termuxの基礎知識
はじめに
Termux Wikiを翻訳機片手に読んでみて、少し理解できてきた気がするので、記事としてTermuxについての日本語情報をメモしておこうと思います。
概要
TermuxはAndroid向けターミナルエミュレーターアプリです。
Androidに移植されたたくさんのコマンドラインユーティリティによって便利に使うことができます。Linuxのコマンドラインのエクスペリエンスをモバイルユーザーへ、root化やその他の特別なセットアップなく、届けることを目標に据えたプロジェクトです。
何ができるのか
Termuxの一般的な使われ方として、例えば以下のものがあります。
- Pythonを用いたデータ処理
- 開発環境を構築してプログラミング
- 古きよきツールを活用したファイルのダウンロードや管理
- Linuxのコマンドライン環境の基礎学習
- SSHクライアントの実行
- ファイルの同期やバックアップ
もちろん、用途はここに示したものに限定されません。Termuxのリポジトリには1000を超えるパッケージがありますし、自分でコンパイルすることも可能です。CやC++やGoやRustのためのコンパイラを含む、様々なビルドツールが提供されており、Node.jsやPythonやRubyのためのインタプリタも利用可能です。
インストール方法
F-Droidからインストールできます。Google Playからはインストールしてはならないとされています。
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
のようになります。これは変更できません。
すべてのパッケージはシングルユーザーでの使用のためにパッチが適用されており、setuid
やsetgid
のような機能は削除されています。また、サーバーアプリケーションのデフォルトポートも変更されており、例えばsshd
は8022番ポートで起動します。
もしなんらかの理由でどうしてもFHSに従ったファイルシステムレイアウトが必要な場合は、proot
パッケージに含まれるtermux-chroot
コマンドを使うことを試してください。
proot
とLinuxディストリビューションのインストールについて
proot
はchroot
のユーザー空間実装です。一般ユーザーが任意のディレクトリを新しいルートファイルシステムとして使えるようにします。ただしこれを使っても、実際のroot権限を必要とするプログラムは動作しません。また、proot
はchroot
と異なりネイティブではなく、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
を起動する必要があります。
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-lock
とtermux-wake-unlock
コマンドを使って、Androidがディープスリープモードへ移行しないようにする必要があります。
lockするとunlockするまでディープスリープしません。
おわりに
ここでは紹介しませんでしたが、TermuxからサーバーへSSHすることも普通にできます。入院中にとてもお世話になりました。今、私はタスク管理用にGiteaを動かしてみています。楽しいです。
Discussion