В этой заметке я расскажу как собрать своё Linux-окружение на Android-смартфоне
без прав root (рутовать телефон не надо). Можно конечно взять готовые решения в
Google Play Store, но можно и пройти этот путь самостоятельно.
Если вы решите повторить мой опыт, то вы получите Xfce4-окружение с псевдо
пользователем root на своём мобильном телефоне с Android. Работает это почти
без отличий от реального пользователя root, только конечно модифицировать сам
телефон это возможности не даёт. Итак приступим.
Termux
Установим в Android приложение Termux (требуется Android версии 7 или выше).
Это наше базовое Linux окружение и отправная точка. Запуская его мы попадаем в
шелл с домашним каталогом, который будем называть TERMUX_HOME.
Итак в TERMUX_HOME установим требуемые нам начальные пакеты:
pkg install root-repo
pkg install proot
pkg install debootstrap
pkg install nano
pkg install wget
pkg install man
Debootstrap
Теперь можно устанавливать Linux окружение.
Проверим нашу архитектуру.
uname -ar
Linux localhost 4.9.193-perf-gc285628 #1 SMP PREEMT Fri Aug 6 02:12:50 CST 2021 aarch64 Android
Моя архитектура 64-битная, значит --arch=arm64. Если у вас архитектура
32-битная, то ваш вариант --arch=armhf
В TERMUX_HOME:
mkdir ./chroot
debootstrap --arch=arm64 bullseye ./chroot http://mirror.yandex.ru/debian
mkdir ./chroot/system
mkdir ./chroot/apex
mkdir ./chroot/home/user
Вот мы получили базовое окружение. Правда dpkg configure отработает наверное с
некоторыми ошибками, но войти в окружение уже можно. Ошибки мы разберём позже.
Вход в Linux окружение
Вход под псевдо рутом нам позволяет команда proot, которую мы установили ранее.
В TEMUX_HOME создадим скрипт входа start.sh:
#!/data/data/com.termux/files/usr/bin/sh
unset LD_PRELOAD
proot \
-0 \
--link2symlink \
-w /root \
-r ./chroot \
-b /sys/ \
-b /system \
-b /apex \
-b /proc/ \
-b /dev/ \
-b /dev/pts/ \
/usr/bin/env \
-i \
HOME=/root \
LD_LIBRARY_PATH=/system/lib64:/system/apex/com.android.runtime.release/lib64 \
XDG_RUNTIME_DIR=/tmp \
DISPLAY=127.0.0.1:0 \
PULSE_SERVER=tcp:127.0.0.1:4713 \
TERM="xterm-256color" \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login
Для входа не под root (опционально) создайте скрипт входа ustart.sh:
#!/data/data/com.termux/files/usr/bin/sh
unset LD_PRELOAD
proot \
--link2symlink \
-w /root \
-r ./chroot \
-b /sys/ \
-b /system \
-b /apex \
-b /proc/ \
-b /dev/ \
-b /dev/pts/ \
/usr/bin/env \
-i \
HOME=/home/user \
LD_LIBRARY_PATH=/system/lib64:/system/apex/com.android.runtime.release/lib64 \
XDG_RUNTIME_DIR=/tmp \
DISPLAY=127.0.0.1:0 \
PULSE_SERVER=tcp:127.0.0.1:4713 \
TERM="xterm-256color" \
PATH=/bin:/usr/bin:/sbin:/usr/sbin \
/bin/bash --login
Для 32-битного окружение поправьте LD_LIBRARY_PATH
Сделаем скрипты исполняемыми:
chmod a+x start.sh
chmod a+x ustart.sh
Теперь можно войти в окружение:
./start.sh
root@localhost:~#
Вот мы и псевдо root :).
Назовём это ENV_HOME.
Ошибки dpkg
Ошибки dpkg в основном у меня были связаны с неправильной работой
утилиты adduser при добавлении системных пользователей. Поэтому чтобы избежать
их сразу дополним файлы (в ENV_HOME)
/etc/passwd:
systemd-timesync:x:100:102:systemd Time Synchronization,,,:/run/systemd:/usr/sbin/nologin
systemd-network:x:101:103:systemd Network Management,,,:/run/systemd:/usr/sbin/nologin
systemd-resolve:x:102:104:systemd Resolver,,,:/run/systemd:/usr/sbin/nologin
_apt:x:103:65534::/nonexistent:/usr/sbin/nologin
messagebus:x:104:110::/nonexistent:/usr/sbin/nologin
statd:x:106:65534::/var/lib/nfs:/usr/sbin/nologin
avahi:x:108:113:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/usr/sbin/nologin
systemd-coredump:x:996:996:systemd Core Dumper:/:/usr/sbin/nologin
user:x:10264:10264:User:/home/user:/bin.bash
/etc/group:
systemd-journal:x:101:
systemd-timesync:x:102:
systemd-network:x:103:
systemd-resolve:x:104:
netdev:x:109:pi
messagebus:x:110:
avahi:x:113:
systemd-coredump:x:996:
user:x:10264:
Здесь id 10264 это id моего пользователь в TERMUX_HOME. У вас может быть другое число.
Второй хук для неисправных пакетов заключается в убирании скриптов конфигурирования (в ENV_HOME):
mv /var/lib/dpkg/info/<package>* /tmp/
Установка остальных пакетов
В ENV_HOME выполним
apt install xfce4 dbus-x11
Мы готовы запустить графическую оболочку, для этого нам нужен X сервер.
X сервер
В Android установите приложение XServer XSDL. Этот сервер имеет также
звуковую pulseaudio подсистему. Ранее в скриптах входа в окружение в команде
proot мы передали переменные DISPLAY и PULSE_SERVER, так что у нас все готово
для запуска (в ENV_HOME):
xfce4-session
Должна запуститься графическая оболочка, звук тоже должен работать (звуковой
вход не поддерживается только воспроизведение).
Xserver XSDL может показаться сначала не очень красивым, но он хорошо
функционален и красоты можно добиться. Мои параметры:
ориентация портретная, разрешение нативное, дурацкие кнопки alt-shift-чего-то
скрыты (они у меня всё равно не работают или я не понял как), мышь в режиме
телефон-тачпад. Можно еще попробовать поиграться с xrandr если поддерживается
для использования виртуального пространства X сервера, я не пробовал.
Библиотеки Android
В аргументах команды proot мы пробросили в окружение Android каталоги /system и /apex.
Так что нам доступны Android библитеки /system/lib /system/lib64.
Например мне нужно было чтобы правильно отрабатывала команда
ldd /system/lib64/libOpenSLES.so
(не должно быть "not found").
Если ldd отрабатывает неправильно, то обратите внимание, библиотеки в
/system/lib* могут быть симлинками на другие места. Возможно надо подбиндить
другие каталоги Android и(или) поправить LD_LIBRARY_PATH.
Благодарности
Выражаю свою благодарность Sergii Pylypenko (pelya) за его труд - автору проектов
XServer XSDL, pulseaudio-android, xserver-xsdl, Debian noroot. У
него я подсмотрел многое.
|