您的位置:首页 > 运维架构 > Linux

从Linux Deepin下小米2s刷机的“生”与“死”看Android手机的分区

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

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

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

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

2、不需要考虑数字签名问题,Deepin下也没有杀毒软件,也不需要额外给手机装驱动(一句话,这些比Windows爽多了)。当然软件还是需要的,但我不是做Android开发,所以没选择安装Android SDK,直接从深度商店安装了 android-tools-adb 和 android-tools-fastboot 。另外,从小米网站下载了小米手机2/2S
开发版 5.7.16 线刷包

3、手机关机。音量加 + 开关键 -->进 Recovery 模式,清除所有,所谓三清,估计就是清除cache分区,装app的分区和放照片的数据分区。

4、手机关机。音量减 + 开关键 -->进 Fastboot 模式,用数据线将手机连到电脑Deepin系统。

lsusb 查看USB设备是否读取到手机(Qualcomm字样)

fastboot erase aboot 清除 Fastboot 模式 (如果权限不够,前面加 sudo)

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

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

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

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

看到刷机开始,并出现一堆 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个分区相当于分区表,只是手机硬件和安全考虑较多,引导过程比较复杂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: