Установка Archlinux на телефон с Android во второй раздел SD или просто подпапку системной карты памяти

  • Tutorial
image

Привет всем. Тут уже была статья на тему Botbrew, где в целом описано что это такое и что это дает. Вкратце:
Проект BotBrew призван решить многие проблемы с установкой Linux-софта, которые только могут возникнуть у пользователя, и подготовить систему Android к принятию инородных для нее приложений.

Обычный, классический Botbrew имеет свой репозиторий, но в нем мало пакетов, что грустно. Тем, кто действительно хочет беспредельничать, понравится Borbrew-Basil, который использует дебиановский репозиторий emdebian. Однако, с ним нынче тоже все грустно, так как
As of July 2014, updates to the Emdebian distributions ceased. There will be no further updates and no further stable releases.

Получается, что даже те, кто когда-то поставил себе emdebian, нынче в пролете. Данный пост будет о том, как поставить на рутованный телефон Archlinux, но не как обычно в loop образ, а на родную файловую систему Android или второй раздел SD. Предполагается, что имеется рутованный телефон с установленным busybox, включенной отладкой по USB и утилита adb на основном компьютере.

Готовим устройство


Первое, что нам понадобится — создать папку, куда будем ставить наш линух. Варианта два — папка на разделе /data или отдельный ext4 раздел карты памяти. Во втором случае раздел надо будет как-то смонтировать в основную ФС телефона. Сделать это можно например с помощью Link2SD. Далее я буду исходить из того, что используется второй раздел SD, смонтированный в /data/sdext2, ставить будем в папку /data/sdext2/arch.
Также надо понять, репозиторий для какой архитектуры процессора будем использовать. У меня Qumo Quest 454 с процессором armv7l и для него подошел http://mirror.archlinuxarm.org/arm/.

Подключаем телефон по USB, заходим на него через adb и понеслась.

Собираем минимальный стартовый вариант


Для минимальной установки понадобятся следующие пакеты (выполняем от рута, версии пакетов со временем могут стать новее):

mkdir -p /data/sdext2/arch/packages
cd /data/sdext2/arch/packages

wget http://mirror.archlinuxarm.org/arm/core/acl-2.2.52-2-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/attr-2.4.47-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/bash-4.3.030-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/bzip2-1.0.6-5-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/curl-7.39.0-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/e2fsprogs-1.42.12-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/expat-2.1.0-4-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/filesystem-2014.10-3-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/gcc-libs-4.9.2-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/glibc-2.20-4-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/gpgme-1.5.2-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/keyutils-1.5.9-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/krb5-1.13-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/libarchive-3.1.2-8-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/libassuan-2.1.3-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/libgpg-error-1.17-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/libidn-1.29-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/libssh2-1.4.3-2-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/lzo-2.08-3.1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/ncurses-5.9-6.1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/openssl-1.0.1.j-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/pacman-4.1.2-7-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/pacman-mirrorlist-20141208-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/readline-6.3.006-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/util-linux-2.25.2-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/xz-5.0.7-1-arm.pkg.tar.xz
wget http://mirror.archlinuxarm.org/arm/core/zlib-1.2.8-3-arm.pkg.tar.xz


После того, как все скачалось, распаковываем:
cd /data/sdext2/arch
tar xvf packages/*.pkg.xz 


У нас получилось что-то типа минимальной установки Archlinux. Теперь попробуем сделать в нее chroot, предварительно смонтировав системные папки ():

busybox mount -t proc none ./proc
busybox mount -o rbind /dev ./dev
busybox mount -t sysfs none ./sys
busybox mount -t tmpfs none ./tmp
busybox mount -o size=10%,mode=0755 -t tmpfs none ./run

chroot . /bin/bash


Если все прошло успешно, то запустится bash из нашего минимального окружения и станет доступен pacman. У меня при запуске любого процесса система ругалась, что не может найти libsuc.so, описанный в LD_PRELOAD. В этом случае просто чистим LD_PRELOAD:

export LD_PRELOAD=


Приводим в порядок пакеты


Итак, мы в chroot'е, у нас работает pacman и bash. Первым делом приведем в порядок то, что есть. Пропишем DNS и загрузим репозитории:

echo "nameserver 8.8.8.8" > /etc/resolv.conf
pacman -Sy


Теперь поставим официально то, что просто так распаковали и добавим остальные минимально необходимые для жизни пакеты и еще вернем на место dns, который нам побила установка filesystem:
pacman -S base --force --noconfirm
echo "nameserver 8.8.8.8" > /etc/resolv.conf


Если все прошло удачно, то имеем полноценный за вычетом systemd и ядра Archlinux. Выходим из chroot и размонтируем все, что намонтировали:

exit
umount ./dev/pts
umount ./dev/cpuctl
umount ./proc
umount ./sys
umount ./tmp
umount ./run


Добавляем автомонтирование и прочие плюшки


Чтобы пользоваться тем, что получилось легко и просто, прикрутим init от botbrew-basil. Это утилита, которая проверяет, смонтировано ли у нас все, что надо и делает chroot в наше окружение. Я не смог найти, как скачать ее с репозитория botbrew, поэтому пока что просто выложил на Яндекс.Диск, ссылка. Копируем init в /data/sdext2/arch и добавляем атрибут на исполнение.

Заходим в adb shell и набираем:
/data/sdext2/init /bin/bash


В результате все, что надо само однократно подмонтируется и мы окажемся в свежепоставленном Arch. В виде бонуса init создаст в корне chroot'а папки /storage, /mnt и /android, куда смонтирует куски оригинальной файловой системы.

Чтобы наслаждаться линухом не через USB провод, а прямо с телефона, можно прописать /data/sdext2/init /bin/bash в качестве шела в любимом терминале. Дальше можно по вкусу создать пользователей, поднять sshd и т.п. Но любой арчевод и так знает, как это сделать, поэтому здесь про это писать не буду.

Спасибо за внимание, дополнения и исправления приветствуются.

UPDATE: небольшой скрипт, который я запускаю один раз после ребута
Скрипт инициализации
#!/bin/bash

if [[ `whoami` != "root" ]]
then
    sudo bash $0 $@
    exit $?
fi

chmod 777 /tmp

c=`ps afx | grep /usr/sbin/sshd | grep -cv grep`

if [[ "$c" != "1" ]]
then
    echo Strating sshd
    /usr/sbin/sshd
else
    echo sshd already started
fi

if [[ ! -e /dev/fd ]]
then
    echo Creating /dev/fd links

    ln -s /proc/self/fd /dev/fd
    ln -s /proc/self/fd/0 /dev/stdin
    ln -s /proc/self/fd/1 /dev/stdout
    ln -s /proc/self/fd/2 /dev/stderr
fi

if [[ ! -e /dev/net/tun ]]
then
    echo Creating /dev/net/tun
    mkdir /dev/net
    ln -s /dev/tun /dev/net/tun
else
    echo /dev/net/tun already exists
fi
Share post

Comments 42

    0
    Круто, спасибо за гайд, пошёл пилить свой HTC One SV.
      +1
      Отпишитесь плиз о результате. Может быть, будет, что в статью добавить.
      0
      SGN 10.1, OmniROM 4.4
      После некоторых правок все завелось
        0
        можно по-подробнее про правки?
          +1
          Качал пакеты для armv7h, менял их версии в парочке строк

          ls packages/*.xz | xargs -n 1 tar xJf
          вместо
          tar xvf packages/*.pkg.xz

          mount -o bind /dev ./dev
          вместо
          mount -o rbind /dev ./dev

          Ну и после чрута пришлось добавить бин в путь
          PATH=$PATH:/bin
            +1
            rbind — штука важная, он рекурсивно монтирует вложенные точки. В данном случае вместе с /dev подцепятся /dev/cpuctl и /dev/pts
            Остальное, видимо, зависит от конкретного busybox'а. Спасибо.
              0
              Буду знать, пошел обновлять бизибокс.
              Ну и обратите внимание, что у меня tar регулярку для архивов не съел — ругался на отсутствие файла в архиве.
                0
                дык тар вроде бы тоже бизибоксовый
        +1
        Для распаковки пакетов использовал команду.
        find ./packages/*tar.xz -exec tar xvf {} \;   -print 
        

        пришлось скачать еще из за 404
        mirror.archlinuxarm.org/arm/core/gpgme-1.5.2-1-arm.pkg.tar.xz
        mirror.archlinuxarm.org/arm/core/pacman-4.1.2-7-arm.pkg.tar.xz
        mirror.archlinuxarm.org/arm/core/pacman-mirrorlist-20141208-1-arm.pkg.tar.xz

        И стоит указать что стоит поставить bysybox на смартфоне и все команды типа mount переделать в busybox mount
        так же я не смог примонтировать обычным способом и сделал
        busybox mount -o rbind /proc ./proc
        busybox mount -o rbind /dev ./dev
        busybox mount -o rbind /sys ./sys
        

        И после установки базовой системы мне пришлось заново внести dns сервер
        echo "nameserver 8.8.8.8" > /etc/resolv.conf
        
          0
          Угу, спасибо, про dns сейчас добавлю. Насчет busybox, у меня, видимо, он очень удачно поставлен. mount сразу от него подцепился.
          +1
          Объясните пожалуйста зачем ставить арч линукс на телефон? Да любой линукс? =)
          Я понимаю что Андроид это тоже линукс и в курсе что существует ubuntu touch, какие это даст преимущества? какая цель? just for fun?
            +2
            Где ваша романтика, погребена под слоем казуальных «злых птиц»?
            Как же сладка возможность запуска nmap на телефоне, и сборка/установка любых пакетов с исходников…
              +1
              Видимо разные понятия о романтике, интереснее написать программу, чем мудрить с установкой чужих под разное железо =)
              +4
              Во-первых
              image


              А во-вторых, иногда бывает полезно иметь под рукой полный набор линуховых тулзов, а с собой только телефон. Или например, icmp или openvpn тунель поднять из аэропорта до дома и т.п.
                0
                Кстати о туннелях. А как там с WiFi?
                  0
                  Все хорошо. У меня не работает только aircrack-ng. Говорит, что драйвер режим монитора не поддерживает. В остальном обычный wlan0.
                    0
                    Вы только что потеряли 50% потенциальных установок )
                      +1
                      Работоспособность aircrack зависит от конкретного девайса и ядра. У других вполне может работать. Надо пробовать.
                +1
                Мне, например, нужен для полноценной Web-разработки «в дороге»/«на скамейке». Имеющиеся решения (http-сервер, php, mysql...) под Android слишком неудобны. Правда, я не понял, зачем нужно так сильно извращаться, как в топикстарте, мне хватает по уши простого и удобного Linux Deploy. А уже в него, хоть Ubutnu, хоть Debian, хоть Kali, хоть тот же Arch. И туда полноценные пакеты.

                (Да, предвосхищая холиворы об удобстве разработки на планшетах — речь о клавиатурнике Asus Transformer. И предвосхищая холиворы «Mac Air или планшет под Win8 лучше» — Transformer у меня уже есть, давно, и менять пока не планирую, так что и пользуюсь тем, что есть :) )
                  0
                  ЕМНИП Linux Deploy ставится в loop образ и не позволяет просто так взять и открыть установленную систему в обычном терминале. Плюс в моем случае доступна файловая система самого андроида. Доступна ли она в Linux Deploy не помню.
                    0
                    Возможность примоунтить каталог с андроида у Linux deploy точно есть. Да и установка на отдельный раздел, насколько я помню так же имеется.
                      0
                      Доступ из терминала по ssh из коробки, vnc, возможность в полпинка примонтировать любые папки андроида
                        +1
                        Под Андроидом принципиальной разницы между «обычным терминалом» и ssh-клиентом нет. И там, и там придётся ставить и запускать отдельное приложение. И в том же ssh терминал будет совершенно полноценный. Вот моё «рабочее место»:

                          0
                          Мое выглядит примерно также, только вместо ssh Android Terminal Emulator. Кому как удобнее.
                      0
                      Мне один раз пригодилось на планшете — запускал одну специфичную самописную gui утилиту на Python. Лучше чтоб была возможность что то сделать, чем когда её нет.
                      0
                      хотел бы видеть рабочие скриншоты
                        0
                        Чего? Консоли?
                        Вот





                        Установку не скринил.
                          0
                          Пардон, я хотел написать выше, пользователю iSodeska
                          0
                          Добавил скрипт инициализации. Запускается один раз после ребута телефона, наводит симлинки, которых не хватает и запускает sshd.
                            0
                            И еще один вопрос. Как я понимаю на Планшете тоже пойдет?
                            ASUS ME
                              0
                              конечно
                              +1
                              А из тех, кто пробовал ставить дистрибутивы linux паралельно или вместо андроида, кто-нибудь достиг хорошего результата?
                              Помню было несколько постов, но у авторов много чего не работало (железо, или даже софт был совсем не удобен).
                                0
                                Разворачивал на SGN 10.1 через Linux Deploy образ, потом шил кем-то сделанный загрузчик в раздел рекавери и грузился в образ линукса зажиманием кнопок при включении. Был гном3 и прочая лабуда
                                  0
                                  Расскажите о впечатлениях: что взлетело из железа, что не взлетело, что было невозможно юзать на touch-интерфейсе.
                                    0
                                    Гном для тача удобен, но педалил в виду отсутствия нормальных либ под Mali-MP400. Вафля работала.
                                    Много не скажу — просто поверхностно поглядел и снес. Но опыт был, хоть и небольшой.
                                    Могу поискать ссылки на XDA
                                      0
                                      Радиоинтерфейс я так понимаю не завёлся? Или вы не пробовали?
                                        0
                                        Радио? Нет, не пробовал — я им не пользуюсь, тем более на планшете.
                                          0
                                          Возможно вы меня не правильно поняли. Я про GSM, 3G, EDGE, звонки, смс.
                                            +1
                                            Ну да, пятница, вечер… Нет, я не пробовал, но скажу, что скорее всего нет. Да и дело было давно, года два назад.
                                0
                                Успешно установил арч на Google Nexus 7 (2013). Пришлось только изменить версию ncruses и вроде бы gpgme.
                                Есть только одна странность. Команда pacman -Syu работает как надо — обновления скачиваются с сервера. Утилита, синхронизирующаяся с сервером taskwarrior, тоже работает как часы.
                                Но при этом, банальная команда ping -c3 8.8.8.8 возвращает socket: Permission denied. Решения данной проблемы я, увы, пока-что не нашел.

                                P.S. Естественно, команды запускались в арчлинуксе, от рута.
                                  0
                                  P.P.S. При всём при этом nmap работает! =)
                                    0
                                    возможно, пингу не хватает SUID.
                                    $ sudo chmod u+s /bin/ping
                                    

                                    но по идее он и так работать должен, если из-под рута…

                                  Only users with full accounts can post comments. Log in, please.