在XOLO X900上实现Ubuntu for Android
本文同步自(最佳显示效果请点击):https://zohead.com/archives/ubuntu-for-xolo-x900/
由于 Lava XOLO X900 使用的 Intel Atom Z2460 这一 x86 的 CPU,我们就可以做一些改动,让其实现初步的 Ubuntu for Android 效果,而且运行的是 x86 版本的 Ubuntu,相对于 ARM 版本(不能运行私有软件,没有源代码的话啥都干不了)来说实用性要好很多的。
先看看实际的效果图:
现在我在这个 Android 手机里的 Ubuntu 上已经开始正常运行 Skype、Ubuntu One、sopcast 等应用,而且 Ubuntu 和 Android 系统是共存同时运行的,Ubuntu 是运行在外部屏幕上的,对 Android 完全没有影响,不需要 VNC 登录之类的。
Canonical 公司提出的 Ubuntu for Android 请参考这里:
http://www.ubuntu.com/devices/android
这里提到的 Canonical 的 Ubuntu for Android 的要求有:
- 双核手机,内存最少 512MB;
- 支持 secondary frame buffer;
- 支持 USB OTG
对于 XOLO X900 来说,第二点要求 secondary frame buffer 暂时无法满足,因为官方的 kernel 只注册了 /dev/graphics/fb0 一个 frame buffer 设备。但由于支持 USB OTG,我们这里暂时用支持 Linux frame buffer 的外置 USB 显卡来实现。
需要的设备及配件:
- Motorola LapDock 100(做显示器及键盘鼠标输入,同时接 USB 外置显卡,你完全可以用自己的显示器)
- DisplayLink USB 显卡
- USB OTG 线
- HDMI 线
1、准备 x86 Ubuntu 环境:
由于 XOLO X900 只有 16GB 的 ROM 空间,为了速度和扩展考虑,最好可以将 Ubuntu 安装在隐藏未启用的 microSD 插槽上,最好使用 Class 10 的 microSD,这样不会对 Ubuntu 的性能造成影响。
你可以参考这个视频(只有 Youtube 哈)查看如果启用隐藏的 microSD 插槽:
http://www.youtube.com/watch?v=6-FkK7Htohs
下面是找一个合适的 Ubuntu 系统,如果你有时间的话,完全可以用 VMware 安装一个虚拟机到 SD 卡上。如果你像我一样不想浪费时间安装,可以到网上下载现成的 VMware vmdk 映像并直接拷贝到 SD 卡上。
我选择的是下面这个 Lubuntu 12.04 系统,因为使用 LXDE 桌面,速度比较快,这个网站也有完整的 Unity 桌面环境的 Ubuntu 12.04 系统哦:
http://www.trendsigma.net/vmware/lubuntu1204.html
你可能需要另一个 Linux 虚拟机来将 Lubuntu 映像里的所有文件拷贝到 SD 卡里(最好能对 SD 卡进行分区,我是建立了一个 ext4 的分区)。
2、准备需要的 DisplayLink USB 显卡驱动:
由于 XOLO X900 官方 kernel 对 frame buffer 支持并不完整(缺少 defio 等支持),官方 3.0.8 kernel 源代码里的 DisplayLink USB 显卡驱动 udlfb 无法正常编译。
我基于下面的 udlfb 项目的 0.4 版本修改了一个新的可直接用于 XOLO X900 官方 kernel 的 udlfb 驱动(默认代码加载之后无法正常显示图像):
http://git.plugable.com/gitphp/index.php?p=udlfb
我修改过的 udlfb 0.4 驱动的下载地址:
http://miseal.googlecode.com/files/udlfb-v0.4.tar.bz2
相对默认 0.4 版本的主要改进为:
- 解决在 Linux 3.0.8 中无法正常编译的问题;
- 解决 kzalloc 分配内存失败的问题,以 vmalloc 替代;
- 增加卸载驱动时的释放内存处理;
- 自动根据 EDID 判断显示器分辨率,默认使用 EDID 得到的分辨率;
- 如果 EDID 无法得到合适的分辨率,使用默认 1280x1024 分辨率;
- 增加模块参数,加载模块时可以指定初始分辨率
编译方法请参考之前写的编译 XOLO X900 自定义 kernel 的文章:
https://zohead.com/archives/xolo-x900-kernel/
如果你想直接用我编译好的,请访问此链接下载:
http://miseal.googlecode.com/files/x900-kernel-config-modules.7z
编译好的 udlfb.ko 在解压缩出来的 modules 目录中,建议将 modules 目录拷贝到 /system/lib 目录中。
3、测试 udlfb 驱动是否可用:
通过外置带电源的 USB HUB 接上 DisplayLink USB 显卡(Motorola Lapdock 就是一个带电源的 USB HUB 哈),并将显卡接到外置显示器上,root 过之后,在 shell 中运行 su 然后运行:
insmod /system/lib/modules/udlfb.ko
如果一切正常的话,驱动将自动判断你的显示器分辨率,并在显示器中显示绿屏。
然后运行下面的命令检查 frame buffer 设备是否正常,一般应有正常的设备节点信息输出:
ls -l /dev/graphics/fb1
如果你的显示器不支持 EDID 或者默认的 1280x1024 分辨率不支持,也可以加载驱动时手工指定分辨率,例如:
insmod /system/lib/modules/udlfb.ko init_xres=1024 init_yres=768
上面的命令即将初始分辨率设置为 1024x768。
4、屏蔽 Android 本身对 USB 键盘鼠标的支持:
由于 XOLO X900 默认支持 USB OTG,通过 OTG 接上 USB 键盘鼠标之后,可以直接对 Android 进行操作,而且任何对键盘和鼠标的操作都会解锁手机,这对于我们运行 Ubuntu for Android 是毫无益处的,而且会导致重复的 input event 发到 Android 界面上。因此我们需要屏蔽 Android 本身对 USB 输入设备的支持。
首先接上 USB 键盘和鼠标(通过 USB HUB),并确定是哪个 input 设备,同样在 root 中 su 运行:
ls /dev/input/event*
你会看到很多个 event 设备,一一用下面的命令(把 X 换为具体的设备名)确定到底哪个是你所插上的 USB 键盘和鼠标,cat 之后在键盘上敲键或者移动鼠标,正确的设备将会有输出:
cat /dev/input/eventX
假设确定好鼠标和键盘分别为:/dev/input/event10 和 /dev/input/event11。
然后运行 dmesg 确定 USB 键盘和鼠标的设备名,你可以看到类似这样的输出:
usb 1-1: new high speed USB device number 2 using penwell_otg hub 1-1:1.0: USB hub found hub 1-1:1.0: 7 ports detected usb 1-1.1: new full speed USB device number 3 using penwell_otg input: Motorola Mobility Motorola HD Dock as /devices/pci0000:00/0000:00:02.3/usb1/1-1/1-1.1/1-1.1:1.0/input/input11 generic-usb 0003:22B8:0938.0003: input,hidraw0: USB HID v1.01 Keyboard [Motorola Mobility Motorola HD Dock] on usb-0000:00:02.3-1.1/input0 usb 1-1.3: new low speed USB device number 4 using penwell_otg input: BTC USB Cordless Mouse as /devices/pci0000:00/0000:00:02.3/usb1/1-1/1-1.3/1-1.3:1.0/input/input12 generic-usb 0003:1241:0003.0004: input,hidraw1: USB HID v1.10 Keyboard [BTC USB Cordless Mouse] on usb-0000:00:02.3-1.3/input0 input: BTC USB Cordless Mouse as /devices/pci0000:00/0000:00:02.3/usb1/1-1/1-1.3/1-1.3:1.1/input/input13 generic-usb 0003:1241:0003.0005: input,hidraw2: USB HID v1.10 Mouse [BTC USB Cordless Mouse] on usb-0000:00:02.3-1.3/input1 usb 1-1.6: new high speed USB device number 5 using penwell_otg
上面的 Motorola Mobility Motorola HD Dock 和 BTC USB Cordless Mouse 即为 USB 键盘和鼠标设备的设备名,记下这些。
编译 /system/etc/excluded-input-devices.xml 配置文件,将上面的 USB 键盘和鼠标设备名加入进来,然后重启手机,在 USB 输入设备上的操作就不会影响 Android 系统。
例如我的配置文件内容如下:
<?xml version="1.0" encoding="utf-8"?> <devices> <device name="Unipoint HID"/> <device name="RMI4 Unipoint"/> <device name="Motorola Mobility Motorola HD Dock"/> <device name="BTC USB Cordless Mouse"/> </devices>
5、在 Android 中切换到 Ubuntu 环境:
首先 su 运行 shell 创建一个目录作为 Ubuntu 分区的挂载点(这里假设为 /system/sd):
mount -o remount,rw /dev/block/mmcblk0p2 /system
busybox mkdir -m 777 /system/sd
mount -o remount,ro /dev/block/mmcblk0p2 /system
你可以使用我写好的这个切换到 Ubuntu 的脚本 startubuntu(我这里是挂载了 SD 卡第一个 ext4 分区,请根据需要自行修改):
http://pastebin.com/raw.php?i=9r21dR7L
我在脚本中将 Android 中的 /mnt/sdcard 目录挂载到了 Ubuntu 里的 /sdcard 目录,Android 系统的 /system 目录挂载到了 /android/system 目录,这样可以很方便的在 Ubuntu 中访问 Android 系统中的数据。
6、准备运行 X 的环境:
假设你已经切换到 Ubuntu,首先安装 DisplayLink 的 X 驱动:
apt-get install xserver-xorg-video-displaylink
然后安装输入模块:
apt-get install xserver-xorg-input-evdev
安装成功之后,修改 /etc/X11/xorg.conf X11 配置文件(Ubuntu 12.04 中没有这个配置文件,需要在 /usr/share/X11/xorg.conf.d 目录中自己增加新的配置文件,我的为:52-displaylink.conf),内容为下面的链接:
http://pastebin.com/raw.php?i=WjcfFWc2
注意请将其中的 input 设备和分辨率改为自己需要的。
7、运行 X - 最终的 Ubuntu for Android:
产生 X 的初始配置文件 /root/.xinitrc:
#!/bin/sh
xrandr -o 0
startlubuntu
第二行的 xrandr 命令是专门为 DisplayLink udlfb 驱动修改的,没有这个的话可能会导致 X 环境中的菜单项不能正确显示。第三行的 startlubuntu 你可以替换成你需要的 X 命令(例如:xinit lxsession)。
然后运行 startx 就可以启动 X 桌面环境了。
某些情况下如果这样运行 startx 还是有问题,可以在 startx 时增加参数:
startx -- :0 vt1
如果这样可以的话表示 X 使用的 VT 不正确,这时你可能需要将 /etc/X11/xinit/xserverrc 改为下面这样以强制指定 X 使用的 VT:
#!/bin/sh
exec /usr/bin/X -nolisten tcp vt1 “$@”
8、总结:
这样实现的 Ubuntu for Android 实际还是有一些不足的:
- 必须要有外置的 USB 显卡太不方便,而且热插拔 USB 显卡会导致 X server 直接挂掉,最好的解决方案是启用 HDMI frame buffer;
- 暂时没有声音输出,可能可以用 USB 声卡,或者将声音输出至手机(能想象的到的丑陋);
- 不支持通过 USB HUB 进行充电,应该是要修改 kernel 才能支持
本文的内容均为我根据实际使用所写,没有考虑到通用的情况,其中有任何问题欢迎提出指正哦 ^_^
liush:
2013年04月03日 星期三 09:11下午
Could u upload a video for these instructions?
Thanks~~~
qzuser:
2013年05月09日 星期四 03:33下午
您好 想請問一下 哪裡可以下載到XOLO的kernel source code呢? 感謝您
admin:
2013年05月09日 星期四 03:35下午
XOLO并没有公布kernel source,我使用的是Moto Razr i的source,编译方法及改动你可以参考我的另一篇文章:构建联想K800非官方kernel支持OTG U盘 ~~~
Antone D. Allison:
2013年07月07日 星期日 12:26下午
Thanks, Zhiming Unzipped Lbuntu1204 contains: Lbuntu-s001.vmdk…to..Lbuntu-s021.vmdk (21 files), Lbuntu.vmdk, Lbuntu.vmsd, Lbuntu.vmx, nvram and readme.txt (one file each) Previously I confused that it was just required to put above 25 files on ubuntu partition.
admin:
2013年07月18日 星期四 11:04下午
You just need a VMWare software to copy all files in these vmdks (showed as a VMWare disk) to Ubuntu partition on your SD card
bex2:
2013年08月27日 星期二 02:30下午
Hi Uranus_Zhou,
as an advanced owner of x900 have you tried to run there any pc applications (linux or windows)? Were there any compatibility issues with z2460?
More detailed: http://www.modaco.com/topic/364511-q-running-desktop-applications/
Thank you in advance.
admin:
2013年08月27日 星期二 03:08下午
Hi:
If you run a full desktop Linux system in XOLO X900 like android x86 device,
desktop Linux runs in chroot environment (in android x86 kernel), it’s able to run PC applications
Please refer to my post about running Ubuntu for Android on XOLO X900:
http://zohead.com/archives/ubuntu-for-xolo-x900/?lang=en
I’ve managed to run desktop programs like: Ubuntu One, Skype, Sopcat, LibreOffice …
And also it’s able to run some Windows program with Wine emulator in desktop Linux
bex2:
2013年08月27日 星期二 04:03下午
Thank you very much for quick reply. I’ll post it on modaco tomorrow (with a link to these comments; please let me know if you have any objections).
And just out of curiosity possibly there were some programs which didn’t work? (I mean not games, but think games statistic will be interesting for others as well)
admin:
2013年08月27日 星期二 05:32下午
It’s OK you post these on MoDaCo, i’ve post a topic about running Ubuntu for Android on XOLO X900 in MoDaco before.
The problem is I’m using a DisplayLink USB display adapter (with powered USB hub, very ugly) for X11 desktop Linux display,
if you want to avoid use USB display adapter, you may need to use tightvncserver to run X11 server,
and run VNC viewer in Android to connect to desktop Linux (you can use HDMI output to larger screen for XOLO X900),
VNC performance is quite poor, you can’t do something like gaming, video playback may also quite slow
And if you are running chroot Ubuntu, Upstart may not work well, there is a solution in my blog
Also some hardware or driver related program can’t run in chroot Linux
bex2:
2013年08月27日 星期二 06:51下午
Thank you very much for your time and support.
http://www.modaco.com/topic/364511-q-running-desktop-applications/#entry2152234
梁远恒:
2014年03月06日 星期四 01:21上午
你好,我想在x86架构的手机Lenovo k900是实现Ubuntu12.04该怎么做?
admin:
2014年03月06日 星期四 11:38上午
跟这个文章的实现方法类似,不过如果没有外置显卡驱动支持的话,
需要通过VNC的方式来显示Ubuntu的X界面
火渡凯:
2014年03月09日 星期日 05:43下午
视频是看了,讲的什么不清楚,插上tf卡不能识别到,是不是跟固件有关呢?
admin:
2014年03月09日 星期日 05:54下午
你用的x900?视频就是讲怎么把tf卡放到隐藏插槽里,默认系统不能直接用,需要root之后装软件(国外论坛里有)使用。
我这个ubuntu方法就是直接用tf卡设备,tf卡在安卓系统里默认未启用的
火渡凯:
2014年03月17日 星期一 11:05下午
原来视频只是讲了一下插槽位置啊,汗!我去找找看需要安装什么。我现在已经用chroot的方法运行debian了,搞点开发真的很方便,X86就是好啊!另外,非常感谢你的回复!
admin:
2014年03月17日 星期一 11:38下午
不客气,只要不是系统相关的开发还是比较方便的
google plus age restriction:
2014年06月19日 星期四 11:31上午
Nice post. I was checking constantly this blog and I am impressed!
Extremely helpful information specially the last part I care for such information much.
I was looking for this particular info for a long time. Thank you and best of luck.
Dave Sandler:
2014年07月21日 星期一 01:01上午
I do not even know the way I finished up here, however
I believed this post was good. I don’t understand who you might be but definitely you’re going to a
famous blogger if you are not already. Cheers!
Veta:
2015年02月22日 星期日 02:26下午
WOW just what I was searching for. Came here by searching for 12.04