Запускаем Ubuntu x86 + Wine под Android x86 (chroot+VNC)

в 7:28, , рубрики: Android x86, wine, Песочница, метки: ,

Предисловие

Тема запуска Ubuntu на Android устройствах уже достаточно избитая, в сети можно найти большое количество мануалов. Но есть одно НО! Речь идет об ARM архитектуре.
Однако Intel уже анонсировала свои планы по продвижению процессоров Medfield (x86) на мобильный рынок. А также стали появятся уже готовые к употреблению смартфоны.
В Индии это Lava XOLO X900. А также его копия под брендом оператора Orange для Европы.
image

Lava XOLO X900


image

Версия от оператора Orange


Для Китая Lenovo выпустила модель LePhone K800
image

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 {} ;

Далее в консоли на ввод подаём блочное устройство промонтированного образа 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
Корректную работу интернета можно настроить через терминал:
вывести список сетевых интерфейсов. Среди них должен быть например eth0
ip a
получить права рута:
su
получить настройки сети по DHCP
dhcpcd eth0
настроить DNS сервер
setprop net.dns1 8.8.8.8
После этих действий интернет на виртуальной машине должен появиться.
настроить adb. В опциях VirtualBox пробросить порт виртуальной машины 5555 например на порт 5556 хоста.
image
Теперь можно соединяться с виртуальным 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

Особенно будьте внимательны в строке
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

Победа

Спасибо друзьям с 4pda EeeeKa, а также bit_imp за помощь и статьи.

Ссылка для тех кто хочет попробовать запустить, уже готовый образ Android с Ubuntu под VirtualBox
narod.ru/disk/53940773001.7d8f3a1e5cbcdf6499737ecdb1c83337/Android%204%20x86.7z.html

Автор: specx2

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js