Я испробовал множество средств для установки Linux на свое Android устройство, но все они или не работали вовсе, или были слишком глючные. К счастью я использую на ПК ArchLinux и узнав о проекте ArchLinux ARM решил попробовать его в деле. И не просто установить в chroot, а заставить его работать и без него.

Нам потребуется


  • Прямые руки
  • Android устройство
  • Root доступ
  • Busybox
  • Эмулятор терминала
  • Свободное место
  • ADB(для удобства)

Все действия Вы выполняете на свой страх и риск.


Я использовал


  • Устройство Android 4.2 с 512Мб ОЗУ, ядро Linux 3.4.5 armv7l
  • Эмулятор терминала ConnectBot
  • Управление суперпольпользователем SuperSU
  • BusyBox v1.20.0

Часть 1: Подготовка


1. Скачаем архив с ArchLinux ARM с зеркала:

wget http://mirror.yandex.ru/archlinux-arm/os/ArchLinuxARM-armv7-latest.tar.gz
mv ArchLinuxARM-armv7-latest.tar.gz ArchLinuxARM.tar.gz
adb push ArchLinuxARM.tar.gz /sdcard/

Дальнейшие действия необходимо проделывать на Android устройстве

2. Создаем файл для будущего образа с помощью make_ext4fs.

Если у вас есть отдельный раздел на карте памяти — желательно использовать его. В моем случае 16Гб SD карта была забита важными данными и возможности сдвинуть главный FAT раздел не было.

В зависимости от настроек /sdcard может быть как внешней, так и внутренней картой памяти.

cd sdcard
make_ext4fs -l 3221225472 arch.img

3221225472 это 1024*1024*1024*3, следовательно будет создан образ в 3Гб. Размер образа определите для себя по вкусу. Помните что на FAT32 нельзя создать файл больше 4Гб

3. Примонтируем образ и распакуем файлы ArchLinux ARM

mount -o rw,remount /
mkdir /arch
busybox mount /sdcard/arch.img /arch
tar -xvf ArchLinuxARM.tar.gz -C /arch/

4. Несмотря на то, что наша цель — обойтись без chroot, для базовой настройки и проверки работоспособности chroot все же нужно сделать. В противном случае обновлять, доставлять пакеты Вам придется уже на боевой системе.

busybox mount -t proc none /arch/proc
busybox mount -o rbind /dev /arch/dev
busybox mount -t tmpfs none /arch/tmp
busybox mount -o size=10%,mode=0755 -t tmpfs none /arch/run
chroot /arch /bin/bash

Часть 2: Поиск и решение проблем


Проблема 1: ping не работает


Попробуем ping

ping 8.8.8.8
socket: Permission denied

Вспоминаем, что у Android серьезная система разграничения прав. И в нем существует пермишен на «Полный доступ к сети». Без этого пермишшена пользователи не могут получить полный доступ к сокетам. То что надо.

Вернемся к Android консоли и пропишем комманду id:

uid=2000(shell) gid=2000(shell) groups=1003(graphics),1004(input),1007(log),1009(mount),1011(adb),1015(sdcard_rw),1028(sdcard_r),3001(net_bt_admin),3002(net_bt),3003(inet),3006(net_bw_stats)

У вас вывод может быть другой

groupadd -g 3003 inet
usermod -a -G inet root

Но вот незадача, chroot не обновляет group. Поможет вот такой «хак»:

su root

Пробуем еще раз:

ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=59 time=89.6 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=59 time=88.6 ms

Проблема 2: Не работает DNS


Удаляем симлинк на systemd и запишем нормальные DNS:

rm /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Если Вы запороли PATH


Если произошло такое, что простые комманды вида ls,cat,su не работают(не видятся) системой, Вы можете попробывать вызвать их напрямую: /system/bin/ls, /system/bin/cat, /system/xbin/su.
Или перезагрузить устройство.

Ставим необходимые пакеты


pacman -S gcc htop iotop sudo openssh

Проверяем gcc


cd /root
nano main.cpp

#include <iostream>
int main() {
std::cout << "Hello World!\n";
return 0;
}


g++ main.cpp
./a.out

Часть 3: Подготовка к работе без chroot


Самое главное, что позволяет ArchLinux работать без chroot рядом с андроидом — тот факт, что папки и файлы ArchLinux и андроид различны и не мешают друг другу.

Если Вы не уверены в том, что файлы не пересекутся, выполните эти команды из Android консоли:

ls /etc/ > /sdcard/ls.txt
ls /arch/etc/ > /sdcard/ls2.txt
busybox grep -F -f /sdcard/ls.txt /sdcard/ls2.txt

Покажет пересечение файлов. У меня это выглядит так:

dhcpcd.conf
hosts
security

Выполним копирование файлов из /etc/ в /arch/etc/ из Android:

cp -Ra /etc/* /arch/etc/
cp -a /sbin/adbd /arch/usr/bin/

Ключ -a обязателен, так как при использовании обычного -R права скопированы не будут.

Нужно заранее позаботится о Root.


Android приложения требуют, что бы комманда su сразу же давала доступ к суперпользователю и не запрашивала пароль.

passwd
mv /usr/bin/su /usr/bin/su.r

Часть 4: Поехали!


Создадим нужные каталоги и воспользуемся mount --bind что бы виртуально заменить директорию, не изменяя ее на диске.

mkdir /lib
mkdir /bin
mkdir /xbin
mkdir /opt
mkdir /usr
mkdir /home
mkdir /run
mkdir /srv
mkdir /tmp
mkdir /var
busybox mount --bind /arch/etc /etc
busybox mount --bind /arch/opt /opt
busybox mount --bind /arch/home /home
busybox mount -o size=10%,mode=0755 -t tmpfs none /run
busybox mount --bind /arch/srv /srv
busybox mount -t tmpfs none /tmp
busybox mount --bind /arch/sbin /sbin
busybox mount --bind /arch/usr/ /usr
busybox mount --bind /arch/var/ /var
busybox mount --bind /arch/lib/ /lib
busybox mount --bind /arch/usr/bin/ /bin
/bin/bash

Если что-то сделано неправильно, Вы можете перезагрузить устройство и попробовать снова. Порядок монтирования важен. При ошибке с монтированием стандартные команды могут взятся из ArchLinux до того, как все каталоги будут смонтированы.

Что дальше


В итоге мы имеем практически полноценный ArchLinux за исключением systemd с свежими версиями пакетов.

Можно установить http, php, mysql. При правильной настройке на уменьшение потребления памяти даже на моем смартфоне с ОЗУ 512Мб они работали корректно.

Можно установить иксовые библиотеки и с помощью X сервера для Android пользоваться ПО для линукса. xterm заработал корректно.

Можно собирать любые программы (и, о нет, ядра) для Linux без ПК.
Можно установить Java для ARM и использовать Java приложения.

Послесловие


Большой проблемой остается systemd и его привязка к PID 1. Для того, что бы сохранить PID 1 нужно влезть в init андроида и прописать exec после инициализации устройств. Это можно сделать заменив init андроида shell скриптом, но тогда остается вопрос что делать с оригинальным init андроида. Так как место на загрузочном диске ограничено несколькими мегабайтами, нужно будет использовать switch_root в заранее созданный образ. Мне пока не удалось завести systemd таким способом.

Мне 16, и это моя первая публикация. Конструктивная критика приветствуется.
Поделиться с друзьями
-->

Комментарии (19)


  1. nkozhevnikov
    24.06.2017 15:14
    +1

    Это всё интересно, но…
    Можно ли поставить арч/что-нибудь вместо андроида? Чисто теоретически.


    1. Gravit
      24.06.2017 15:16

      Теоретически да.
      Если systemd удастся запустить, то и оставшаяся часть не составит проблем.
      Большой вопрос как это сделать в условиях разметки Android.


    1. Intel777
      24.06.2017 16:13

      У некоторых даже получалось, и даже тема на 4пда есть.


      1. twaikyont
        25.06.2017 14:52
        +1

        Эта тема конечно хороша, но там нет решения проблемы драйверов.
        Можно собрать libhybris, но даже с ним нет никакого способа подружить Xorg андроидом (имеется ввиду с графическим ускорителем, framebuffer, XServer XSDL и VNC не считаются). Glamor пробовали запустить напрямую на EGL, глючит не по-детски. Использование Wayland+Xwayland пока не опробовал, но я слышл что там какие-то проблемы с GLX.
        Звук можно вывести даже без драйверов, в связке PulseAudio/Alsa и прогой, которая читает звук из pipe и выводит через OpenSL ES. У меня уже несколько версий лежит. В том числе можно выводить через SimpleProtocol. Есть несколько приложений на Java.
        Нет поддержки многих SysV механизмов в ядре, в том числе shared memory, RPC и прочего. Взамен там есть ashmem и binder, но чтобы заменить использовать их в glibc-дистрибутиве придется писать библиотеку, в которой shmget, shmctl и функции RPC будут использовать ashmem и binder.

        И таких нюансов очень много. Тем, что уже есть (Linux Deploy, GnuRoot) пользоваться уже можно, но везде выскакивают разные косяки.


  1. frol
    24.06.2017 15:59
    +1

    А чем Вам не угодило chroot окружение, что потребовалось так поиздеваться над "хост" системой? Вычистить этого мутанта будет та ещё проблема, если вдруг что-то пойдёт не так, да и если новую прошивку ставить, то гораздо проще использовать chroot, который может даже на SD карте жить, чем как-то это дело бекапить. Кстати, гораздо удобнее сделать раздел с ext2/3/4 файловой системой вместо использования файла в качестве root раздела, но если карта памяти не поддерживается, то да, файловый "раздел" очень выручит.


    1. Gravit
      24.06.2017 16:11

      chroot окружение не позволит работать с systemd, так как systemd «знает» о том, что мы в chroot и отказывается работать.
      «Подружить» Android и ArchLinux ARM на одном root — первый шаг к запуску systemd парралельно с андроидом.
      Плюс не нужно переключатся между консолью chroot и самим андроидом.
      По поводу проблем — они маловероятны, во всяком случае я их не заметил.
      Все основные бинарнки находятся в /system/bin, а арч его не трогает.
      Раздел действительно более лучший вариант в плане производительности, однако моя карта памяти имеет лишь 1 FAT раздел, весь занятый данными. Об этом в статье упоминается.


      1. gmelikov
        24.06.2017 21:37

        Всё же — чем вам не угодил chroot, кроме как «Плюс не нужно переключатся между консолью chroot и самим андроидом»? Systemd вы всё равно не завели.

        Ну и ставить лучше на отдельный раздел, согласен с предыдущим комментатором, производительность всё же не высокая.


      1. Uirandir
        25.06.2017 03:32

        Инит может быть только один. Так что шаг первый и он же последний. Не выйдет запустить systemd и андроидовский инет, не выйдет и подменить один другим.
        Если уж хочется поиграть с Linux-based OS на АРМе, то можно купить за 15 евро какой-нибудь Orange Pi Zero и на нем играть, а попутно упражняться на нем в поднятии любых сервисов, ибо будет полноценная система.


        1. Gravit
          25.06.2017 04:15

          Мне не нужен чистый ArchLinux ARM на устройстве без Android'а и Android приложений. Смысл как раз в парралельной работе Android и ArchLinux на одном root.
          PID 1 только один, не больше. Вариантов как такое сделать много, и это тема для отдельной статьи. Возможно эти попытки будут успешны. Возможно и нет.


          1. Uirandir
            25.06.2017 04:44
            +1

            Попытки не будут успешными. Это я вам обещаю. Все же 20 лет опыта за плечами ;)
            Почитайте про lxc, lxc под андроид был, чем загаживать / бедного андроида лучше попробуйте в lxc-тазу систему поднять, хоть рач, хоть нормальный Debian/Ubuntu.


        1. twaikyont
          25.06.2017 16:58

          не выйдет и подменить один другим.
          А вот это спорное утверждение. Можно пересобрать Android Init и потом в init.rc добавить что-то вроде service systemd /bin/systemd
          #class main
          oneshot

          Когда система загрузится и примонтируется выполнить команду
          setprop ctl.start systemd
          

          Тогда запустится systemd. Но андроидовые сервисы похоже нельзя будет запустить/остановить с помощью «start/stop/setprop ctl.start/setprop ctl.stop». Я не знаю, использует ли андроид этот функционал после полной загрузки.


          1. twaikyont
            25.06.2017 17:13

            Эммм… Не могу отредактировать коммент. Там, в описании service systemd должен быть exec /bin/systemd. Или может я то-то не совсем правильно понимаю.


  1. Uirandir
    25.06.2017 13:35
    +1

    Если тебе 16 и ты хочешь разбираться с Linux-based OS, то мой совет: не пытайся делать это на гибриде Андроида и Рача. Андроид — Linux-based, но он имеет слабое отношение к реальным десктопным и серверным системам, общего только ядро, а все остальное отличается. Поставь Debian/Ubuntu, разбирайся с настройками сервисов, учись. Ты — молодец, что попробовал сделать то, что сделал, но к реальной работе это отношения не имеет. Учись тому, что будет нужно в реальной жизни. Ставь Debian/Ubuntu, настраивай nginx, настраивай к нему php-fpm, поднимай какой-нибудь сайт, пусть у себя в локалке. Это будет полезно тебе в жизни. Когда клавиатура упадет из рук моего поколения кто-то должен ее поднять и админить сервера, интернету нужны сервера, а серверам нужны админы. Желание учиться это прекрасно, но ты тратишь время на бесполезные глупости. Остановись, посмотри что реально нужно и учись.
    Удачи в твоих начинаниях.
    Если нужна помощь админа с большим опытом, то стучись в личку. Я начинал админить, когда ты еще не родился и опыта накопилось много, чем-нибудь поделюсь.


    1. Gravit
      25.06.2017 13:55

      Спасибо за такой приятный комментарий, и за предложение помочь. В своей поседневной работе за ПК я использую ArchLinux. Установил я его задолго до того, как написал эту статью, и опыт, полученный при работе с арчем помог решить несколько проблем, описанных в статье. Моей первой Linux-based ОС была Ubuntu, и в процессе поисков и проб остановился на арче.
      Задолго до этой статьи я успел посмотреть и nginx, и php, и mysql, и еще много всего. Этот «гибрид» Android и арча не является средством изучения Linux-based ОС, и тем более не первая моя Linux-based ОС.


      1. Uirandir
        25.06.2017 14:40
        +1

        Рач используется сугубо для того, что бы с ним играться. Ты никогда его не встретишь в реальной жизни. В реальной жизни будут Debian/Ubuntu и RHEL/CentOS, потому использовать нужно их и учиться нужно на их. А рач, генту и прочие слаквари оставить для тех, кто хочет играться с системой и чесать ЧСВ.
        Сейчас есть один плюс, что даже рач использует systemd, как настоящие рабочие дистрибутивы, таким образом не придется переучиваться к новым условиям, когда окажешься в реальной жизни. Но все остальное, включая расположение конфигов, нужно знать из настоящих систем.

        Еще раз могу пожелать удачи, молодец, что учишься и развиваешься. Рад, что такие как ты есть и будут, так спокойней жить, зная, что наши сервера будет кому принять, когда нас понесут на кладбище.


        1. evg_krsk
          25.06.2017 20:10
          +1

          Никогда не говори "никогда" :-)


          Тоже думал что рач в вакансии это прикол такой, тем более что собеседование это вроде бы неявно подтверждало. Но нет, кучка рачей в продуктиве и (квалифицированный) человек понаставивший их ушел т.к. ему перестало быть интересно. Не надо так.


          Да, системд унифицирует, но рачу это не помогает не разваливаться от дуновения ветра. Всё не доходят руки расформировать последний экземпляр.


        1. ivanmilov
          26.06.2017 02:33

          Рач используется сугубо для того, что бы с ним играться. Ты никогда его не встретишь в реальной жизни.

          Можете объяснить? Использовал Арч для разработки, использую дома, не играюсь с системой. По вашему «реальная жизнь» — это только сервера?


        1. fourfourtwothree
          26.06.2017 02:33
          +1

          Простите, зацепило, в Вашей формулировке выглядело, что Arch не совсем недосистема только потому, что использует systemd? Вы эдаким макаром холиварную тему поднимаете. А то, что по многим проблемам и вопросам одной из первых всплывает в поисковиках арчевики, в которой уже многие вопросы поднимались и решения описываемые там помогают не только в Arch'еподобных дистрибутивах, в плюс не идёт, так? Не надо принижать одни дистрибутивы и превозносить другие, масса инструментов работает вполне одинаково и в первых и во вторых, больший вопрос качества владения именно этими инструментами, а не конкретным дистрибутивом. Для обучения Linux подойдёт любой, хоть LFS пусть мучает — главное знания полученные в процессе. Пока что своей формулировкой о ЧСВ, Вы чесали только своё. Ещё прошу прощения, понимаю, что Debian и RHEL — это бизнес уровень и стандарт, но не надо к этому ещё и Ubuntu приписывать, но при этом плеваться от Arch. С какими задачами по Вашему мнению не справится Arch?

          настраивай nginx, настраивай к нему php-fpm, поднимай какой-нибудь сайт
          не привязаны к дистрибутиву.


    1. scarab
      30.06.2017 18:51

      Уважаемый, не надо загаживать голову молодому бойцу :)

      Проблема нашего поколения как раз в том, что мы за свои 20-30 лет опыта слишком хорошо узнали, что возможно, а что нет. А вот головастая молодёжь иной раз делает сногсшибательные вещи просто потому, что ещё не знает, что это невозможно. Им ещё никто этого не сказал.

      Людей, способных настроить nginx с php-fpm на рынке — навалом. А вот умеющих поставить линукс на андроид — крайне мало. При этом вот лично у меня есть задачи, требующие именно таких решений (а не линукса на арме за $15).

      Этот чувак — он примерно как тульский Левша. А Вы ему предлагаете превратиться в ремесленника, которых и так навалом. Да чёрт побери, я таких, как он, днём с огнём не могу найти, потому что все кругом старые и умные и достоверно знающие, с какой стороны у бутерброда масло.