“移花接木”修復E680i系統內部錯誤
我的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系統的機制,這個文件會在系統啟動時被執行,內容如下:
- 編寫自動執行的autorun.txt文件,我編寫的內容如下:
#!/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,導致這一系列手機的軟件相對比較匱乏,否則這一系列的手機將會更加受歡迎的。(這句是廢話,發個牢騷)
張志敏所有文章遵循創作共用版權協議,要求署名、非商業 、保持一致。在滿足創作共用版權協議的基礎上可以轉載,但請以超鏈接形式注明出處。
本博客已經遷移到 GitHub , 圍觀地址: https://beginor.github.io/
浙公網安備 33010602011771號