Termux

Відкрив для себе проект Termux. Це наче емулятор терміналу для Android, але насправді у ньому всередині цілий userland більш-менш повноцінної системи на базі Debian.

Будь-який Android містить всередині ядро Linux. На жаль, крім ядра там майже нема нічого такого, чим ми користуємося в консолі. Наприклад, в ssh-клієнті ConnectBot є можливість зайти в локальний shell і подивитися що там до чого; швидко стає зрозумілим, що з локального shell’а користі мало. Ну, хіба що ви якимось чином напхаєте туди потрібних вам програм «для людей» — ssh, rsync і все такеє.

Так от, Termux як раз і несе в собі базовий набір корисних бінарників. І, цілком очікувано, дає можливість встановити з мережевих репозиторіїв ще дофіга та трішки.

Колись я бачив і навіть використовував проект Lil’ Debi з подібною ідеєю, але це було давно і нині Lil’ Debi в статусі unmaintained.

Мінуси

Мінус номер один, він же плюс: Termux нормально працює на не-рутованих телефонах. Це значить, що весь userland буде належати одному і тому ж власнику (в моєму випадку це користувач з чарівним іменем u0_a202). Система на одного користувача. Також без рута не вийде запускати мережеві сервіси з портом менше 1024 (порт 80 не можна, порт 8000 чи 8080 — без проблем).

Мінус номер два, як наслідок попереднього: Termux не відповідає стандарту FHS, вся система знаходиться десь всередині каталога /data/data/com.termux/files, тому весь софт для Termux має бути якось адаптовано до цього. Тобто не вийде скачати джерельний код довільної лінуксової програми, зробити ./configure && make && make install і сподіватись, що все запрацює.

Ще один помітний мінус: системи ініціалізації в комплекті немає. Але тут можна викрутитись.

Ще мінус: потрібен Android не нижче 5.0; зовсім старі смартфони з Android 4.4, на жаль, залишаються «за бортом».

Плюси

Старий смартфон з Termux цілком може замінити невеликий сервер з Apache/PHP/MySQL.

Сервер кишенькового розміру, якому не потрібен окремий ДБЖ. Краса!

Повноцінний портативний комп, який можна інтегрувати в свої хобі-проекти. Ну офігенно ж.

За допомогою додаткового пакету Termux:API можна отримати доступ до камери, GPS, слідкувати за станом батареї. Оскільки це все-таки телефон, то можна телефонувати і відправляти SMS. Є трохи неочікувані, але приємні особливості Andoid: наприклад, доступ до системного рушія синтезу мовлення.

Встановлення

У Google Play є дуже застаріла версія Termux. Я почав експерименти саме з неї. Цю версію я категорично не рекомендую; не повторюйте моїх помилок і не ходіть по тих граблях.

Нормальна версія встановлюється через F-Droid.

Сподіваюся, що всі лінукс-адміни впораються з встановленням F-Droid без додаткової допомоги. Та про всяк випадок (для самих затурканих) напишу, як це зробити:

  1. в налаштуваннях Android’а треба дозволити встановлення програм з невідомих джерел (Settings → Security → Unknown sources);
  2. будь-яким браузером зайти на сайт F-Droid.org;
  3. натиснути на синю кнопку «DOWNLOAD F-DROID» і скачати файл F-Droid.apk;
  4. натиснути на файл F-Droid.apk в області повідомлень (або через менеджер файлів і теку Downloads), встановити його.

Далі можна запускати свіжевстановлений F-Droid, шукати там Termux, встановлювати.

Перші кроки

Запускаю додаток Termux і бачу консоль. Овва, це ж лінукс! І у цьому лінуксі дійсно можна жити і робити щось корисне, незважаючи на приколи.

Перший прикол: ваш домашній каталог це /data/data/com.termux/files/home.

Ще один прикол: у вас нема su чи sudo, але є менеджер пакетів pkg. Так, для встановлення або оновлення пакетів в цій системі не потрібні рутові права.

Додаток Termux під час роботи постійно показує сповіщення нагорі екрану. Такі собі приколи Android’а. Якщо ви не хочете, щоб ваш сервер засинав з вимкненням екрану, то у цьому сповіщенні можна знайти кнопку «Acquire wakelock».

Доступ

Вочевидь, одна з найперших задач, що треба зробити — це налаштувати доступ ззовні, зокрема встановити сервер SSH. Комусь подобається Dropbear, я зазвичай використовую OpenSSH:

pkg install openssh

Сервер треба запускати вручну (просто запустіть команду sshd). Порти нижче 1024 недоступні, тому за замовчанням sshd працює на порту 8022.

Система ініціалізації

Тут передбачена спеціальна штука для більш зручного запуску сервісів:

pkg install termux-services

Тепер замість sshd можна запускати sv up sshd. Плюс у тому, що при цьому для керування сервісами використовується справжній супервайзер (runit). Принаймні, sv down sshd виглядає якось акуратніше, аніж pkill sshd :)

Мені зручно запускати Termux вручну (це після увімкненя достатньо зробити один раз), і я в свій файл ~/.profile додав один рядок для автоматичного запуску сервера SSH:

echo "sv up sshd" >> ~/.profile

Можна піти далі і зробити автоматичний старт сервера під час запуску мобілки, скориставшись Termux:Boot. Я поки цього не робив.

Веб-сервер

Власне, Apache та PHP це для мене одне з головних застосувань кишенькового сервера.

Правда, у мене не класичний LAMP; замість MySQL я використовую SQLite, і мені цього наразі вистачає. Але мені потрібен Redis. Короче, погнали:

pkg install apache2 php php-fpm php-redis redis sqlite

Цілком очікувані приколи:

  • конфіги Apache лежать в /data/data/com.termux/files/usr/etc/apache2
  • Apache за замовчанням живе на порту 8080
  • DocumentRoot за замовчанням це /data/data/com.termux/files/usr/share/apache2/default-site/htdocs

Налаштування Apache

Конфігурація Apache для взаємодії з PHP-FPM, припустимо, може бути якась така:

cat - >/data/data/com.termux/files/usr/etc/apache2/conf.d/php.conf <<'CONFIG'
<IfModule proxy_fcgi_module>
  <IfModule setenvif_module>
    SetEnvIfNoCase ^Authorization$ "(.+)" HTTP_AUTHORIZATION=$1
  </IfModule>
  <FilesMatch ".+\.ph(ar|p|tml)$">
    SetHandler "proxy:unix:/data/data/com.termux/files/usr/var/run/php-fpm.sock|fcgi://localhost"
  </FilesMatch>
  <IfModule dir_module>
    DirectoryIndex index.php index.html
  </IfModule>
</IfModule>
CONFIG

Також треба увімкнути модулі proxy та proxy_fcgi (скрипта a2enmod нема):

sed -i 's/^\#\(LoadModule proxy_module\)/\1/' \
  /data/data/com.termux/files/usr/etc/apache2/httpd.conf

sed -i 's/^\#\(LoadModule proxy_fcgi_module\)/\1/' \
  /data/data/com.termux/files/usr/etc/apache2/httpd.conf

Налаштування PHP

За замовчанням php.ini взагалі нема. Щоб в PHP був модуль Redis, треба створити php.ini:

echo "extension=redis.so" > /data/data/com.termux/files/usr/lib/php.ini

mkdir -p ~/.php
ln -rs /data/data/com.termux/files/usr/lib/php.ini ~/.php/php.ini

Останній сімлінк — це шлях того конфіга, який буде використовувати PHP-FPM. Я спочатку довго не міг зрозуміти, чому у PHP CLI потрібний модуль є, а у PHP-FPM його нема. Будьте уважні.

Налаштування Redis

Щоб запускати Redis через termux-services, теж треба додатковий конфіг:

mkdir /data/data/com.termux/files/usr/var/service/redis

cat - >/data/data/com.termux/files/usr/var/service/redis/run <<'SCRIPT'
#!/data/data/com.termux/files/usr/bin/sh
exec redis-server --port 6379 2>&1
SCRIPT

chmod +x /data/data/com.termux/files/usr/var/service/redis/run

Ну, здається, це все. Можна запускати:

# Про всяк випадок, після редагування конфігу
sv down httpd
sv down php-fpm

sv up httpd
sv up php-fpm
sv up redis

Voilà!

Перевірка

Щоб швидко перевірити, чи воно працює, достатньо відкрити в будь-якому локальному браузері телефона адресу 127.0.0.1:8080 (там має бути стандартна заглушка «It works»).

А за адресою 127.0.0.1:8080/redis.php нехай буде цей простий лічильник:

cat - >/data/data/com.termux/files/usr/share/apache2/default-site/htdocs/redis.php <<'SCRIPT'
<?php
$redis = new Redis();
$redis->connect('localhost', 6379);
echo $redis->incr('key1');
SCRIPT

Я запускав на цей лічильник Apache Benchmark, дивився і офігєвав. Двадцять років назад мої справжні веб-сервери були значно повільнішими, аніж нині якась маленька стара мобілка.

Додаткові можливості Android

Сам по собі Termux не має в своєму маніфесті багатьох дозволів, як-то доступ до камери чи доступ до даних геолокації. Натомість все це є в маніфесті окремого пакету Termux:API.

Встановлення Termux:API складається з двох частин:

  • знайти (через F-Droid) і встановити додаток Termux:API;
  • в консолі самого Termux встановити пакет termux-api штатним пакетним менеджером:
    pkg install termux-api
    

Далі можна користуватися функціями телефону: контролювати батарею, отримувати координати GPS, вмикати ліхтарик, робити фото, надсилати SMS та багато іншого, серйозного та несерйозного.

Зокрема, «Acquire wakelock» можна робити автоматично:

echo "termux-wake-lock" >> ~/.profile

Хоча можливостей тут багато, та завжди хочеться більше. Наприклад, доступ до USB тут майже ніякий. Можливо, колись я навчуся комунікувати з Arduino через нього, але не сьогодні :)

Мораль

Це прикольна штука, яка варта уваги. Сподіваюсь, цей пост кого-небудь надихне на експерименти.