从Linux Deepin下小米2s刷机的“生”与“死”看Android手机的分区
昨天我的小米2S(16G)刷成砖头了,今天终于救回来了,当然,还留下一些疑问等待来日慢慢研究。先说怎么把它刷成砖头的。因为我刷机的动机是为了把装软件的分区增大,放照片等数据的分区减小(不严谨的可以称为“重新分区”),所以我主要参考了http://bbs.xiaomi.cn/thread/index/tid/10209776上的文章。但他是基于Windows搞的,而我想尝试下直接Linux下
昨天我的小米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脚本三步即可。
更多推荐
所有评论(0)