昨天我的小米2S(16G)刷成砖头了,今天终于救回来了,当然,还留下一些疑问等待来日慢慢研究。

先说怎么把它刷成砖头的。

因为我刷机的动机是为了把装软件的分区增大,放照片等数据的分区减小(不严谨的可以称为“重新分区”),所以我主要参考了http://bbs.xiaomi.cn/thread/index/tid/10209776上的文章。但他是基于Windows搞的,而我想尝试下直接Linux下处理。

1、给电池充满电。数据备份:通讯录短信等主要依靠小米的云服务,因为日常都同步的,所以不需要备份。照片虽然云上也有,还是手动备份了一下,特别的自己认为重要的文件也手动备份。软件不考虑备份了,反正没有特别的,到时候重新装一下吧。

2、不需要考虑数字签名问题,Deepin下也没有杀毒软件,也不需要额外给手机装驱动(一句话,这些比Windows爽多了)。当然软件还是需要的,但我不是做Android开发,所以没选择安装Android SDK,直接从深度商店(也可以用apt-get安装)安装了 android-tools-adb 和 android-tools-fastboot (后来一次刷写MIUI8稳定版的经历说明,只需要fastboot即可,不需要adb)。另外,从小米网站下载了小米手机2/2S 开发版 5.7.16  线刷包 (从文件名看,即使是相同的MIUI版本,不同的机型用的包是不一样的,估计主要是硬件层面的适配吧。另外,只有线刷包里面有shell脚本)

3、手机关机。音量加 + 开关键 -->进 Recovery 模式,清除所有,所谓三清,估计就是清除cache分区,装app的分区和放照片的数据分区。(很可能fastboot直接线刷不需要三清,因为看线刷中的提示,似乎线刷过程后期本身会擦除用户数据。这一点没有实验,不敢妄言。)

4、手机关机。音量减 + 开关键 -->进 Fastboot 模式,用数据线将手机连到电脑Deepin系统。(如果只是线刷,后面的都是多余的,直接从进入fastboot后,跳到第11步即可,如果需要调整分区,用第6步即可)

lsusb 查看USB设备是否读取到手机(Qualcomm字样?不一定能看到,还是第11步的方式,用fastboot device检测吧)

fastboot erase aboot 清除 Fastboot 模式  (如果权限不够,前面加 sudo。事实证明,这一步是致命的,擦除fastboot就好像擦除了电脑的BIOS!)

本以为只要仿照那个网上的“经验”在Linux下类似处理即可,结果:

5、拔掉数据线,按 开关键 >10秒 强制关机。扒掉电池,>1分钟后放回,重新用数据线连接电脑。

lsusb 仍然能看到手机的。进入线刷包压缩文件所在目录, tar xvzf  ***  解压线刷包,进入目录,里面有很多bat和sh文件,images目录下是各种分区镜像文件(*.mbn,*.img等),原来小米的开发人员早就做了准备工作(这是真的!Linux线刷方式包含了shell脚本,使得整个工作very easy!)。

sudo chmod a+x ./flash_all.sh

sudo ./flash_all.sh

结果,没反应。参考老罗的文章http://blog.csdn.net/luoshengyang/article/details/29688041,感觉似乎 fastboot 刷机必须是手机启动在fastboot 模式状态的,于是试图按 音量减 + 开关键,但正像前一网址文章说的那样, aboot 分区被wipe掉了就无法进入 fastboot 模式。

6、先看看能否调整分区吧。因为 lsusb 能看到手机设备的,而且 有一些分区挂载上去了(也就是分区文件系统被识别),所以感觉处理分区应该是可以的。用 Deepin 自带 GParted 分区软件打开,选择 sdb,发现 sdb 包含了 27 个分区!!而且 GParted 也显示了 sdb 的分区形式是 GPT 的,最开头的 sdb1 为 FAT16 分区也印证了这一点(sdb2应该是sdb1的完全镜像备份)。凭感觉、分区大小和网上的资料,我们要做的工作是减小 sdb27,扩大 sdb26 。在 GParted 下删除 sdb26 和 sdb27,新建主分区(GPT应该没有扩展分区的概念),大小5500M(比原来大约大2G),ext4文件系统,对齐无,然后再新建主分区,剩余所有空间,ext4文件系统,对齐到MB(一开始选无,似乎无法正常分区),应用等待处理完毕。

分区处理很顺利,但无法进入 fastboot  是个问题。

7、尝试文章 http://www.miui.com/thread-499894-1-1.html 上的过程:

用 sudo gedit  /etc/udev/rules.d/53-android.rules新建一个文件,在文件中输入以下内容(????是lsusb看到的手机对应设备冒号前面部分):
        SUBSYSTEM=="usb", ATTR{idVendor}=="????", ATTR{idProduct}=="0fff", MODE="0666"

sudo chmod a+rx /etc/udev/rules.d/53-android.rules
sudo service udev restart
sudo adb kill-server
sudo adb devices

(感觉上述这些工作是启动 adb 调试器所用的 daemon 守护进程,同时设定调试器对usb设备的访问权限规则的)
fastboot devices

结果没有看到任何输出,也就是 fastboot 无法找到手机,自然无法刷机的。

也考虑了文章 http://blog.csdn.net/lihaoweiv/article/details/6827184 说的fastboot是不是有问题,但正如该文章的网友评论那样,他应该是vendorID设定错误引起的。也参考了文章 http://blog.csdn.net/lincyang/article/details/12499729,重新启动了Deepin系统,但问题依旧。

睡觉。第二天继续干活。

到目前为止,还不清楚根据Windows下的处理那篇文章,对应Linux下应该如何(在 aboot 被wipe掉后)处理。

8、认真看了一下老罗的文章中关于刷机那篇(他的文章有黑客精神,只可惜我没时间来玩Android了),也看了 文章 http://www.2cto.com/Article/201401/269759.html,总感觉 Android 手机的启动流程多多少少和普通电脑有类似之处,Android手机的分区,应该和普通电脑硬盘的分区也不会有太多不同,而且,我至少是可以认到手机的(无论是Linux还是Windows 7),应该不需要文章http://www.miui.com/thread-1862267-1-1.html那样的黑砖解救法。

因为我只想赶快处理好手机去干别的活,所以采用熟悉的 Winhex 来试试,看看 刷机用镜像文件 是否就是手机分区的字节到字节映像。

9、进Windows 7 x64 下装的 Winhex (x86)(管理员权限方式),打开 物理硬盘1 (硬盘0是电脑硬盘),Winhex 成功认出 27 个分区,也能正确处理 GPT 分区(即直接定位到每个分区首地址),查看 flash_all.sh 或 flash_all.bat 脚本来了解镜像文件和分区的对应情况:

sdb1  85M msftdata + sdb2 85M  --------->  gpt_both0.bin

sbl1   dev/sdb3   512K       ---------> sbl1.mbn

sbl2   dev/sdb4   512K     ----------> sbl2.mbn

sbl3   dev/sdb5   1M       -----------> sbl3.mbn

rpm   dev/sdb6   1M        ------------>rpm.mbn

tz    即TrustZone dev/sdb7  1M  ------->tz.mbn      模块格式 elf

DDR  dev/sdb8    512K

aboot   dev/sdb9  4M       -------------> emmc_appsboot.mbn   格式为 bin,头部描述了后续代码的加载地址

misc   dev/sdb10  1M        ------------> misc.img

logo

m9kefs1               可能是modem  ------------->NON-HLOS.bin  高通标准基带

m9kefs2                可能是 modem1   ----------->同上

m9kefsc

bk1

m9kefs3

bk2

boot /dev/sdb18 + boot1  /dev/sdb19  ----------> boot.img

recovery     恢复分区/dev/sdb20,用来支持 recovery mode  ---------> recovery.img

bk3

persist   ext4   dev/sdb22

system   ext4   dev/sdb23 +  system1  ext4  dev/sdb24  --------->system.img

cache   ext4  dev/sdb25     缓存      -----------> cache.img

app所在  ext4  dev/sdb26

照片所在  ext4  dev/sdb27

用Winhex比对了 sbl1、sbl2、sbl3、rpm、tz等,发现镜像文件和分区数据是二进制字节对应的,所以,用Winhex将emmc_appsboot.mbn复制到aboot分区(/dev/sdb9)。

10、复制完后,拔掉数据线,扒掉电池确保手机断电,然后装回电池。按住 音量减,再按电源,发现手机成功进入 fastboot 模式。

11、用数据线连手机到Deepin系统,

sudo fastboot devices  查看手机是否正常连接(应该出现  XXXXXXXX    fastboot)

到刷机脚本所在目录, sudo  ./flash_all.sh  (如果flash_all.sh没有执行权限,需要先 sudo chmod a+x flash_all.sh 加上执行权限)

看到刷机开始,并出现一堆  Okay,刷完会自动将手机 reboot ——要耐心等待手机重新启动,因为刷机后第一次开机非常慢。


总结(含猜测成分):也许,我之前的操作中,不将 aboot 擦除,直接重新调整分区,然后 ./flash_all.sh,就没有那么多的麻烦。另外,刷机应该是不需要adb的,有fastboot就可以了,而且,fastboot的刷写过程,几乎就是镜像文件逐字节复制到对应分区。

对于引导,  system 应该就是操作系统(非内核)所在了,小米2s把装app的和放照片的分成了2个区的, boot 应该就是 对应 Linux /boot 了(放操作系统内核,支持 根文件系统), recovery 类似 boot,再提供一点刷写恢复 system的功能。 aboot 应该就相当于 Windows 7/8 下的bootmgr 或 Linux下的grub,没有它,无法完成内核加载任务或提供刷写功能。引导靠前的部分的功能,如 sbl1、sbl2、sbl3、rpm、tz等,可以参考 http://www.2cto.com/Article/201401/269759.html 一文,它们的功能应该相当于BIOS、mbr 和 pbr,开头2个分区相当于分区表,只是手机硬件和安全考虑较多,引导过程比较复杂。


本文内容包含了2次刷机经历,前一次是为了调整分区大小刷写开发版,后一次是将手机清除重装(给儿子用)刷写MIUI8稳定版。总体来说,刷MIUI系统,如果是彻底清空原来数据的,在Linux下线刷还是相当简单直观的,即进入fastboot模式,安装fastboot命令,执行shell脚本三步即可。

Logo

更多推荐