主要参照了以下几个帖子:
1、本论坛 felonwan的帖子。他的帖子里面的链接失效了,所以仅借用了他的脚本和思路。而如何生成ubuntu的img文件,则借用了其他帖子。
viewtopic.php?f=177&t=451917
2、以下两个帖子(关于如何生成ubuntu的img文件的,但是没有提供手机启动脚本):
http://www.oschina.net/translate/how-to ... -phone?cmp
http://blog.sina.com.cn/s/blog_5f52c0600100u86x.html
其实第二个帖子是我写的,但是发现论坛内居然被删除了,然后希望搜索到某个镜像,真的搜索到了(稍微有点不全)。
闲话说完,以下正式开始:
原理:
主要原理见felonwan的帖子,我做的和他的有一点差异。具体做法如下:
1、在ubuntu的电脑上,利用chroot、debootstrap和qemu-arm-static三个命令,虚拟出一个手机环境,并安装好软件,做成一个img文件。
2、把这个文件拷贝到安卓手机,用命令启动它,并利用Xerver XSDL输出图形界面。
几个注意点:
1、支持手机arm构架的源很少,至少国内的几个源,都不支持(仅支持intel和amd的构建)
2、这种虚拟的环境,和手机环境总归有点差异,所以移植到手机后,有些软件不能执行。所以如果要调整什么软件,尽可能还是在ubuntu的虚拟环境中进行,然后将img文件复制到手机。
3、手机屏幕太小了,所以实际效果并不好,基本上这就是一个玩具。
4、占用空间比较大,手机没有4G以上空闲空间就不要折腾了。
5、手机必须root。
具体操作
一、生成可用的镜像,并安装你喜欢的软件:
1、为ubuntu设置QEMU和ARM二进制以及asdebootstrap支持:
代码: 全选
sudo apt-get install debootstrap qemu-user-static qemu-system git gcc-arm-linux-gnueabihf binfmt-support
代码: 全选
dd if=/dev/zero of=ubuntu.img bs=1024 count=3145728
mkfs.ext4 ubuntu.img
sudo mount -o loop ubuntu.img /mnt
3、使用debootstrap来部署基础环境,并将qemu-arm-static复制进基本环境中:
代码: 全选
HOSTNAME=ubuntu-armhf sudo debootstrap --variant=minbase --foreign --arch armhf trusty /mnt
sudo cp /usr/bin/qemu-arm-static /mnt/usr/bin/
代码: 全选
LANG=zh_CN.UTF-8 sudo chroot mnt /usr/bin/qemu-arm-static -cpu cortex-a15 /bin/bash
./debootstrap/debootstrap --second-stage
我的酷派大神f1其实是cortex-a7,但是也许是太新了,现在还不支持,所以选了较为接近的cortex-a15。
5、一旦上面的工作完成了,我们需要安装apt源,并更新:
代码: 全选
echo "deb http://ports.ubuntu.com trusty main restricted universe multiverse" > /etc/apt/sources.list
echo "deb http://ports.ubuntu.com trusty-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb http://ports.ubuntu.com trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://ports.ubuntu.com trusty main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://ports.ubuntu.com trusty-security main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://ports.ubuntu.com trusty-updates main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://ports.ubuntu.com trusty-proposed main restricted universe multiverse" >> /etc/apt/sources.list
echo "deb-src http://ports.ubuntu.com trusty-backports main restricted universe multiverse" >> /etc/apt/sources.list
apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 428D7C01
apt-get update
apt-get dist-upgrade
代码: 全选
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"
chmod -R 777 /var/lib/locales/supported.d/
cd /var/lib/locales/supported.d/
touch ja
touch ko
touch zh
chmod -R 777 /var/lib/locales/supported.d/
echo "ja_JP.UTF-8 UTF-8" >>ja
echo "ja_JP.EUC-JP EUC-JP" >>ja
echo "ko_KR.UTF-8 UTF-8" >>ko
echo "ko_KR.EUC-KR EUC-KR" >>ko
echo "zh_CN.UTF-8 UTF-8" >>zh
echo "zh_TW.UTF-8 UTF-8" >>zh
echo "zh_CN.GB2312 GB2312" >>zh
echo "zh_CN.GBK GBK" >>zh
echo "zh_CN.GB18030 GB18030" >>zh
echo "LANGUAGE=zh_CN:zh:en_US:en" >> /etc/environment
echo "LC_CTYPE=zh_CN.UTF-8" >> /etc/environment
echo "LANG=zh_CN.UTF-8" >> /etc/environment
echo "GST_ID3_TAG_ENCODING=GBK" >> /etc/environment
cd /
dpkg-reconfigure locales
dpkg-reconfigure tzdata
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8" #从这句以后,shell内开始显示中文了。
apt-get install xfonts-base xfonts-100dpi xfonts-75dpi xfonts-scalable xfonts-wqy fonts-wqy-microhei fonts-wqy-zenhei
apt-get clean
7、然后,你就可以安装各种软件(我安装了kubuntu桌面环境):
代码: 全选
apt-get install sudo apt-utils dialog less wget vim net-tools openssh-server \
htop tmux build-essential libevent-dev python-dev python-setuptools \
python-lxml sqlite3 nodejs npm
apt-get install kubuntu-desktop
apt-get clean
apt-get install kubuntu-restricted-extras
apt-get clean
apt-get install language-pack-zh-hans language-pack-zh-hans-base language-pack-kde-zh-hans language-pack-gnome-zh-hans language-pack-gnome-zh-hans-base firefox-locale-zh-hans thunderbird-locale-zh-hans kde-l10n-zhcn
apt-get clean
8、添加拥有sudo权限的用户(注意:其实在安卓的ubuntu里面用不上,里面是root用户直接进入环境的):
代码: 全选
adduser ubuntu
addgroup --system admin
echo "admin ALL=(ALL:ALL) ALL" >> /etc/sudoers
usermod -G ubuntu,admin,plugdev,audio,video ubuntu
passwd
代码: 全选
echo "export DISPLAY=127.0.0.1:0" > /bin/starkde
echo "export LANGUAGE=zh_CN:zh" > /bin/starkde
echo "export LC_CTYPE=zh_CN.UTF-8" >> /bin/starkde
echo "export LANG=zh_CN.UTF-8" >> /bin/starkde
echo "export LC_ALL="zh_CN.UTF-8" >> /bin/starkde
echo "startkde" >> /bin/starkde
chmod a+x /bin/starkde
exit
代码: 全选
sudo mkdir /mnt/sdcard
sudo mkdir /mnt//dev/shm
sudo umount /mnt
1、压缩img文件,压缩后传给手机,并在手机中建立挂载目录。
压缩后大概有1G,解压后3G,所以手机至少要有4G空间才行。
代码: 全选
adb push ./ubuntu.img.zip /mnt/sdcard
adb shell mkdir /mnt/sdcard/ubuntu
脚本xfdesktop(借用felonwan的,命令稍作修改,备注还未修改,备注和命令有的地方已经不一致。)
[bash]#####################################################################################
# 安卓系统进入及退出Linux桌面脚本 #
# 用法:daemonize sh xfdesktop [镜像名] [挂载路径] 启动桌面的命令 [synergy服务器IP] #
# 注意: 其中“启动桌面的命令”是必须的。 #
# “镜像名”和“挂载路径”不写则默认为“/sdcard/linux.img”和“/data/linux” 。 #
# “synergyc服务器IP”不写则不使用电脑共享的键盘鼠标。 #
# 请和xfinit脚本配合使用。 #
# 作者:felonwan@gmail.com #
#####################################################################################
####################################
# 检查是否具有root权限 #
####################################
#perm=$(id | cut -b 5)
#if [ "$perm" != "0" ];then
# echo "This script requires root! Type: su";
# exit;
#fi
##############
# 缩写 #
##############
bb="busybox"
bm="$bb mount"
bu="$bb umount"
export PATH=$bin:/usr/bin:/usr/local/bin:/usr/sbin:/bin:/usr/local/sbin:/usr/games:$PATH
############################################################
# 设置镜像名、挂载路径、启动桌面命令和synergyc服务器IP #
############################################################
if [ $# -eq 3 ]; then
img=$1
mnt=$2
dsk=$3
elif [ $# -eq 4 ]; then
img=$1
mnt=$2
dsk=$3
syg=$4
elif [ $# -eq 1 ]; then
dsk=$1
img=/sdcard/linux.img
mnt=/data/linux
else
echo "Usage:\t sh xfdesktop [img] [mnt] dsk [syg]"
echo "\t img--image file name"
echo "\t mnt--mount directory"
echo "\t dsk--command to start desktop"
echo "\t syg--synergy server ip"
exit 1
fi
echo " "
echo "Img:\t$img"
echo "Dir:\t$mnt"
echo "Desktop:\t$dsk"
echo " "
###################################
# 挂载镜像、目录 #
###################################
### 挂载镜像
echo "Mounting $img to $mnt ..."
$bm $img $mnt
### 挂载必要的目录
echo "Mounting some directories ..."
$bm -o bind /dev $mnt/dev
$bm -t devpts devpts $mnt/dev/pts
$bm -t proc proc $mnt/proc
$bm -t sysfs sysfs $mnt/sys
### 挂载有用的安卓系统目录
for dir in 'system' 'etc' ; do
adir="$mnt/a$dir"
echo "create directory: $adir ...."
if [ ! -d $adir ]; then mkdir $adir ; fi
echo "bind $dir to $adir"
$bm -o bind /$dir $adir
done
### 挂载sd卡、tf卡
chsd="$mnt/sdcard"
mSD=/mnt/sdcard
if [ ! -d $chsd ]; then mkdir $chsd; fi
$bm -o bind $mSD $chsd
#chtf="$mnt/tfcard"
#mTF=/mnt/extsd
#if [ ! -d $chtf ]; then mkdir $chtf; fi
#$bm -o bind $mTF $chtf
###########################
# 设置网络 #
###########################
$bb sysctl -w net.ipv4.ip_forward=1
echo "nameserver 8.8.8.8" > $mnt/etc/resolv.conf
echo "nameserver 8.8.4.4" >> $mnt/etc/resolv.conf
#echo "127.0.0.1 localhost" > $mnt/etc/hosts
echo "Your Linux pad can be accessed from the IP:"
ifconfig wlan0
echo " "
#########################################
# 停止安卓服务、进入Linux系统 #
#########################################
#echo "stopping android services"
#stop
echo "chroot to $mnt ..."
# $bb chroot $mnt /bin/bash
#$bb chroot $mnt /usr/bin/xfinit $dsk $syg
$bb chroot $mnt /bin/bash
##############################################
# 退出chroot后启动安卓服务、关闭linux桌面 #
##############################################
echo -e "\n\n\n\n\n=============\nBack to host android.\n============\n"
#echo "Starting android services..."
#start
#echo -e "killing dekstop..."
#pkill kde
#pkill lxde
#pkill gnome
#pkill xfce
#echo -e "killing udevd..."
#pkill udevd
echo -e "killing synergyc..."
pkill synergyc
#echo -e "killing Xorg..."
#pkill Xorg
##########################################
# 解除目录绑定、卸载镜像 #
##########################################
echo "Shutting down chroot linux ..."
for pid in `$bb lsof | $bb grep $mnt | $bb sed -e's/ / /g' | $bb cut -d ' ' -f2`; do $bb kill -9 $pid >/dev/null 2>&1; done
sleep 15s
$bu $mnt/sdcard
#$bu $mnt/tfcard
$bu $mnt/asystem
$bu $mnt/aetc
$bu $mnt/dev/pts
$bu $mnt/dev
$bu $mnt/proc
$bu $mnt/sys
$bu $mnt
if [ $? = 0 ]; then
echo 'The chroot directory have been umounted!'
fi[/bash]
通过adb来push到手机sdcard卡。
代码: 全选
adb push ./starkde /mnt/sdcard/
(1)手机端先root
(2)安装Xserver XSDL、终端模拟器
(3)打开终端模拟器、Xserver XSDL(要提前打开)
手机的终端模拟器内,依次输入以下命令:
代码: 全选
su
cd /mnt/sdcard/
sh ./xfdesktop ./ubuntu.img ./ubuntu starkde
进去以后,我这里从kde的systemsettings做配置,有几个地方会崩溃,可能要手动改几个配置文件才行:
/usr/share/kubuntu-default-settings/settings.ini(可以改gtk程序的字号)
~/.kde/share/config/kdeglobals(改系统默认语言)
代码: 全选
[Locale]
Country=cn
Language=zh_CN:en_US
kde开着,也不影响安卓的使用,不影响接打电话。
以上在酷派大神F1中亲测成功
特别注意:实际使用中,不能改成“netbook”风格。若改成这个风格,则启动时黑屏。
(另外吐槽:酷派大神F1其实无法root,仅能临时root,一重启就回复非root状态)