Как стать автором
Обновить

Установка Debian Lenny на Android

Время на прочтение 9 мин
Количество просмотров 38K
Автор оригинала: Jay Freeman (saurik)
imageНу что же, Android вышел и даже выложены исходные коды. И мы получили первое работающее на Android устройство. Чего действительно у нас не было так это смены игры при котором мы внезапно получили бы контроль над своими телефонами. Вы помните что нам обещал Google в прошлом году.
Реальность такова, что даже Google не может повлиять на мир мобильных устройств. Те кто уже получил свой G1 и уже некоторое время успел поиграть с ним, был расстроен тем фактом, что мы до сих пор просто обычные пользователи на своем телефоне: T-Mobile не разрешил нам использовать пользователя root, боясь как бы мы чего нибудь не сделали.

Если вы захотите попробовать эту инструкцию в действии, учтите что все что вы делаете, вы делаете на свой страх и риск.

Получение полномочий супер пользователя(root)/Jailbreaking

Для меня ограничения подобного рода, превращают устройство в ни что иное как в игрушку: те кто следил за моими приключениями в мире iPhone, знают, что я считаю позором носить телефон с высокоскоростным ARM процессором, запущенной современной операционной системой, большим экраном, с многочисленными способами управления/ввода, всего лишь для того что бы использовать его как очередной сотовый телефон.

К счастью это изменилось несколько дней назад, когда кто то нашел серьезную уязвимость в прошивке Android. Можно было получить привилигерованные права. Просто набрав в консоле telnetd и подключившись с помощью telnet клиента вы получаете root.

К сожалению, пока трудно сделать что то стоящее с помощью Google'вской замены busybox — toolbox. Что нам нужно, так это полноценная юникс среда. Этот телефон достаточно мощный, даже для того что бы разрабатывать приложения прямо на нем.

Установка Debian ARMEL

Уже было несколько попыток установить busybox на андроид. Я думаю что мы можем пойти дальше, и с помощью этой инструкции установить полный дистрибутив Debian, один из высокоуважаемых линукс дистрибутивов позволяющий устанавливать все что вы захотите.
Для этого нам нужно продумать несколько вопросов связанных с G1. Во первых, где нам хранить его? На телефоне есть встроенная flash память, но там всего лишь 128MB для операционной системы и остальных приложений.

Поэтому мы обратили внимание на более емкую часть телефона — microSD карту, которая позволяет хранить до 16GB данных. К сожалению, для возможности чтения ее всеми кардридерами, эта карта имеет файловую систему FAT, которая бесполезна для хранения юникс программ и данных.
Но вот что мы придумали — мы можем хранить образ Debian на карте памяти и затем просто монтировать его.

Просмотрев содержимое /proc/filesystems, мы можем увидеть все типы файловых систем которые можем использовать: vfat, yaffs, yaffs2. На T-Mobile установлена только минимальная часть драйверов для файловых систем, необходимых для функционирования Android. Это означает что нам нужно загрузить драйвер, который позволил бы нам, монтировать наш образ, благо ядро собрано с поддержкой модулей.

Если потребуется могу написать руководство, потому как собирать модули для G1. Я поощряю людей которые стремятся к обсуждению тем разработки/модификации G1. Для обсуждения вы можете подписаться на рассылку the G1-Hackers mailing list которую я держу на Telesphoreo.
Я так же поддерживаю IRC на irc.saurik.com (тот же сервер на котором расположены Phone ориентированные каналы) на канале #android, совместно с еще несколькими заинтересованными людьми.

Создание дискового образа Debian

Так, хватит болтать, приступим! Во первых нам понадобится образ файловой системы Debian, который мы поместим на карту памяти телефона. Для его создания, мы можем использовать уже существующую Debian систему. Благо Debian уже имеет полную поддержку ARM EABI и даже есть полезная инструкция как установить.

Для людей у которых нет желания возиться с созданием образа, я уже создал готовый на 750MB, скачать можно здесь полный образ (RapidShare). Этот образ был упакован с помощью bzip2 и занимает ~85MB.

RapidShare достаточно медленный сервер, так что ребята из modmyGphone.com выложил у себя зеркало образа на своих серверах. Подробности можно почитать здесь.

Если хотите создать образ самостоятельно (может быть вам нужен другой размер файловой системы под дебиан, отличный от 750MB, или просто хотите контролировать весь процесс), это можно сделать с помощью следующих команд:

apt-get install debootstrap
dd if=/dev/zero of=debian.img seek=749999999 bs=1 count=1
mke2fs -F debian.img
mkdir debian
mount -o loop debian.img debian
debootstrap --verbose --arch armel --foreign lenny debian ftp.de.debian.org/debian
umount debian


Сборка нашего набора инструментов (kit) для Debian

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

* ext2.ko (RC19) (RC29/30) — стандартный модуль файловой системы Linux
* unionfs.ko (RC19) (RC29/30) — позволяет объединять папки (продвинутый)
* busybox — набор системных утилит

Скопируйте это все ( и debian.img) в папку на карту памяти microSD (я использовал USB соединение, которое проще и быстрее чем остальные). Если вы скачивали готовый образ, то имеет смысл переименовать его в debian.img, что бы дальнейшем было проще его использовать.

Установка и монтирование

Куда же нам лучше это все положить? Я скопировал набор инструментов (kit) в корневую директорию microSD карты и все остальное поместил в /data/local (очень полезная папка в которую вы можете нормально записывать).

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

export kit=/sdcard/kit
export bin=/data/local/bin
export mnt=/data/local/mnt


Далее нужно экспортировать еще несколько путей, они понадобятся программам которые мы будем использовать в дальнейшем. Это позволит сэкономить время при загрузке драйвера для ext2. Это может выглядеть странно (по крайней мере переменная HOME), но если мы их не зададим позже могут возникнуть основные проблемы.

export PATH=$bin:/usr/bin:/usr/sbin:/bin:$PATH
export TERM=linux
export HOME=/root

insmod $kit/ext2.ko


Следующим шагом нужно скопировать куда нибудь busybox для дальнейшего использования. Так как G1 не содержит команду cp, будем использовать для этого cat. Заметка, команда mkdir не имеет опцию -p (так как toolbox ее не поддерживает), так что если вы выберите директорию с большой вложенностью (или существующую) вы должны будете игнорировать некоторые ошибки или решить их иначе.

mkdir $bin #-p
cat $kit/busybox >$bin/busybox
chmod 755 $bin/busybox


busybox установлен, теперь мы можем с помощью него создать узел устройства (device node) для драйвера loopback. Нам нужен busybox, так как G1 не содержит утилиту mknod, которая понадобится для создания ноды. Так же создадим алиасы (короткие имена) для busybox, что бы легче было набирать команды.

alias _=busybox
_ mknod /dev/loop0 b 7 0


Если вы получите ошибку при запуске: _ не найдено, просто попробуйте сбросить ее:

unalias _
alias _=busybox


Наконец то устройство замыкание на себя(loopback) создано, мы можем подключить образ debian! Замечание, в качестве имени образа debian.img, используйте имя вашего образа, если оно отличается.

_ mkdir -p $mnt
_ mount -o loop $kit/debian.img $mnt


Тут может возникнуть несколько основных ошибок: если ошибка /etc/fstab, тогда по всей видимости файл $kit/debian.img не существует, или возможно не установлена переменная $mnt.

Заключительный этап установки

На этом этапе, мы должны закончить то, что debootstrap не в силах. Во первых, нужно запустить несколько скриптов и поправить URL к репозитариям Debian (почему то, debootstrap их путает, по не понятной причине). Если вы уже скачали готовый образ, то эти две команды вам делать не нужно.
_ chroot $mnt /debootstrap/debootstrap --second-stage
echo 'deb ftp.de.debian.org/debian lenny main' >$mnt/etc/apt/sources.list


После того как эти команды выполнятся (возможно займет почти 10 минут), мы можем поменять окружение на debian с помощью команды chroot. Мы получи оболочку и полное дебиан окружение, со всеми вытекающими клевыми штуками, которые мы можем делать. Эту команду выполняют все, даже те кто скачал готовый образ.

_ chroot $mnt /bin/bash

Далее подключаем в наше окружение файловые системы devpts, proc и sysfs.

mount -t devpts devpts /dev/pts
mount -t proc proc /proc
mount -t sysfs sysfs /sys


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

passwd root

Установка OpenSSH

Вот где проявляется вся мощь дебиан: быстрая установка новых программ на телефон. Ну что, установим SSH сервер, для того что бы получить полноценную консоль.
Для этого будем использовать APT (система управления пакетов в Debian). Первая команда обновить информацию о пакетах в репозитариях и установит обновления. Вторая установит собственно сам ssh сервер.
apt-get update
apt-get install openssh-server

Если позже вы снова захотите запустить OpenSSH (так как не используется нормальный запуск дебиан сервисов), вы можете сделать это с помощью следующей команды (или используя «restart» вместо «start»).

/etc/init.d/ssh start


Что же дальше?

Повеселимся! Первое что я сделал — установил subversion, gcc и vim, что бы можно было начать разрабатывать. Повторю, люди которые хотят подробнее изучить внутренности Android (драйверы ядра, доступ к железу, процесс перепрошивки) могут присоединиться к почтовой рассылке G1-Hackers.

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

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

_ umount $mnt/dev/pts $mnt/proc $mnt/sys $mnt

Хотя Android поставляется с утилитой размонтирования umount, которая работает как бы нормально, но тем не менее она оставляет loopback устройство, которое будет продолжать блокировать карту microSD для подключения через USB. Удалить ее можно в ручную, с помощью следующей команды:

_ losetup -d /dev/loop0

Запуск Debian в /

Больше всего в этом процессе огорчает, то что мы должны выбирать между андроид и дебиан. Здесь нам на помощь приходит unionfs.

Замечание, все последующие команды должны быть выполнены вне дебиан окружения. Для это нужно в текущей telnet сессии набрать:
exit

или открыть еще одну сессию. Все команды можно скачать ввиде готового скрипта.
Для запуска этого скрипта у вас уже должны быть экспортированы все стандартные переменные. Если вы с копировали скрипт в $kit, тогда выполнить его можно с помощью следующей команды.

. $kit/unionfs.sh

Установить этот скрипт можно с помощью wget:

_ chroot $mnt wget -O /tmp/unionfs.sh cache.saurik.com/android/script/unionfs.sh
cat $mnt/tmp/unionfs.sh >$kit/unionfs.sh
rm $mnt/tmp/unionfs.sh


Для тех кто не использовал готовый скрипт:

insmod $kit/unionfs.ko
mount -t unionfs -o dirs=$mnt/etc=rw:/etc=ro unionfs /etc


Теперь у нас /etc содержит файлы из Android и Debian. При изменении/создании файлов в /etc все модификации будут храниться в Debian разделе — это позволяет получить нам полноценный доступ к /etc!

Следующая проблема, состоит в том что Android и Linux используют разные соглашения именования для их динамического компоновщика. Для Android мы имеем /system/bin/linker, а для Linux мы имеем /lib/ld-linux.so.3. Это означает что мы получим ошибку файл не найден, при запуске работающих программ. Это легко исправить при помощи символических ссылок.

_ mount -o remount,rw /
_ ln -s $mnt/lib /


С первого взгляда это может выглядеть опасно, но это не так. При изменении корневой файловой системы телефона, это будет изменение в «rootfs»: специальное состояние Linux ramfs(файловая система в памяти). Это означает, что любые изменения которые мы сделаем, после перезагрузки телефона, исчезнут.

Теперь мы сможем запускать большинство Debian программ без применения chroot, просто запуская программы из $mnt. К сожалению не все будет работать, так как большинство файлов находятся не там, где должны быть. Давайте ка исправим это с помощью символических ссылок

for x in
bin boot home media mnt
opt selinux srv usr var
do
_ ln -s $mnt/$x /
done

Осталось еще несколько директорий которые нужно поправить. Первая: /root пустая, поэтому мы можем заменить ее ссылкой. Так как мы закончили изменение файлов в /, я настоятельно рекомендую перемонтировать корень / в режим только чтения.

rmdir /root
_ ln -s $mnt/root /
_ mount -o remount,ro /

Остались еще две /sbin и /dev. Тут есть не большая загвоздка с /dev. Так как внутри этой папки смонтирована /dev/pts, она не может быть объединена с помощью unionfs. Для решения этой проблемы, просто смонтируем /dev/pts поверх unionfs:

mount -t unionfs -o dirs=$mnt/sbin=rw:/sbin=ro unionfs /sbin
mount -t unionfs -o dirs=$mnt/dev=rw:/dev=rw unionfs /dev
mount -t devpts devpts /dev/pts


У нас все готово, даже для того что бы такие программы как openssh работали корректно, перезапустим сервис:

/etc/init.d/ssh restart

В заключение

Это все выглядит хорошо, но осталось еще несколько проблем заслуживающих внимание:
Первое — пока не понятно где хранятся имена пользователей и информация для аутентификации. Если вы посмотрите на владельцев файлов с помощью ls входящую в состав дебиан, то заметите что их там нет.

Второе, используя симлинк для /, вместо использования chroot (пока что не удалось сделать прозрачную загрузку всех сервисов) означает что любой пакет по пытающийся добавить директорию в / завершится неудачей. Для установки программ через apt-get придется использовать chroot.

И последнее, в скором времени выходит обновление RC30, после которого уже не будет действовать джейлбрейк через Telnetd. Так что пока не наиграетесь вдоволь, не устанавливайте его.
(Надеюсь я пойму почему телефонные компании, так любят продавать нам устройства, которые нарочно ограничены в функциональности. Это как то улучшает их бизнес?)

Если вы найдете не соответствия или еще какие либо ошибки в статье, пожалуйста сообщите.
Статья с переводом так же выложена ironphone.ru
Теги:
Хабы:
+57
Комментарии 56
Комментарии Комментарии 56

Публикации

Истории

Работа

Ближайшие события

Московский туристический хакатон
Дата 23 марта – 7 апреля
Место
Москва Онлайн
Геймтон «DatsEdenSpace» от DatsTeam
Дата 5 – 6 апреля
Время 17:00 – 20:00
Место
Онлайн
PG Bootcamp 2024
Дата 16 апреля
Время 09:30 – 21:00
Место
Минск Онлайн
EvaConf 2024
Дата 16 апреля
Время 11:00 – 16:00
Место
Москва Онлайн