Meefik's Blog

Freedom and Open Source

BusyBox для Android

Приложение представляет собой инсталлятор последней версии BusyBox для Android. Приложение содержит сборку BusyBox для различных аппаратных архитектур и является сборкой с наиболее полным набором функций, на данный момент поддерживается 335 апплетов (для busybox v1.23.2). Приложение позволяет установить в систему BusyBox или удалить уже установленный. Есть возможность выбора директории установки и режима установки (с установкой апплетов, с заменой существующих апплетов или без). Также сборку можно сохранить на карту памяти в виде zip-архива для последующей установки через рекавери.

Что же такое BusyBox? BusyBox содержит крошечные версии многих утилит UNIX в одном маленьком исполняемом файле. Он обеспечивает замену для большинства утилит, которые можно найти в GNU fileutils, shellutils и др. Утилиты BusyBox обычно имеют меньше возможностей, чем их полнофункциональные собратья GNU, однако те функции, которые включены в BusyBox, совместимы с аналогичными функциями утилит GNU. BusyBox предоставляет довольно полное окружение для любых мобильных или встраиваемых систем.

Требования:

  • Устройство с архитектурой ARM, x86 или MIPS
  • Android 2.3 (API 9) или выше
  • Права суперпользователя (root)

busybox

Приложение распространяется под лицензией GPL версии 3 или более поздней.

Исходный код: https://github.com/meefik/busybox
Установить из Google play: https://play.google.com/store/apps/details?id=ru.meefik.busybox

Обновление часовых поясов в Android

Приложение появилось из-за сложившийся сложной ситуации с обновлением часовых поясов в Android. Международная база данных часовых поясов обновляется каждый месяц, но нет никаких штатных средств обновления этой базы на устройствах. Следить за обновлениями часовых поясов и выпускать своевременные обновления прошивок, по идее, должны производители устройств, но на деле этого нет. В итоге было разработано приложение Timezone Updater, которое скачивает и обновляет до последней версии данные часовых поясов на Android-устройстве. Обновляются база данных часовых поясов и ICU данные. На устройстве изменяются следующие файлы:

  • /data/misc/zoneinfo/tzdata или /system/usr/share/zoneinfo/*
  • /system/usr/icu/*.dat

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

Для работы приложения необходимы:

  • Android 2.3 (API 9) или выше
  • права суперпользователя (root)
  • установленный BusyBox

tzupdater

Приложение распространяется под лицензией GPL версии 3 или более поздней.

Исходный код: https://github.com/meefik/tzupdater
Установить из Google play: https://play.google.com/store/apps/details?id=ru.meefik.tzupdater

Интеграция Linux Deploy с Android

Начиная с версии 1.5.3 в Linux Deploy начаты работы по интеграции GNU/Linux контейнеров с окружением Android. Это открывает следующие возможности:

  • доступ ко всей файловой системе Android;
  • выполнение приложений/команд Android прямо из контейнера (например, getprop, reboot, shutdown);
  • переключение между консолью контейнера и Android (команда unchroot).

Для активации возможности запуска Android-приложений нужно в параметрах разрешить монтирование (Параметры -> Монтирование), а в качестве точки монтирования (Параметры -> Точки монтирования) должен быть добавлен каталог /system (добавлен по умолчанию). После этого нужно нажать кнопку СТАРТ в приложении, чтобы каталог смонтировался в контейнере. Команды из Android будут доступны из консоли контейнера, если их названия не пересекаются с аналогичными в контейнере, либо доступны по полному пути, например /system/bin/ls. Команды reboot и shutdown автоматически переопределены в контейнере и вызывают аналогичные команды из Android.

Если возможностей запуска некоторых команд из Android недостаточно, то можно воспользоваться переключением между консолью контейнера и Android командой unchroot внутри контейнера. Вызов unchroot без параметров открывает sh из Android со всеми его переменными окружения, вызов с параметрами запускает соответствующую команду в Android. Например:

root@THL:/ # linuxdeploy shell
Configuring the container: 
dns ... done 
mtab ... done 
Debian GNU/Linux 8 (jessie) [running on Android via Linux Deploy] 
root@localhost:/# unchroot getprop ro.product.model
thl 5000
root@localhost:/# unchroot
root@THL:/ # ls /data/
...
root@THL:/ # exit
root@localhost:/#

Таким образом, имея доступ к Android прямо из контейнера, можно организовывать более плотную интеграцию запускаемых приложений внутри GNU/Linux контейнеров с системой Android.

Немного о Linux Deploy

Проекту Linux Deploy (сокращенно LD) уже три года, и вот немного статистики. Текущая версия LD 1.5.2-160 - это 52 релиза и 160 обновлений, на github выложено 18 805 строк кода. Поддерживается более 10 000 устройств начиная с версии Android 2.1. Около 500 тыс. установок. На данный момент LD поддерживает 8 дистрибутивов (Debian, Ubuntu, Kali Linux, Fedora, Arch Linux, Gentoo, openSUSE, Slackware), для которых специально написаны инсталяторы и конфигураторы. Для каждого дистрибутива поддерживается от 2 до 9 архитектур (разновидности ARM и x86, 32 и 64 бита) и от 1 до 7 релизов. В общей сложности поддерживается 121 вариант версий дистрибутивов и их архитектур. Каждый дистрибутив может быть автоматически сконфигурирован для работы с 1 из 5 поддерживаемых окружений рабочего стола (XTerm, LXDE, Xfce, GNOME, KDE), не говоря уже о конфигурировании SSH, VNC и Xorg. С учетом окружений рабочего стола (дистрибутив/архитектура/окружение рабочего стола) получается 597 вариантов установки, которые могут быть автоматически развернуты и сконфигурированы через LD.

Немногие знают, но в LD есть интерфейс командной строки (CLI), который доступен из терминала через команду linuxdeploy. С помощью CLI можно управлять процессом развертывания дистрибутивов без графического интерфейса Android. Также, в последних версиях, CLI поддерживает работу не только в Android, но и на обычных компьютерах под GNU/Linux операционными системами. Это может быть полезно для экспериментов с разными дистрибутивами, их версиями и архитектурами. Что касается архитектуры, то LD поддерживает кросс-архитектурную инсталляцию ARM <-> x86, эмуляция реализована с помощью QEMU и работает в обе стороны, т.е. можно запускать x86 дистрибутивы на ARM архитектуре и ARM дистрибутивы на x86 арxитектуре. Для поддержки режима эмуляции в Linux-ядре должна присутствовать поддержка binfmt_misc.

Часто уже готовые сборки дистрибутивов распространяют в виде rootfs-архивов, которые представляют собой tar-архив корневой файловой системы. Такие архивы используются в системах виртуализации, основанных на контейнерах, например, OpenVZ или Docker. LD поддерживает установку из rootfs-архивов, для этого в параметрах LD достаточно выбрать тип установки RootFS и указать путь к архиву на карте памяти или ссылку на архив в интернете. В последних версиях добавлена функция экспорта в виде rootfs-архива уже установленной в LD системы. В дальнейшем можно будет использовать репозитории контейнеров для развертывания и запуска их через LD.

Linux Deploy - открытый некоммерческий проект, развитие которого зависит в том числе от вклада сторонних людей. Если вы заинтересованы в данном проекте, то поддержите его своим участием или сделайте пожертвование в копилку проекта, это поможет его развитию.

Установка GNU/Linux в оперативную память

Современные модели мобильных устройств комплектуются значительным объемом оперативной памяти, например, ThL 5000 имеет 2 ГБ ОЗУ и 1 ГБ swap памяти. Система Android и системные приложения используют не более 1 ГБ оперативной памяти. Таким образом, остается еще как минимум 1 ГБ памяти, которую можно использовать в своих целях.

В Linux Deploy версии 1.5.1 добавлена поддержка установки дистрибутивов GNU/Linux в оперативную память. Для этих целей создается tmpfs точка монтирования заданного размера, куда будет осуществляться установка дистрибутива. Для использования данной функции в Linux Deploy достаточно выбрать “Параметры -> Тип установки -> Оперативная память” (“Properties -> Installation type -> RAM”) и ниже указать размер создаваемого образа в мегабайтах. Если указано 0, то размер образа будет рассчитываться автоматически, исходя из объема свободной оперативной памяти.

Производительность GNU/Linux системы в таком режиме очень хорошая, приложения моментально запускаются, а интерфейсы реагируют на действия мгновенно. Также порадует и время установки дистрибутива. Например, базовый Debian на ThL 5000 устанавливается по Wi-Fi за 3 минуты, а вместе с графическим окружением LXDE и SSH сервером - за 5 минут. Минимальный размер образа для Debian: минимальная установка - 300 МБ, окружение рабочего стола LXDE + SSH сервер - 700 МБ.

Данный тип установки хорошо подходит для быстрой проверки чего-либо или быстрого доступа к каким-то функциям GNU/Linux дистрибутива без необходимости постоянного хранения образа системы. Следует помнить, что все данные, хранящиеся на диске в оперативной памяти, бесследно пропадут при перезагрузке устройства. Эту особенность можно использовать и с точки зрения безопасности, перезагрузка устройства сотрет все следы работы в GNU/Linux без возможности какого-либо восстановления.

Piggy .js & .sh

В один из вечеров решил отдохнуть и сделал анимированную версию поросенка для терминала Linux, а затем и на JavaScript. Сам поросенок является логотипом сетевой системы обнаружения и предотвращения вторжений с открытым исходным кодом Snort.

piggy

Код запуска в shell и веб-версия: http://meefik.ru/piggy

Установка и настройка RDP-сервера

Linux Deploy в качестве графической подсистемы по умолчанию использует VNC, как наиболее нативный сбособ организации удаленного доступа к рабочему столу GNU/Linux системы. Однако можно настроить удаленный доступ и по протоколу RDP, используемый в операционных системах MS Windows. В примере используется дистрибутив Ubuntu 12.04 (Precise Pangolin), однако с небольшими изменениями это будет работать и в других дистрибутивах. В данном случае RDP будет работать поверх VNC-сервера, поэтому требуется чтобы он был установлен. В Linux Deploy VNC-сервер устанавливается по умолчанию.

Инструкция

  • Запустить предварительно установленную GNU/Linux систему кнопкой СТАРТ из главного окна приложения.

  • Подключиться к системе по SSH, VNC (IP-адрес для подключения указан в верхней строке главного окна приложения) или через Android-терминал (сценарий linuxdeploy shell).

  • Открыть командную строку (терминал) системы и переключиться в режим суперпользователя:
    sudo -s
    
  • Установить пакет xrdp:
    apt-get install xrdp
    
  • Разрешить пользователю xrdp работать с сетью:
    usermod -aG aid_inet xrdp
    
  • Для автоматического запуска и остановки RDP-сервера через интерфейс Linux Deploy необходимо в параметрах разрешить сценарии пользователя (Параметры -> Сценарии пользователя) и в список сценариев добавить путь /etc/init.d/xrdp (Параметры -> Список сценариев).

  • Перезапустить GNU/Linux систему кнопками СТОП/СТАРТ из главного окна приложения.

  • Подключиться через RDP-клиент: module - sesman-Xvnc, username - android, password - changeme.

Управление Linux Deploy из командной строки

Помимо графического интерфейса Linux Deploy позволяет управлять экземпляром GNU/Linux системы из командной строки через эмулятор терминала Android. Для данных целей служит специальный сценарий linuxdeploy, который может запускаться из командной строки Android и принимает следующие параметры:

  • prepare - подготовить контейнер, создать образ и файловую систему;
  • mount - смонтировать контейнер;
  • umount - размонтировать контейнер;
  • install - запустить установку новой системы;
  • configure - запустить переконфигурацию контейнера;
  • start - запустить контейнер;
  • stop - остановить контейнер;
  • shell - выполнить chroot в контейнер;
  • status - информация о системе.

По умолчанию сценарий linuxdeploy находится в каталоге ENV_DIR/bin/linuxdeploy, где ENV_DIR - каталог рабочего окружения (по умолчанию /data/data/ru.meefik.linuxdeploy/linux), однако доступ к нему можно сделать более удобным (без указания полного пути к сценарию), если поместить символьную ссылку на этот сценарий в /system/bin. Для этого в настройках Linux Deploy есть опция Настройки -> Создать симлинк, после изменения параметра необходимо выполнить обновление окружения (Настройки -> Обновить окружение).

Все параметры, установленные через графический интерфейс Linux Deploy, хранятся в файле ENV_DIR/etc/deploy.conf. Их можно менять путем редактирования этого файла, однако следует учесть, что любые изменения параметров через графический интерфейс приведут к перезаписи файла и потере внесенных изменений. Переключение профилей также приводит к перезаписи конфигурационного файла. Однако оригинальный конфигурационный файл можно скопировать, например, на карту памяти, отредактировать его и указать этот файл в качестве параметра “-c FILE”.

Команда linuxdeploy shell, наверное, наиболее полезна и нужна для доступа к командной строке установленного дистрибутива прямо из терминала Android. Эта команда также имеет необязательный параметр, принимающий команду, которую необходимо выполнить после перехода в chroot, по умолчанию запускается командный интерпретатор bash.

Примеры использования:

linuxdeploy shell date
linuxdeploy shell "uname -a"
linuxdeploy shell /bin/bash

Сборка ядра Linux и модулей для Android

Дистрибутивы, запускаемые через Linux Deploy, работают с ядром Android (модифицированное ядро Linux), а потому изменить конфигурацию ядра или подключить новые модули можно только путем пересборки этого ядра, либо сборки модулей под данную версию ядра.

Инструкция

  • Скачать и подготовить Android NDK:
    wget http://dl.google.com/android/ndk/android-ndk-r9d-linux-x86.tar.bz2
    tar -jxf android-ndk-r9d-linux-x86.tar.bz2
    export ARCH=arm
    export CROSS_COMPILE=$(pwd)/android-ndk-r9d/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
    
  • Скачать и подготовить Android SDK, понадобятся утилиты adb и fastboot:
    wget http://dl.google.com/android/android-sdk_r13-linux_x86.tgz
    tar -zxf android-sdk_r13-linux_x86.tgz
    android-sdk-linux_x86/tools/android update sdk -u -t platform-tool
    export PATH=$PATH:$(pwd)/android-sdk-linux_x86/platform-tools
    
  • Получить исходники ядра данного устройства (в нашем случае это tinykernel-flo для Nexus 7 (2013), либо скачать аналогичную версию с kernel.org):
    git clone -b tiny-jb-mr2 https://github.com/meefik/tinykernel-flo
    cd tinykernel-flo
    
  • Получить файл конфигурации ядра с устройства (ядро должно быть собрано с поддержкой данной возможности):
    adb shell cat /proc/config.gz | gzip -d > .config
    

    либо из boot.img (как извлечь boot описано ниже):

    scripts/extract-ikconfig boot.img > .config
    
  • Если получить файл конфигурации ядра не получилось, то можно воспользоваться предварительной конфигурацией из поставки ядра (список конфигураций arch/arm/configs):
    make flo_defconfig
    
  • Узнать точную версию ядра устройства:
    adb shell cat /proc/version
    

    Рузультат команды:

    Linux version 3.4.0-g03485a6 (android-build@vpbs1.mtv.corp.google.com) (gcc version 4.7 (GCC) )
     #1 SMP PREEMPT Tue Mar 18 15:02:27 PDT 2014
    

    В данном случае полной версией ядра будет строка “3.4.0-g03485a6”.

  • Установить локальную версию ядра (то что отображается после основной версии 3.4.0):
    echo "-g03485a6" > .scmversion
    
  • Изменить конфигурацию ядра в файле .config или командой:
    make menuconfig
    

    В нашем случае в файл .config изменены следующие строки (включена поддержка модулей и включен модуль binfmt_misc):

    CONFIG_MODULES=y
    CONFIG_BINFMT_MISC=m
    
  • Запустить сборку ядра:
    make
    

    либо только модулей:

    make modules
    
  • Скачать утилиты для работы с загрузочным образом (boot.img):
    git clone https://github.com/meefik/binary-tools-android.git
    cd binary-tools-android
    
  • Получить загрузочный образ с устройства (ядро хранится на специальном boot разделе):
    adb shell su -с 'dd if=/dev/block/platform/msm_sdcc.1/by-name/boot' > boot.img
    

    Путь может отличаться на других устройствах, определить его можно командой:

    adb shell su -c 'ls /dev/block/platform/*/by-name/boot'
    
  • Получить информацию об образе:
    ./boot_info boot.img 
    

    Результат выглядит так:

    Page size: 2048 (0x00000800)
    Kernel size: 6722240 (0x006692c0)
    Ramdisk size: 492556 (0x0007840c)
    Second size: 0 (0x00000000)
    Board name: 
    Command line: 'console=ttyHSL0,115200,n8 androidboot.hardware=flo user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3'
    Base address: 2149580800 (0x80200000)
    
  • Извлечь kernel и ramdisk из boot.img, заменить ядро и запаковать обратно:
    ./unmkbootimg boot.img
    ./mkbootimg --kernel ../tinykernel-flo/arch/arm/boot/zImage \
      --ramdisk initramfs.cpio.gz \
      --base 0x80200000 \
      --cmdline 'console=ttyHSL0,115200,n8 androidboot.hardware=flo user_debug=31 msm_rtb.filter=0x3F ehci-hcd.park=3' \
      -o new_boot.img
    
  • Прошить устройство новым ядром:
    adb reboot bootloader
    fastboot flash boot new_boot.img
    
  • Загрузить модуль на устройстве:
    adb push ../tinykernel-flo/fs/binfmt_misc.ko /storage/sdcard0/binfmt_misc.ko
    adb shell
    su
    mount -o rw,remount /system
    mkdir /system/lib/modules
    cp /storage/sdcard0/binfmt_misc.ko /system/lib/modules/binfmt_misc.ko
    chmod 644 /system/lib/modules/binfmt_misc.ko
    insmod /system/lib/modules/binfmt_misc.ko
    exit
    exit
    
  • Следует учесть, что vermagic модуля должен полностью соответствовать версии ядра (с точностью до символа), иначе загрузить новый модуль не удастся. Необходимо узнать vermagic модуля и сравнить его с уже присутствующими на устройстве модулями:
    modinfo binfmt_misc.ko
    

    Результат выглядит примерно так:

    filename:       /path/to/kernel/fs/binfmt_misc.ko
    license:        GPL
    depends:        
    intree:         Y
    vermagic:       3.4.0-g03485a6 SMP preempt ARMv7 
    

Запуск любого GNU/Linux дистрибутива из образа

Linux Deploy предназначен для автоматической установки через Интернет последних версий наиболее популярных Linux-дистрибутивов и последующего запуска Linux-приложений этих дистрибутивов под Android. Однако он также поддерживает запуск дистрибутив из уже готовых образов. Подготовленные образы дистрибутивов можно скачать с сайта проекта Linux-on-Android.

Инструкция

  • Скачать образ нужного дистрибутива (выбрать zip-архив с образом), распаковать и скопировать его на карту памяти.

  • В приложении Linux Deploy создать новый профиль и в параметрах указать (обязательно):
    Дистрибутив - должен соответствовать образу;
    Версия дистрибутива - должна соответствовать образу;
    Архитектура - должна соответствовать образу;
    Тип установки - Файл;
    Путь установки - путь к файлу *.img (например, /storage/sdcard0/debian.img).
    Остальные параметры настраиваются по желанию.

  • Выполнить переконфигурацию (Параметры -> Переконфигурировать).

  • Запустить GNU/Linux систему кнопкой СТАРТ из главного окна приложения.

  • Подключиться по SSH или VNC, пароль - changeme.