- 论坛徽章:
- 0
|
Android智能手机交换用户分区和存储分区的方法(适用于用户分区较小的手机)
本文档只谈思路,不含实际可操作软件
操作需谨慎,后果自负
***** 手机必须先root *****
测试手机:联想s899t
RAM:1G
ROM: 4G
实际使用过程中发现,默认的用户分区(/data)只有435MB,严重阻碍了应用软件的安装(因为有些软件必须装在用户分区)
而,默认的存储分区(/sdcard, or /mnt/sdcard)有>2GB空间可用,大部分闲置。思路是交换两者以获得足够的用户分区,而较小的存储分区完全不用担心(可以外插sd卡)。
**********************************************
****************** 实战 **********************
**********************************************
有3个地方需要修改:
boot.img
/init.rc
recovery.img
/init.rc
system 分区内
/etc/vold.fstab
boot.img & recovery.img 可以从官方ROM中解压缩提取出来,可以把二者视为两个独立的小系统,互不关联。一个好处是,一个系统损坏了,可以通过另一个系统修复。
正常情况下,boot.img & recovery.img 被直接复制到手机的ROM中的2个“软件分区”(software partition).
(software partition 和 hardware partition 区别可参考
https://www.google.co.jp/url?sa= ... HwQySphjE54IXoDIr2g
简言之,hw partition 是由eMMC 厂商写在硬件寄存器上的。一般不改。sw partition 是OS能识别的分区。在一个hw partition 中,可以划分多个sw partition.)
修改时候,需要涉及4个分区,我的手机上默认情况是:
p5 /data
p7 /boot
p8 /recovery
p11 /sdcard
具体识别方法先略过,看操作先:
下一步,解开boot.img,修改/init.rc文件,重新打包boot.img,然后覆盖原分区
1. 解包:可用软件bootimg_tools.zip from http://forum.xda-developers.com/showthread.php?t=2319018
2. 修改/init.rc
搜索行:mount ext4 /dev/block/mmcblk0p5 /data nosuid nodev nodelalloc,noauto_da_alloc #存储boot.img的分区是mmcblk0p5 (不同机器p#不同,识别方法见后文)
修改mmcblk0p5 到 mmcblk0p11 (后者是我的原/sdcard的分区,识别方法见后文)
3. 重新打包,工具在bootimg_tools.zip
4. 覆盖原分区
先上传boot.img 到 /sdcard 目录
adb shell su - "dd if=/sdcard/boot.img of=/dev/block/mmcblk0p7" (同样,不同的机器mmcblk0p# 有不同的#,见后文识别这些分区)
完全相同的上述4个步骤应用于recovery.img,同样烧录到包含recovery的分区中。
最后步骤,修改当前系统的/system 分区中/etc/vold.fstab,可以找个app:“root explorer” 修改前,先设置/system 为"mount rw",改好后设回”mount ro".
原文件中,行
dev_mount sdcard /mnt/sdcard/external_sd 5 /devices/sdi4/mmc_host/mmc0/mmc0:0001/block/mmcblk0
修改为
dev_mount sdcard /mnt/sdcard/external_sd 11 /devices/sdi4/mmc_host/mmc0/mmc0:0001/block/mmcblk0
好了,重启系统到recovery 模式,格式化/data分区,完成后正常重启。
在新系统中,进入“设置”-》“存储”,格式化你的存储分区。一切就安静了。
*******************************************************
************************ 备注 *************************
*******************************************************
识别分区方法:(很重要)
/data
执行
adb shell
$su -
#mount |grep -w '/data'
/dev/block/mmcblk0p5 /data ext4 rw,...
找到p5是我的/data分区
/sdcard
用上述方法执行
#mount |grep -w '/mnt/sdcard'
/dev/block/vold/179:11 /mnt/sdcard vfat rw,...
不用介意179, 11就表示p11分区
/boot,/recovery
因为只存boot.img 和 recovery.img,所以相对较小,一般不超过16MB。
但是,默认这两个分区用户看不到,所以需要直接搜系统文件(小复杂)。
进/sys/block,有两个目录
mmcblk0 手机存储
mmcblk1 外置sd卡
进mmcblk0,有一堆目录,类似于
mmcblk0boot0
mmcblk0boot1
mmcblk0p1
mmcblk0p10
mmcblk0p11
mmcblk0p2
mmcblk0p3
mmcblk0p4
mmcblk0p5
mmcblk0p6
mmcblk0p7
mmcblk0p8
mmcblk0p9
mmcblk0boot0,mmcblk0boot1不知道干啥用,估计和手机信号模块什么的有关,ignore
mmcblk0p#就是我们要找的分区。检查每个分区的大小,一个笨办法是
#cat mmcblk0p7/size
32768
数值以512B为单位,所以32768 大概是16MB。(这是我的/boot分区,原因见下文)
扫描过每个分区size后发现有2个分区是16MB,其他的低于4MB和大于16MB的都可忽略,这是因为/boot,/recovery 分区不需要大空间存储。
直接将两个分区内容复制下来
adb shell su - "dd if=/dev/block/mmcblk0p7 of=/sdcard/p7.img"
adb shell su - "dd if=/dev/block/mmcblk0p8 of=/sdcard/p8.img"
p7.img p8.img 就是boot.img 和 recovery.img,然后按照上面的方法解包,两者区别是,recovery 分区中有/res 目录。所以在我的手机上p8.img是recovery.img,相应的,mmcblk0p8是我的recovery分区。mmcblk0p7是boot分区
注意,网上有些说明可以通过查看/proc/mtd找到boot recovery分区,我的手机看不到。 |
|