LINUX.ORG.RU
ФорумMobile

Запуск полноценного ArchLinux без root прав на android

 


2

1

Навеяно вопросом 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)


Ответ на: комментарий от Radjah

Я имел в виду что им не пользуюсь. Плюс статья специфична и никого кроме линуксоидов не заинтересует. Давай не будем разводить срач в коментариях.

drjerk ()
Ответ на: комментарий от drjerk

Ты принёс какаху. Я тебе написал, что с какахами не сюда. Ты обиделся. Не надо было приносить какаху изначально. Твоя моя понимать?

Radjah ★★★★★ ()
Ответ на: комментарий от Radjah

Если ты во всём видишь какаху, то у меня для тебя не очень-то приятные новости

nutsandmilk ★★★ ()

Схоронил, может пригодится

Deleted ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.