запуск линукс приложений на андроид
Запуск Linux на Android
Полноценная операционная система Linux на Android смартфоне может быть очень полезной. Во-первых, можно запустить любую необходимую программу linux, или даже сервис. Вы можете запустить веб-сервер, сервер баз данных или все что захотите. Во-вторых, если у вас планшет с большим расширением экрана, то с помощью клавиатуры и мыши его можно превратить в полноценную рабочую станцию. А учитывая, что мы будем запускать Linux без эмулятора, то получим отличную производительность для игр и просмотра видео.
Операционная система Android основана на ядре Linux, поэтому запуск Linux на Android смартфоне возможен, и даже не так сложен как кажется. Полностью заменить Android на Linux не получится из-за особенностей ARM загрузчика и большого разнообразия драйверов устройств, которые поддерживаются только ядрами производителей. Можно разве что установить специально адаптированную Ubuntu Phone, но это уже совсем другая история. Запускать Linux в эмуляторе мы тоже не будем, мы возьмем ARM версию дистрибутива Linux и запустим его в chroot контейнере уже работающего ядра Android.
Нам понадобиться
Весь перечисленный софт можно скачать и установить с Google Play или форума 4pda. Далее, я буду предполагать что на вашем устройстве уже есть Root права. Начнем запуск linux на android.
Подготовка смартфона
Сначала устанавливаем BusyBox. Зайдите на страницу программы в Google Play и нажмите установить. Когда программа установится, нужно ее запустить и еще раз нажать кнопку install для распаковки всех необходимых компонентов:
Остальные программы устанавливаются стандартным способом из Google Play.
Развертывание Linux на Android
Устанавливать Linux будем с помощью приложения Linux Deploy. Запустите приложение, откройте главное меню программы и выберите пункт Настройки:
Здесь желательно поставить галочки не отключать экран и не отключать wifi, чтобы эти функции работали во пока вы не выключите Linux:
Затем пролистайте вниз и коснитесь пункта обновить окружение. Программе необходимо скачать несколько мегабайт окружения для нормальной работы:
Больше ничего в настройках менять не нужно, Переходим к установке Linux. В главном окне коснитесь значка с логотипом загрузки:
Перед тем как нажать кнопку установить необходимо настроить параметры будущей системы, сначала выберите дистрибутив и версию системы, например, Ubuntu Wily, архитектуру, можно оставить как есть armhf:
Потом меняем имя пользователя и пароль, локаль выбираем ru_RU.UTF-8 для поддержки русского языка:
Выбираем окружение рабочего стола если нужно и дополнительные компоненты. Окружение у нас будет LXDE, дополнительные компоненты оставляем только окружение рабочего стола и ssh сервер. Х сервер нам не нужен, так как будем использовать XSDL Server.
Потом ставим галочку напротив GUI:
Дальше можете возвращаться в самый верх и нажимать кнопку установить. Установка linux на android займет около полчаса.
Запуск Linux
Осталось запустить linux на смартфоне. Сначала запускаем XSDL Server, выбираем расширение экрана:
Затем размер шрифта:
Переходим в Linux Deploy и нажимаем кнопку старт:
Возвращаемся в XSDL Server и ждем пока загрузится оболочка:
Небольшой гайд по управлению XSDL сервер:
Доступ SSH доступ к Linux
Для доступа по SSH к установленной системе мы скачали ConnectBot. Откройте приложение и наберите:
Затем введите пароль, выбранный при установке системы, дальше вы окажетесь в оболочке Linux:
Решение проблем
Если во время создания образа возникает ошибка:
Замените в пути 0 на legacy.
А если такая ошибка:
dd: opening `/storage/sdcard0/linux.img’: Read-only file system
Это значит что в вашей системе используются пространства имен для различных пользователей, то есть флешка примонтирована для пользователя, но не для root’a. Поэтому откройте SuperSU и в настройках снимите галочку Создать поименное разделение пространств:
Выводы
Вот и все. вы смогли успешно запустить Linux на смартфоне. Эта система не настолько эффективна как на персональном компьютере, но тоже сильно расширяет возможности Android смартфона. Если у вас остались вопросы, спрашивайте в комментариях!
Запуск Linux из-под Android
Вероятней всего, ни для кого уже не секрет, что самая популярная операционная система для сенсорных устройств – это Android созданная на базе ядра Linux. Однако, по стечению обстоятельств планшеты под управлением операционной системы Android не способны запускать приложения, написанные для Linux. И на этом этапе у пользователей появляется нормальный вопрос: а как же запустить различные дистрибутивы Linux из-под популярной ОС? И ответ оказывается простым – с помощью специальных эмуляторов, как это распространено на компьютерах под управлением Windows, где создание виртуальных машин – это обычное дело для пользователя.
Общие сведения
Да, скорей всего многие пользователи зададутся вопросом, а зачем собственно это нужно, если уже сейчас выпускаются планшеты под управлением Ubuntu (одна из самых удачных оболочек для Linux), а запустить какой-то дистрибутив на компьютере гораздо легче. Вопрос риторический, если об этом стали говорить, значит, кому-то это очень нужно, тем более что иметь в своем распоряжении планшет под управлением какого-то дистрибутива Linux куда проще, чем носить с собой 3-килограммовый ноутбук или менее функциональный нетбук.
В последнее время Linux используется исключительно для программирования, отладки созданных приложений и тестирования их на реальных объектах. Также эта ОС нашла свое применение в администрировании серверов и наладке компьютерных сетей. Поэтому профессиональный разработчик программного обеспечения нуждается в таких сенсорных девайсах.
Совместимость версий
Однако, стоит учитывать, что не все запускаемые дистрибутивы на стационарных компьютерах будут нормально работать и на планшетах. Почему? Потому что большинство таблеток работают на базе микропроцессоров со структурой ARM. И для того чтобы абсолютно все версии Linux корректно запускались на таких девайсах, необходимо найти планшет под управлением ОС Windows. Но как показывает практика, такие планшеты не отличаются хорошими техническими характеристиками.
Вот поэтому в интернете нужно искать портированные версии с поддержкой ARM структурой, к таким сборкам можно отнести:
Для того чтобы найти еще доступные версии для планшета, необходимо в поиске набрать ключевую фразу: «Linux ARM» и самостоятельно ознакомиться с доступными дистрибутивами.
Предпочтения пользователя
Также перед тем как приступать к установке или эмуляции дистрибутива необходимо выяснить для себя, что вы хотите делать после успешной установки? Просто поиграться или действительно применить полученные знания, устройства для работы?
В первом варианте рекомендуется использовать небольшие и, так сказать, уменьшенные версии системы, во-первых, они легче и быстрей запускаются, во-вторых, их использование не нанесет никакого вреда, если планшет попал в неумелые руки, а в-третьих, удобный и понятный интерфейс не отобьёт желание иметь дело c Linux.
В противном случае, несомненно, необходимо использовать полные сборки, где уже предусмотрен по умолчанию пакет программ, например:
Установка дистрибутива
Перед тем как приступить непосредственно к запуску операционной системы необходимо подготовить сам планшет к этой операции и скачать нужные программы для работы.
Некоторые требования к девайсу:
Загрузка дистрибутива
Скачиваем с интернета образ операционной системы, для этого можете воспользоваться ссылкой, по которой находятся популярные дистрибутивы для сенсорных гаджетов:
Установка будет происходить на примере Ubuntu 12.04, вы же для себя можете выбрать и другую сборку. После загрузки (файл около 500 Мб) достаем из архива файл Ubuntu.img и перемещаем его на flash-карту в папку «ubuntu», для этого достаточно подключить планшет к компьютеру. После перемещения отсоединяем девайс и подключаемся к интернету.
Установка приложений
Запускаем PlayMarket и устанавливаем на планшет приложение Android Terminal – это очень удобный аналог командной строки.
Запускаем установленную программу и вводим команду «SU» для предоставления терминалу root-прав, вот для чего их наличие крайне обязательное.
Снова запускаем магазин и устанавливаем утилиту «Complete Linux» — это скрипт для запуска дистрибутива из-под Android.
Следом запускаем программу.
Нажимаем на выделенный пункт списка и в следующем окне нажимаем на кнопку «Strat Linux».
Теперь в строке вводим выделенные команды:
Сразу же будет выведен запрос на ввод пароля, по умолчанию ставить «ubuntu», потом еще раз повторить его ввод.
Вводим те же самые ответы, которые выделены на изображении выше.
Обратите внимание, разрешение экрана вводится в зависимости от диагонали самого устройства, поэтому значения могут отличаться от представленных.
Еще раз вводим букву «n» и как только на экране появляется выделенное сообщение – это значит установка Linux успешно завершена.
Запуск системы
Теперь снова возвращаемся в интернет-магазин PlayMarket и устанавливаем последнее приложение – VNC Viewer для удаленного доступа и управления.
Утилита удаленного доступа
Запускаем программу и видим, что пока никаких соединений нет, поэтому нажимаем на кнопку «плюс» и выполняем заполнение двух полей.
В первое поле адреса вводим «localhost», а во второе название соединения по умолчанию ставим также «ubuntu» и для сохранения внесенных данных нажимаем кнопку «Done».
Нас вернули в главное окно, где нажимаем на единственную продолговатую клавишу «Connect».
Для подключения необходимо пройти процедуру аутентификации, то есть ввести заданный ранее пароль и нажать на кнопку «ОК».
Теперь можно вас поздравить с успешным запуском операционной системы Ubuntu из-под Android, для комфортного управления лучше использовать обычную лазерную мышку и клавиатуру.
Теперь можно запустить любое приложение для тестирования сборки, например, стандартный интернет-браузер Mozilla.
Вы можете спокойно переходить между двумя операционными системами, но, если хотите полностью выключить запущенную операционную систему, тогда переходим к командной строке.
Вводим команду «exit» и на этом инструкция по успешной установке и завершению работы Ubuntu окончена.
Другие способы запуска
Наряду с вышерассмотренной программой можно использовать еще одну утилиту, ее название «Linux Deploy». Установка практически аналогична представленной, главной особенностью приложения является работа в одном окне без переходов между различными программами.
Утилита успешно развивается, уже сейчас на PlayMarket можно скачать новую версию на ОС Android 5, разработчик постоянно дорабатывает и исправляет найденные ошибки, поэтому, научившись запускать Ubuntu по первому способу, можно плавно переходить к более мощной и продвинутой программе.
Портирование Ubuntu
Но некоторые разработчики пошли дальше и отказались от эмуляторов, а нашли способ прямой установки дистрибутивов Linux наряду с Android. Такой способ, к сожалению, требует очень глубоких познаний в работе операционной системы Android и на получении root дело не закончится.
Тем более что не все современные планшеты поддерживают такой способ установки и нужно быть предельно осторожным в этом плане, так как неправильные или ошибочные действия могут привести к плачевным результатам.
Подробная видеоинструкция
Родственные связи. Собираем модули ядра и нативные Linux-приложения для Android
Содержание статьи
Введение
Как всем известно, Android имеет под собой фундамент в виде ядра Linux. Из этого следует, что в теории на смартфоне можно запустить все те приложения, что доступны на десктопном Linux. На практике же все сложнее. Поскольку набор Native-библиотек в Android отличается от такового на десктопе (не говоря уже об архитектуре платформы), приложения требуется компилировать статически. А иногда еще и патчить. Но и в этом случае работоспособность приложения не всегда гарантирована.
Что касается модулей ядра, которые могут быть весьма полезны на смартфоне (поддержка NTFS, например), то здесь все еще интереснее. Во многих ядрах от вендора отключена функция загрузки модулей (начиная с Android 4.3, это фактически требование Google. — Прим. ред.). Поэтому нам придется не только подобрать правильную версию ядра для сборки модулей, но и, возможно, пересобрать само ядро, включив такую поддержку, или просто добавить модуль в сам образ ядра.
Далее в статье мы рассмотрим, как побороть эти проблемы, и попробуем собрать модули Linux-ядра и несколько приложений.
Подготовка
Для сборки модулей (ядра) и приложений нам потребуется тулчейн, то есть связка из кросс‑компилятора и линковщика, плюс набор стандартных инструментов сборки, которые можно установить из репозитория (пример для Ubuntu):
Теперь можно установить тулчейн. Их существует как минимум два — стандартный гугловский NDK и тулчейн от Linaro, куда сильнее оптимизирующий код. Различаются они еще и набором target-библиотек — если NDK содержит те библиотеки, которые имеются в Android и, соответственно, могут не подходить для сборки обычных POSIX-совместимых приложений, то Linaro включает минимальный набор стандартных POSIX-библиотек под ARM, для использования которых в гуглооси понадобится статическая линковка.
Для сборки ядра мы, в целях совместимости, будем использовать первый. Заходим на страничку https://developer.android.com/tools/sdk/ndk/index.html и, выбрав нужную версию NDK, скачиваем его. Затем устанавливаем на скачанный файл право исполнения и распаковываем:
А вот для сборки программ понадобится и тулчейн от Linaro. Для его получения проще всего зайти на forum.xda-developers.com/showthread.php?t=2098133 и выбрать билд. Лично я выбрал Linaro GCC 4.6.4-2013.05 (поскольку процессор у меня не Cortex, то и качал я arm-unknown-linux-gnueabi-linaro_4.6.4-2013.05-build_2013_05_18.tar.bz2). Распаковываем и для пущего удобства переименовываем:
Добавим путь к тулчейну в
/.bashrc (и заодно определим отдельные переменные, которые на время компиляции ядра, возможно, и не пригодятся, но в дальнейшем могут ой как понадобиться):
Компиляция модулей и ядра
Для начала определим, поддерживает ли стоковое ядро модули. Для этого смотрим, есть ли на устройстве файл /proc/modules. В зависимости от этого мы поймем, что делать дальше. В случае если модули поддерживаются, мы берем ванильное ядро той же версии (но лучше, конечно, взять от вендора), конфигурируем его, компилируем только модули, закидываем их в /system/lib/modules и загружаем с помощью команды insmod на устройстве. Если же ядро модулей не поддерживает, можно либо взять готовое кастомное ядро с поддержкой модулей (об этом читай в статье «Выбираем кастомное ядро для своего Android-аппарата»), либо собрать свое, включив нужные модули в образ ядра.
В случае самсунговских устройств (у меня как раз такое) исходники ядер лежат на opensource.samsung.com. Для сборки ядра нам понадобится его конфиг. В некоторых устройствах он находится в файле /proc/config.gz, но, к сожалению, не во всех, поэтому разберем другой метод его получения. После скачивания и распаковки переходим в соответствующий каталог, смотрим файлы, находящиеся в arch/arm/configs/, и выбираем подходящий по архитектуре. В моем случае там был только один файл — n1a_00_defconfig. Переходим обратно в каталог, куда мы первоначально распаковали ядро, и набираем следующую команду:
Далее настраиваем ядро с помощью стандартной команды make menuconfig, чтобы включить нужные нам модули. Затем собираем:
Хакер #192. ZeroNights–2014
Сборка модулей
Для сборки исключительно модулей без самого ядра можно использовать либо команду make modules, либо, если ты включил всего один модуль, следующие команды (вместо net/netfilter подставь каталог собираемого модуля):
После сборки нам нужно все получившиеся файлы скопировать в единый каталог:
Затем, в случае полной компиляции, нужно собрать файлы в ZIP-архив. Не абы какой, а сформированный определенным образом (речь идет о файле обновления для кастомной консоли восстановления. — Прим. ред.). Для этого клонируем с гитхаба шаблон для данного файла:
Поскольку те утилиты, что имеются в этом автоматическом апдейтере, немного устарели (во всяком случае, на моем планшете они завершались с сегфолтом), нужно их заменить рабочими, которые берем на d-h.st/RgI, и, распаковав, заменяем ими файлы с теми же названиями в каталоге AnyKernel/kernel/. Кроме того, нужно изменить скрипт для автоапдейтера, находящийся в AnyKernel/META-INF/com/google/android/updater-script. В конечном итоге должно получиться примерно следующее:
Путь /dev/block/mmcblk0p9 здесь — та часть, которую необходимо изменить. Это раздел boot, и почти на всех устройствах он будет представлен разными файлами. Чтобы узнать имя файла на своем устройстве, выполни следующую команду:
После правки запаковываем каталог:
Затем кидаем файл на устройство и устанавливаем его с помощью кастомного рекавери (TWRP или CWM).
После сборки и установки ядра должна получиться примерно такая картинка
Сборка приложений
Модули ядра позволяют добавлять функциональность исключительно низкого уровня, которую в общем случае нельзя использовать напрямую. Для добавления же функциональности, которую можно использовать напрямую, нужно собирать программы, чем мы сейчас и займемся, — попробуем собрать несколько приложений. Перед сборкой почти всех приложений нужно экспортировать ряд переменных:
И лишь затем можно приступать.
Bash собирать с помощью тулчейна Linaro очень легко — скачиваем исходники c официального FTP и распаковываем:
Выполняем скрипт configure и собираем:
После сборки появится файл bash, который мы и копируем на устройство в /system/xbin.
Bash, запущенный под Android
Стоит дать комментарии, почему bash нужно компилировать с помощью тулчейна Linaro. В Bionic, стандартной реализации библиотеки libc в Android, отсутствуют некоторые POSIX-совместимые функции, используемые bash (такие, например, как mkfifo() или wctomb()). Соответственно, собрать bash с использованием этой библиотеки без танцев с бубном не выйдет. В Linaro же, с другой стороны, используется стандартная POSIX-совместимая библиотека glibc. Поскольку мы собираем bash статически, нам все равно, что используется в Android, — главное, чтобы версия glibc, с которой мы собираем, подошла к ядру. Впрочем, сегодня обратное маловероятно.
Это достаточно удобный консольный менеджер процессов для Linux. Для вывода информации он использует библиотеку ncurses, так что для его компиляции потребуется чуть больше времени. Создаем каталог htop, переходим в него и скачиваем ncurses:
Поскольку нам нет смысла включать поддержку юникода и мыши и мы не собираемся делать эту библиотеку динамической, отключаем эти опции (а также отключаем поддержку языка Ada).
Скачиваем и распаковываем сам htop, предварительно перейдя на уровень выше:
Вновь переопределяем переменные окружения для сборки:
Конфигурируем и собираем:
Все бы хорошо, но после попытки запуска на устройстве вываливается ошибка «Error opening terminal: screen». Лечится это просто — достаем откуда‑нибудь каталог terminfo (я его выдернул из Terminal IDE, просто потому, что он оказался под рукой), копируем в /system/etc и выполняем в терминале на гаджете следующую команду:
После этого htop запустится без заморочек.
Htop, запущенный под Android
Tmux — менеджер терминалов, более продвинутая альтернатива известного всем админам screen, созданная разработчиками OpenBSD. В случае с Android его удобно использовать для работы с устройством через adb shell или SSH (например, ходить на TV Box или HDMI-стик под управлением Android. — Прим. ред.).
Подготавливаемся к сборке tmux:
И наконец, собираем сам tmux:
После сборки и заливки исполняемого файла перед запуском tmux, помимо переменной TERMINFO, нужно определить переменную TMPDIR — лично я использовал /data/local/tmp.
Стоит заметить, что tmux может работать только от рута, потому что права доступа не позволяют писать в вышеуказанную папку кому попало.
Сеанс SSH-соединения с Android. Для разделения терминала используется tmux. В левой части можно увидеть вывод lshw
Ngrep
А это крайне полезная утилита, позволяющая отлавливать пакеты с заданным паттерном (может быть нужно, например, для отладки RESTful-приложений). Для ее сборки потребуется собрать еще и libpcap. Как обычно, создаем каталог, куда и скачиваем libpcap, распаковываем его и собираем:
Скачиваем сам ngrep, распаковываем, собираем:
Разберем опции обоих configure. В случае с libpcap мы отключили поддержку DBUS по понятной причине отсутствия его в Android и указали тип захвата пакетов (поскольку компилируем мы в конечном итоге под Linux, то и тип захвата ставим соответствующий). Для ngrep же мы указали путь к заголовочным файлам libpcap и отключили понижение привилегий по причине отсутствия файла /etc/passwd в Android, куда эта функциональность смотрит.
Перехватываем пакеты, содержащие слово google, используя ngrep
Linux Deploy
Компиляция программ может занять немало времени, да и не всякое приложение можно с легкостью собрать (например, текстовый torrent-клиент rtorrent потребует сборку libtorrent, а уж эта библиотека, в свою очередь, потянет за собой Boost). И если для пары‑тройки приложений это не столь критично, то в случае сборки большего количества трудозатраты становятся слишком велики. Да и сами приложения в случае статической компоновки могут раздуваться до невообразимых размеров. Однако есть решение и для этой ситуации — Linux Deploy, который с легкостью можно найти в Google Play.
Поскольку Android построен на базе ядра Linux, а изменения в нем не настолько сильны, чтобы мешать запуску обычных POSIX-приложений (что и было продемонстрировано выше), существует возможность развертывания chroot-окружения (с пробросом соответствующих псевдофайловых систем) и установки в нем userland-части дистрибутивов, поддерживающих архитектуру ARM. Приложение Linux Deploy делает именно это, создавая образ и монтируя его как loop-устройство.
Поддерживаются следующие дистрибутивы:
После развертывания и запуска системы в нее необходимо каким‑то образом войти. Для этого существует два метода: по SSH и через VNC. При наличии SSH-сервера в самом Android в Linux Deploy нужно либо его отключить, либо переопределить порт. А если использовать VNC, необходимо доустановить в Android VNC-клиент (рекомендую bVNC). Стандартные имя пользователя / пароль — android/changeme соответственно.
Запуск окружения Ubuntu в Linux Deploy
Ubuntu в Linux Deploy по виду неотличим от десктопного
В данном контейнере можно производить практически те же действия, что и в обычном настольном дистрибутиве Linux, — со скидкой на поддерживаемую ядром функциональность. Замечу, что контейнер не изолирован от основной системы, и запуск служб в некоторых дистрибутивах не поддерживается по причине использования в них современных систем инициализации. Также стоит помнить, что приложения в контейнере нативные, — это изрядно кушает батарею.
Заключение
В статье были описаны два (а если считать компиляцию ядра с модулями, то три) метода расширения функциональности на Android. Подведем итоги.
Компиляция ядра и модулей имеет смысл только в тех случаях, когда тебе нужна низкоуровневая функциональность — будь то поддержка ФС или, допустим, модуль iptables. В современных стоковых ядрах поддержка загрузки модулей чаще всего отключена, так что для добавления функциональности всяко потребуется компиляция всего ядра.
В случае с компиляцией небольших POSIX-приложений можно попытаться использовать гугловский NDK, идущий с Bionic и практически несовместимый с POSIX, а можно использовать сторонний тулчейн для архитектуры ARM, в котором, как правило, есть библиотека glibc, и компилировать приложения статически. Однако следует помнить, что статически слинкованное приложение весит достаточно много, таким образом, нелишним будет еще раз подчеркнуть, что этот метод годится лишь для небольших приложений.
Для запуска крупных приложений можно использовать Linux Deploy, позволяющий развернуть на Android полноценную userland-часть популярных дистрибутивов. Однако и у него есть недостатки. Во‑первых, он изрядно кушает батарею, а во‑вторых, размер образа с данной userland-частью не может быть больше 4 Гб, так что, если раскатал губу на кучу приложений, закатай ее обратно.
В целом же запуск POSIX-приложений в Android вполне возможен — что и было показано в статье. А уж каким способом ты будешь что‑то делать, ты волен выбирать сам. Stay freedom.
Библиотеки, портированные на Android
Несмотря на то что Android не является в полной мере POSIX-совместимой ОС, под него все же были портированы некоторые из библиотек, доступных под десктопной Linux. Посмотрим, что это за библиотеки:
В общем, с точки зрения портирования приложений выбрать есть из чего.