我的E680I(小I)手机已经用了快两年了, 最近出现一下奇怪的错误,比如运行JavaME程序时提示说许可无效,运行第三方的Ezx程序时突然退出, 电话本和日程安排无法保存,短信功能经常出现“等待DB”等等, 难道我的小I的走到了生命的尽头?由于暂时没有换手机的预算,加上自己对Linux比较熟悉,因此抱着试试看的想法,看能不能自己解决这些问题。
熟悉小I的人都知道,该手机的Linux文件系统主要由如下几个设备组成
设备名称 | 加载点 | 描述 |
/dev/root | / | 存放根文件系统,也就是平常说的33包,只读 |
/dev/tffsa | /usr/language | 存放系统内置的主题和语言,就是平常说的35包,只读 |
/dev/roflash2 | /usr/setup | 存放系统默认配置(比如网络连接、Opera、RealPlayer等系统以及自带软件的配置),也是平常说的36包,只读 |
/dev/mtdblock2 | /ezxlocal | 这个设备不知应该叫什么,有人称之为内存,但是好像又不太正确,该部分可读写,存放电话本、短信、彩信,当然还有程序运行的配置,比如浏览器使用的是cmwap还是cmnet等,个人认为,可以理解为是保存手机配置的一个特殊分区;顺便罗唆一句,真正的内存在哪里呢?通过查看手机的启动脚本发现, 原来真正的运行内存(/dev/ram)被加载到/ram目录, 大概有12M左右,启动后系统占用40%~60%,如果不够用可以考虑使用扩展内存,这个不会自己搜索吧,不罗唆了。 |
/dev/mmca1 | /mmc/mmca1 | SD卡,自己买的,不用多说,读写 |
/dev/tffsb1 | /diska | 手机内部的存储空间,即硬盘,52M左右,(并不是Moto说的内存,不过好像不论是那个厂商,都这样说, Nokia也不例外),读写 |
对于手机出现的问题逐一进行分析:
- 运行JavaME程序提示说许可无效,对于内置的程序来说,系统自带了运行的许可,存放于/usr/setup, 运行是许可会被复制一份到/ezxlocal, 对于后来自己安装的程序来说, 存放于/ezxlocal,对手机进行主清楚,主恢复操作之后, 运行JavaME程序依然出现这样的错误,则有可能是/ezxlocal或者/usr/setup这两个设备出现了问题;
- 运行第三方的Ezx程序时会退出,第三方的Ezx程序和/usr/setup无关,那么就只有和/ezxlocal有关了,如果/ezxlocal出现了问题的话,那么运行Ezx程序会退出也就不奇怪了,就像读写有坏道的硬盘一样,肯定会出问题的;
- 电话本,日程安排和短信等也是存储于/ezxlocal,如果是/ezxlocal出现了问题, 这三部分不能正常使用也是说得过去的。
问题的原因清楚了,再验证一下 ,telnet进手机,先用手机内部存储进行测试,在diska的preload目录下新建两个目录,setup和ezxlocal,setup目录用于存放/usr/setup目录下的文件, ezxlocal用于存放/ezxlocal目录下的文件,然后执行如下的两个命令,分别复制两个目录:
cp -r /usr/setup /diska/preload/setup
cp -r /ezxlocal /diska/preload/ezxlocal
然后在执行两个绑定的命令:
mount --bind /diska/preload/setup /usr/setup
mount --bind /diska/preload/ezxlocal /ezxlocal
mount --bind的作用是将一个目录加载到另外一个加载点,通过执行上面的命令,如果再读取/ezxlocal或者/usr/setup两个目录下的文件,那么读取到的将是/diska/preload下相应的目录中的内容,也即使说,系统原来的/ezxlocal和/usr/setup被屏蔽掉了,由于/diska是可读写的, 所以现在的/ezxlocal和/usr/setup也是可读写的了。
执行了如上的几个命令之后,奇迹出现了,运行程序不死机了,特别是用内置的opera浏览网站时不会自动退出了,以前只要一浏览比较大的网页就会自动退出,运行JavaME程序也不会弹出许可无效了,看来我的估计是正确的。
知道了问题的原因,解决方法自然就知道了,利用mount命令,将怀疑出问题的设备/ezxlocal和/usr/setup绑定到手机存储或者SD/MMC卡上,问题就解决了。具体操作如下:
- 将SD卡分成2个分区, 第一个是fat格式,给手机使用,手机只能识别第一个分区,第二个是ext2格式,用于存放/ezxlocal和/usr/setup的目录下的文件, 当然,多出来的空间也可以存放备份文件;
- 修改刷机包33包,在/etc/rc.d/rc2.d目录下增加S80autorun.sh,因为根据Linux系统的机制,这个文件会在系统启动时被执行,内容如下:
#!/bin/bash
if [ -f /mmc/mmca1/.system/autorun.txt ]
then
. /mmc/mmca1/.system/autorun.txt
fi
这个简单吧, 就是再启动检查一下sd卡上的autorun.txt, 如果存在则执行它,否则什么都不做。和网上流传的自启动刷机包差不多, 其实都是一个原理,然后用flashkit或者PST刷到手机就行了,推荐使用flashkit,因为这个比较快,而且不会清楚已经保存的配置,包括短信、电话本等都不受影响。
#! /bin/bash
# 测试发现/ezxlocal只能被绑定到fat文件系统上,不能被绑定到ext2文件系统上,否则会出错
mount --bind /diska/preload/ezxlocal /ezxlocal
# 加载ext2模块,可以加载ext2文件系统
insmod /mmc/mmca1/.system/modules/ext2.o
# 创建一个节点,因为原来没有sd卡第二个分区的节点
mknod /tmp/mmca2 b 243 2
# 加载第二分区到/diskb, 也可以加载到任何也有节点
mount -t ext2 /tmp/mmca2 /diskb
# 由于经常要修改主题,因此这个分区也被我绑定过来了
mount --bind /diskb/language /usr/language
mount --bind /diskb/setup /usr/setup
export QTDIR=/usr/lib/ezx
执行完了如上步骤,现在把卡插入手机,然后重新开机,发现出现问题的频率大大降低,几乎为零,看来“移花接木”成功了,简单的说,所谓的“移花接木”,就是用其它的存储来代替并屏蔽原有的存储,比如用sd卡上的存储来代替手机原来的存储,这样,我的小i又可以用上一段时间了。
Moto的E680系列手机已经给许多用户留下了深刻的印象,相信许多用户都喜欢这一系列手机的自定义功能,可惜的是由于商业原因,Motorola没能够公布Ezx的SDK,导致这一系列手机的软件相对比较匮乏,否则这一系列的手机将会更加受欢迎的。(这句是废话,发个牢骚)