Предисловие
Тема запуска Ubuntu на Android устройствах уже достаточно избитая, в сети можно найти большое количество мануалов. Но есть одно НО! Речь идет об ARM архитектуре.
Однако Intel уже анонсировала свои планы по продвижению процессоров Medfield (x86) на мобильный рынок. А также стали появятся уже готовые к употреблению смартфоны.
В Индии это Lava XOLO X900. А также его копия под брендом оператора Orange для Европы.
![image](https://habrastorage.org/getpro/habr/comment_images/1f2/6a7/f12/1f26a7f127b1aef666968eadb0800fb4.jpg)
Lava XOLO X900
![image](http://sdl2.4pda.ru/1808609.jpg)
Версия от оператора Orange
Для Китая Lenovo выпустила модель LePhone K800
![image](https://habrastorage.org/getpro/habr/post_images/95e/8f9/bdf/95e8f9bdf0d1af09673a25451b9d8bd9.jpg)
Lenovo LePhone K800
На конец июня 2012 эти устройства уже доступны в продаже.
Lava XOLO X900 с оф. сайта www.xolo.in, насколько я понял доступен в пределах Индии. Хотя его уже можно заказать с ebay. Актуальную цену для России через посредников можно посмотреть на www.bay.ru
Lenovo LePhone K800 также доступен, но пока видимо только в китайских магазинах www.360buy.com
Вступление
Пока модельный рад небольшой, и не очень доступный. Меня заинтересовали технические моменты.
И так что мы имеем. В этих девайсах стоит процессор с архитектурой x86. Не знаю кто о чем подумал.
Наверное о его низкой энергоэффективности, низкой производительности. Хотя обзоры говорят об обратном.
Я сразу подумал, не плохо бы наконец без эмуляции, запускать Windows приложения. Я думаю уже многие пробовали запускать старые версии Windows под эмуляторами (Qemu, Bochs, aDOSBox и т.п.) Деже на мощных современный Android смартфонах, тормоза ощутимые.
О возможности Dual Boot говорить пока рано. Не ясно даже есть ли BIOS/UEFI.
Я подумал что, не плохо было бы попробовать запустить Wine под Ubuntu x86. Под Ubuntu
ARM такое чудо по понятным причинам не доступно.
Ну, а так как девайса у меня на руках нет. Всё что оставалось это проверить идею под эмулятором Android x86.
Приступаем к работе
Первым делом я добавил в Android SDK образ Intel x86 Atom System Image. Запустив его, я столкнулся с неимоверными тормозами, включение GPU также не решило проблему. Настолько медленная работа, отбила у меня всякое желание даже рутовать Android.
Поэтому я сразу же установил Android x86 под VirtualBox. При первичной настройки ВМ укажите большой размер ЖД не менее 7 Гб. На последнем этапе установки Android откажитесь создавать фейковую SD карту.
Следующей проблемой оказалось найти образ с установленной Ubuntu в *.img
Под рукой у меня был образ Ubuntu 12 под VirtualBox *.vdi
Первой что пришло в голову это сконверитровать *.vdi в *.img командами типа
VBoxManage clonehd --format RAW ubuntu.vdi ubuntu.img
Но это оказался не верный путь. Указанным способом создастся образ всего диска с таблицей разделов, его так просто не примонтировать.
Посоветовавшись было найдено правильное решение. Необходимо загрузить виртуальную машину с livecd, предварительно подключить в настройках ВМ образы ЖД *.vdi Android и Ubuntu.
В консоли загрузившись с livecd выполнить
sudo parted -l
Смотрим имя у подключенного образа Ubuntu x86. Обычно это sda1
Далее от себя порекомендую задать на все каталоги и файлы в образе права 777. Не смотря на то, что уйдет много времени на эти операции. Если этого не сделать, могут возникнуть не решаемые проблемы при монтировании образа к Android. У меня они возникли.
Так что юзаем команды:
# find /media/имя куда смонтировался образ -type d -exec chmod 777 {} \;
# find /media/имя куда смонтировался образ -type f -exec chmod 777 {} \;
либо
chmod -R 0777 /media/имя куда смонтировался образ
Далее в консоли на ввод подаём блочное устройство промонтированного образа Ubuntu. На вывод пишем файл образ ubuntu.img Для удобства пишем сразу в образ Android, в директорию sdcard/ubuntu.
Для этого выполним:
dd if=/dev/sda1 of=/media/Android-x86/android-4.0-RC1/data/media/ubuntu/ubuntu.img bs=1M
Ждем операция не быстрая. Убедитесь что в образе Android достаточно места.
Опять же на полученный файл-образ ubuntu.img задаём права 777
Ну вроде образ подготовили. Двигаемся дальше.
Монтирование
Монтирование, наверное самый напряженный этап.
После всего сделанного, загружаемся наконец в Android.
Для начало у нас должно иметься:
1. Образ Ubuntu x86 в каталоге /sdcard/ubuntu/ubuntu.img
2. Рутованная сборка Android x86. Обычно они сразу прорутованные.
3. Android Terminal
4. android-vnc-viewer
5. Root Explorer
Для начало подними сеть в Android.
В качестве сетевого адаптера выбрать PCNET Fast III в режиме NAT (либо в режиме моста, если у вас в окружении есть DHCP сервер)
![image](https://habrastorage.org/getpro/habr/post_images/1c9/58f/0dc/1c958f0dc0e72f83245534d19e96b6b3.jpg)
Корректную работу интернета можно настроить через терминал:
вывести список сетевых интерфейсов. Среди них должен быть например eth0
ip a
получить права рута:
su
получить настройки сети по DHCP
dhcpcd eth0
настроить DNS сервер
setprop net.dns1 8.8.8.8
После этих действий интернет на виртуальной машине должен появиться.
настроить adb. В опциях VirtualBox пробросить порт виртуальной машины 5555 например на порт 5556 хоста.
![image](https://habrastorage.org/getpro/habr/post_images/bfc/d0c/248/bfcd0c248c440fbe3ff52880384b5cf5.jpg)
Теперь можно соединяться с виртуальным Android с помошью adb
adb connect 127.0.0.1:5556
Если нужно получить шел рута
adb shell
Обмен файлами и установка приложений осуществляется командами
adb push или adb install
Для Маркета интернет у меня не заработал. Однако в браузере да и в системе он есть.
Следующим шагом будет непосредственно монтирование образа и chroot в Ubuntu.
Создаем файл b в и сохраняем его в каталог /sdcard/ubuntu со следующим содержанием
Скрипт на монтирование и вход в Ubuntu
mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
echo «SET VARIABLES»
export bin=/system/bin
export mnt=/data/local/ubuntu
export PATH=$bin:/usr/bin:/usr/sbin:/bin:$PATH
export TERM=linux
export HOME=/root
if [! -d /data/local/ubuntu ]
then
mkdir /data/local/ubuntu
chmod 777 /data/local/ubuntu
fi
echo «SET UP LOOP DEVICE»
losetup /dev/block/loop1 /sdcard/ubuntu/ubuntu.img
echo «MOUNT»
mount -t ext4 /dev/block/loop1 /data/local/ubuntu
mount -t devpts devpts $mnt/dev/pts
mount -t proc proc $mnt/proc
mount -t sysfs sysfs $mnt/sys
echo «SET UP NETWORK»
sysctl -w net.ipv4.ip_forward=1
echo «nameserver 208.67.222.222» > $mnt/etc/resolv.conf
echo «nameserver 208.67.220.220» >> $mnt/etc/resolv.conf
echo «127.0.0.1 localhost» > $mnt/etc/hosts
echo «ENTER UBUNTU»
chroot $mnt /bin/bash
echo «UMOUNTING»
umount -lfr $mnt/dev/pts
umount -lfr $mnt/proc
umount -lfr $mnt/sys
umount -lfr $mnt
losetup -d /dev/block/loop1
echo «SET VARIABLES»
export bin=/system/bin
export mnt=/data/local/ubuntu
export PATH=$bin:/usr/bin:/usr/sbin:/bin:$PATH
export TERM=linux
export HOME=/root
if [! -d /data/local/ubuntu ]
then
mkdir /data/local/ubuntu
chmod 777 /data/local/ubuntu
fi
echo «SET UP LOOP DEVICE»
losetup /dev/block/loop1 /sdcard/ubuntu/ubuntu.img
echo «MOUNT»
mount -t ext4 /dev/block/loop1 /data/local/ubuntu
mount -t devpts devpts $mnt/dev/pts
mount -t proc proc $mnt/proc
mount -t sysfs sysfs $mnt/sys
echo «SET UP NETWORK»
sysctl -w net.ipv4.ip_forward=1
echo «nameserver 208.67.222.222» > $mnt/etc/resolv.conf
echo «nameserver 208.67.220.220» >> $mnt/etc/resolv.conf
echo «127.0.0.1 localhost» > $mnt/etc/hosts
echo «ENTER UBUNTU»
chroot $mnt /bin/bash
echo «UMOUNTING»
umount -lfr $mnt/dev/pts
umount -lfr $mnt/proc
umount -lfr $mnt/sys
umount -lfr $mnt
losetup -d /dev/block/loop1
Особенно будьте внимательны в строке
mount -t ext4 /dev/block/loop1 /data/local/ubuntu
важно правильно указать тип файловой системы на монтируемом образе.
Запустите приложение терминала
Введите в терминале команду и нажмите «Enter»:
su
Введите в терминале команду и нажмите «Enter»:
cd /sdcard/ubuntu
Введите в терминале команду и нажмите «Enter»:
sh b
Если вы видите «root@localhost:/#» — поздравляем! Теперь вы работаете в Ubuntu x86
Каждый раз, когда вы хотите войти в Ubuntu, — вы должны просто ввести su, а затем sh b в вашем Android-терминале.
Чтобы правильно выйти из Ubuntu — вы должны ввести exit в терминале Ubuntu.
Настраиваем VNC
Убедитесь, что есть подключение к сети
Введите в терминале команду и нажмите «Enter», дождитесь завершения:
apt-get update
Введите в терминале команду и нажмите «Enter», на вопрос ответьте y:
apt-get install tightvncserver
Продолжаем работать под chroot.
Заходим в /bin
Там создаём файл x с содержанием:
rm -r -f /tmp
mkdir /tmp
chmod 777 /tmp
export USER=root
export XKL_XMODMAP_DISABLE=1
vncserver -geometry 800x550
800x550 замените разрешение вашего эмулятора/устройства
Учтите что в Android 4 нижняя панель занимает определенное число пикселов. В моем случае это 50 пикселов. Поэтому что бы не приходилось в VNC клиенте прокручивать указал не 600 как в эмуляторе, а 550.
Наиболее простой способ узнать разрешение это снять скрин.
Сделайте chmod 777 x
С помощью предыдущего шага мы создали сценарий x. Когда вы хотите начать работать с графическим режимом — введите x в терминале Ubuntu и нажмите Enter. Обратите внимание, что при первом запуске сценария x (Только в первый раз) вам будет предложено создать пароль, для VNC-соединения. Введите необходимый вам пароль (Учитывает только 8 первых символов). Также вам будет предложено создать пароль «только для просмотра» (view-only) — откажитесь, введя ответом на вопрос n
Запустите android-vnc-viewer. Создайте новое соединение, со следующими параметрами:
Nickname: все что угодно
Password: установленный вами пароль VNC-соединения
Address: localhost
Port: 5901
Color format: 24-bit color (4 bpp)
Нажмите кнопку «Connect». Через несколько минут Ubuntu запустится в графическом режиме.
Нам все еще нужно создать окончательный сценарий, под названием s
Идем опять в /bin
Там создаём файл x с содержанием:
export USER=root
vncserver -kill :1
vncserver -kill :2
sudo reboot
sudo halt
Делаем chmod 777 s
Если у вас работает графический интерфейс и вы хотите завершить работу с Ubuntu, то вы ОБЯЗАТЕЛЬНО ДОЛЖНЫ выполнить s в терминале Ubuntu, чтобы остановить VNC-сервер.
Ну и финальная часть
Ставим Wine
ну тут все тривиально
sudo apt-get install wine
Не много о подводных камнях
Мне пришлось работать под эмулятором, в котором вероятно нет чудесного бинарного транслятора от Intel.
По этому софт написанный с использованием NDK просто не запускался, вываливаясь с ошибками.
Именно поэтому используется android-vnc-viewer, так он написан без NDK. Но учтите android-vnc-viewer не полностью поддерживает хардверную клавиатуру. А полноценные аналоги не работают.
Проверить использовался ли NDK достаточно просто. Откройте *.apk, например в WinRAR если есть каталог lib, значит NDK использовался. В этом каталоге можно посмотреть под какие архитектуры собиралось приложение. Думаю скоро разработчики помимо ARMv6, v7 будут добавлять x86.
Учтите скорость под эмулятором скорость не очень высокая. Также я использовал достаточно тяжёлую оболочку в Ubuntu.
В android-vnc-viewer правая кнопка мыши, в определенном режиме, работает как двойной клик левой.
Хочется увидеть насколько производительным окажется на первых порах бинарный транслятор в играх.
![image](https://habr.com/images/px.gif#%3D%22http%3A%2F%2Fimg803.imageshack.us%2Fimg803%2F2043%2Fwine.png%22)
Победа
Спасибо друзьям с 4pda EeeeKa, а также bit_imp за помощь и статьи.
Ссылка для тех кто хочет попробовать запустить, уже готовый образ Android с Ubuntu под VirtualBox
narod.ru/disk/53940773001.7d8f3a1e5cbcdf6499737ecdb1c83337/Android%204%20x86.7z.html