Запуск полноценного ArchLinux без root прав на android
Навеяно вопросом mandala ниже
Все действия на ваш страх и риск
Немного теории
Есть такая библиотека ptrace.h
ptrace - тоже самое что strace, только позволяет изменять результат системных вызовов
Например подменив вызов getuid()/setuid() можно заставить приложение думать что оно запущено из под рута
Подменив fstat() можно изменить структуру файлов
proot
На этой библиотеке написана утиля proot.
proot умеет эмулировать chroot и mount --bind без root прав.
Где добыть ArchLinux под arm
Здесь - https://archlinuxarm.org/platforms/armv8/generic ,если у вас aarch64 (на нём тестировал)
Здесь - https://archlinuxarm.org ,если armv7
Исправляем проблемы архива
0) Для начала распакуем архив (на компьютере)
umask 022
mkdir arch
cd arch
sudo tar xvfp ~/Downloads/ArchLinux.tar.gz (важно это сделать из под рута)
1) Неправильные права директорий
Часть директорий связаных с openssl имеют права 555, и при распаковке под обычным пользователем, это приводит к ошибке.
chmod -R u+w ./arch
2) Жесткие ссылки
Не знаю зачем они нужны (если есть symlink), но android на «ln a b» выдает «permission denied»
Поэтому упаковываем с флагом "--hard-dereference"
sudo tar cvzfp arch.tar.gz --hard-dereference ./arch
Запускаем ArchLinux
Разумеется нам понадобится эмулятор терминала.
Лучше всего изпользовать Termux (бесплатный, OpenSource), так как в нем есть менеджер пакетов, и proot устанавливается очень просто.
1. (В termux)
termux-setup-storage (SD Карта)
pkg install proot
2. Копируем перепакованый arch.tar.gz на телефон (например используя netcat)
3. Распаковываем в ~/arch
umask 022 (В termux)
tar xvfp arch.tar.gz (В termux)
4. Пишем скрипт для запуска
#!/data/data/com.termux/files/usr/bin/bash
rootdir="/data/data/com.termux/files/home/arch" # /
tmp_prefix="/data/data/com.termux/files/usr/tmp" # здесь будут храниться временные файлы (/tmp, /run)
sid="${RANDOM}${RANDOM}${RANDOM}${RANDOM}" # mktemp -d для слабаков
run_bind="${tmp_prefix}/run${sid}" # /run
tmp_bind="${tmp_prefix}/tmp${sid}" # /tmp
resolv_conf="${run_bind}/resolv.conf" # список dns
mkdir "$tmp_bind"
chmod 777 "$tmp_bind"
mkdir "$run_bind"
chmod 777 "$run_bind"
for i in `seq 1 4`; do
if [[ ! -z `getprop net.dns${i}` ]]; then
echo nameserver `getprop net.dns${i}` >> "$resolv_conf"
fi
done
# настроили dns
proot --link2symlink -0 -m "${run_bind}:/run" -m "${tmp_bind}:/tmp" -m /sdcard -m /dev -m /sys -m /proc -w / -r "${rootdir}" /bin/su - root # сам proot, флаг --link2symlink не документирован, но черезвычайно полезен
rm -rf "$run_bind"
rm -rf "$tmp_bind" # Стираем временные файлы перед выходом
Настраиваем dns в ArchLinux
chmod +x ./arch.bash (В termux, arch.bash - скриптик выше)
./arch.bash (В termux)
rm /etc/resolv.conf (В ArchLinux)
ln -s /run/resolv.conf /etc/resolv.conf (В ArchLinux)