junglegq 发表于 2014-02-12 16:34

Android智能手机交换用户分区和存储分区的方法(适用于用户分区较小的手机)

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=t&rct=j&q=&esrc=s&source=web&cd=4&ved=0CEIQFjAD&url=http%3A%2F%2Fwww.micron.com%2F~%2Fmedia%2FDocuments%2FProducts%2FSoftware%2520Article%2FSWNL_hardware_vs_software_partitions.pdf&ei=S9P5UrS2DsWergHuvIHIBw&usg=AFQjCNHMKwMuy7uZcRmu2jpUUqImNuOj2g&sig2=a5yHwQySphjE54IXoDIr2g
        简言之,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分区,我的手机看不到。

junglegq 发表于 2014-02-12 16:35

自己顶一把。这两天玩的成果。
页: [1]
查看完整版本: Android智能手机交换用户分区和存储分区的方法(适用于用户分区较小的手机)