M110S(i9000)内置存储硬件损坏的替换外置存储修复法

今天早上跟往常一样拿起我的韩版i9000(M110S)手机来看天气,解锁之后突然发现,手机显示usb存储受损(具体的字我忘了,大概是这么个意思吧)。然后用adb shell连上手机,发现/data和/sdcard都不见了。恢复出厂设置,显示内置mmc完蛋了。看来确实是硬件over了。
 
因为在一年保修期内,所以先旺旺上找卖家“凌波通讯”询问保修的情况,这个赖皮卖家说他们不保修内置存储损坏,非要说内置存储损坏是刷机造成的软件问题。我半个月都没刷机,早上突然内置存储over了,这关刷机什么事,客服又让我打电话给他们老板,他们老板在电话里一个德行,反正就是说什么都不保修,自己看着办吧。
 
遇到这种赖皮卖家也没办法,只能自己解决了。从网上搜索,发现确实有人能解决,就是采用内置存储替换为外置存储的方法,然后加了群之后,询问了一下,群主确定可以修复。然后群主还提供收费服务,看群主的淘宝上的评价都说不错,于是我也打算试试看,不过手头没有群主说的大于4G的TF卡,所以只好上淘宝去买了,花了一上午终于拍下一个16G class10的散装三星TF卡,不过说过几天才能到货,看来近期是指望不上了。我手机也不能这几天不用了啊,手头正好有个2G的TF卡,于是打算先自己试着解决用外部卡替换内部卡的问题。如果成功就不用麻烦群主了。
 
第一步先把TF卡插入手机,然后开机分区,直接用adb shell进手机,然后su进入root,最后就可以用fdisk分区了。不过一定要保证之前刷入的ROM是带授权管理这个软件的。我刷的是:
 
[Android 2.3] 韩版M110S 2.3.4 VG14 1.2 odex-rom 汉化 0723晚 更新 原生解锁 联系人
 
这个最新版本,也就是说,其实哪个版本都可以,只是每次升级要自己做一遍下面的工作,所以我才要把这个过程记下来,不然下次肯定忘了。哈哈。分区分好之后大概是这个样子:
 
 
  1. $ su    
  2. su    
  3. # fdisk /dev/block/mmcblk1    
  4. fdisk /dev/block/mmcblk1    
  5.     
  6. The number of cylinders for this disk is set to 240128.    
  7. There is nothing wrong with that, but this is larger than 1024,    
  8. and could in certain setups cause problems with:    
  9. 1) software that runs at boot time (e.g., old versions of LILO)    
  10. 2) booting and partitioning software from other OSs    
  11.    (e.g., DOS FDISK, OS/2 FDISK)    
  12.     
  13. Command (m for help): p    
  14. p    
  15.     
  16. Disk /dev/block/mmcblk1: 1967 MB, 1967128576 bytes    
  17. 1 heads, 16 sectors/track, 240128 cylinders    
  18. Units = cylinders of 16 * 512 = 8192 bytes    
  19.     
  20.               Device Boot      Start         End      Blocks  Id System    
  21. /dev/block/mmcblk1p1               2      120064      960504   b Win95 FAT32    
  22. /dev/block/mmcblk1p2          120065      240128      960512  83 Linux    
  23.     
  24. Command (m for help):    
 
因为我的TF卡只有2G,所以两个分区各占1G左右,其中mmcblk1p1将来是挂在/sdcard上的,所以是FAT32格式,mmcblk1p2将来是挂在/data上的,以后采用ext4格式,所以这里是Linux分区。
 
如果有更大的卡,当然可以给/data分区多分一些,原来内置卡的大小是2G,我想多分给它一些也是没问题的。
分完之后,直接用mkfs.vfat对/dev/block/mmcblk1p1进行格式化,然后用mount挂载这个分区到/sdcard上,这个分区现在暂时就可以访问了。
 
要想永久挂载 /dev/block/mmcblk1p1 到 /sdcard 分区有什么办法呢?修改 /etc/vold.fstab 和 /etc/vold.conf 即可。
但这两个文件没办法直接修改,首先需要挂载/system分区为可读写分区:
 
mount -o rw,remount /dev/block/stl9 /system
 
然后进入/etc目录,把这两个文件各复制一个备份,免得后面改坏了。
 
cp /etc/vold.fstab /etc/vold.fstab.orig
cp /etc/vold.conf /etc/vold.conf.orig
 
然后再开一个控制台,用adb pull把这两个文件拉到本地进行修改,修改之后大概是这样的: 
 
vold.fstab
 
  1. ## Vold 2.0 Generic fstab  
  2. ## - San Mehat (san@android.com)  
  3. ##   
  4.  
  5. #######################  
  6. ## Regular device mount  
  7. ##  
  8. ## Format: dev_mount <label> <mount_point> <part> <sysfs_path1...>   
  9. ## label        - Label for the volume  
  10. ## mount_point  - Where the volume will be mounted  
  11. ## part         - Partition # (1 based), or 'auto' for first usable partition.  
  12. ## <sysfs_path> - List of sysfs paths to source devices  
  13. ######################  
  14.  
  15. # sdcard mount for the P1  
  16. # internal sdcard  
  17. {  
  18.     ums_path = /sys/devices/platform/usb_mass_storage/lun0/file  
  19.     asec = enable  
  20. }  
  21. dev_mount sdcard1 /mnt/sdcard/external_sd 1 /devices/platform/s3c-sdhci.0/mmc_host/mmc0  
  22.  
  23. # externel sdcard  
  24. {  
  25.     ums_path = /sys/devices/platform/usb_mass_storage/lun1/file  
  26.     discard = disable  
  27.     asec = disable  
  28. }  
  29. dev_mount sdcard /mnt/sdcard 1 /devices/platform/s3c-sdhci.2/mmc_host/mmc2  
  30.  
  31. #end line ## keep this line  
vold.conf
 
  1. ## vold configuration file for the emulator/SDK    
  2.     
  3. volume_sdcard {    
  4.     ## This is the direct uevent device path to the SD slot on the device    
  5.     emu_media_path /devices/platform/goldfish_mmc.2/mmc_host/mmc2    
  6.     
  7.     media_type     mmc    
  8.     mount_point    /sdcard    
  9.     ums_path       /devices/platform/usb_mass_storage/lun1    
  10. }    
 
改好之后,再用adb push推到手机上,因为/etc目录没办法直接推上去,先推到/sdcard下面,然后再用cp命令复制到/etc目录下即可,最后用chmod命令修正权限。
 
这些做好之后,重启一下试试,好了,你会发现重启之后,不再提示USB存储损坏的提示了,而是改成提示SD卡已损坏的提示了,这个就说明内置卡和外置卡已经交换了。
 
如果不想看到这个提示,那么就将这句:
 
  1. dev_mount sdcard1 /mnt/sdcard/external_sd 1 /devices/platform/s3c-sdhci.0/mmc_host/mmc0  
改为
 
  1. dev_mount sdcard1 /mnt/sdcard/external_sd 1 /devices/platform/s3c-sdhci.0/mmc_host/mmc1  
就可以啦。因为mmc1是不存在的,所以,这个时候系统会认为外置卡没有插入,所以也就不提示了。
 
但是不要千万不要把这句注释掉,否则安装软件时,整个系统会崩溃。
 
现在,在设置->SD卡和手机内存管理中就可以看到内部大容量存储器已经是你现在的TF卡的第一个分区了。但是手机内部存储器仍然是0。
 
这个手机内部存储器修改就比较麻烦了,因为要修改内核。修改内核,首先要先有一个linux系统,可以用虚拟机安装一个ubuntu,我很早之前装了一个,现在总算派上用场了,然后需要安装这个开发包:http://cs.sch.ac.kr/~choicjy/entry/MV6410-Samsung-Arm-linux-toolchain,安装很简单,解压之后,连同目录一起移动到/usr/local/arm目录下面就可以啦,为什么是这个目录?因为后面的工具要从这个目录中找这个开发包。
 
接下来把ROM包(就是已经刷了或者准备要刷的那个ROM)解压缩,在linux下把tar包解开,之后可以从里面找到一个zImage文件,接下来我们就要对它开刀了。
 
解包需要一个脚本程序,这个程序可以从这里下载:https://github.com/mistadman/Extract-Kernel-Initramfs。下载之后执行 unpack-initramfs zImage之后,就会在目录下生成一个 initramfs_root 的目录,里面包含了需要我们修改的文件。
 
因为我们要对/dev/block/mmcblk1p2分区格式化为ext4的分区,而这个目录下并没有mkfs.ext4,怎么办呢?不着急,下载对应版本的Tegrak版本内核,从它当中用上面同样的方法提取即可,注意不要放在用一个目录下,不然initramfs_root就被覆盖了。我用的对应的Tegrak是这个版本:http://bbs.lidroid.com/t-27194-1-1.html,用同样的方法解包之后,你会在tegrak的initramfs_root目录下看到一个tegrak目录,里面的bin目录下包含了我们需要的命令,将:
mkfs.ext4
这个命令统统复制到原始 ROM 的 initramfs_root/sbin 目录下面。
 
然后修改一下5个文件:
init.rc
fota.rc
recovery.rc
res/encryption.conftab
res/recovery.fstab
 
修改内容无非是把/data这个挂载的部分从rfs改成ext4,把crypt check=no,iocharset=cp437这些多余的挂载参数去掉。把设备从/dev/block/mmcblk0p2改成/dev/block/mmcblk1p2。
 
修改之后差不多是这样子的:
 
  1. mount ext4 /dev/block/mmcblk1p2 /data rw nosuid nodev noatime nodiratime wait barrier=1,data=ordered
其它几个设备的挂载参数中的 crypt 和 iocharset=cp437 也可以去掉。
 
然后把:
 
  1. chown root root /sbin/mkfs.ext4      
  2. chmod 750 /sbin/mkfs.ext4    
加到
 
  1. chown root root /sbin/fat.format      
  2. chmod 750 /sbin/fat.format     
这两行的后面(init.rc和recovery.rc中有这两行),上面这几行是不是必须我也不清楚,只是凭感觉认为加上保险,哈哈。
 
然后 fota.rc,res/encryption.conftab 和 res/recovery.fstab 中还有关于 /sdcard 挂载设备的,统统从 /dev/block/mmcblk0p1改成/dev/block/mmcblk1p1。
 
encryption.conftab 中的:
 
  1. /ext_sdcard /dev/block/mmcblk1 /dev/mapper/extsdcard sdcard1 vfat PROTECTED_WITH_PASSWORD 
 
这一行中的 mmcblk1 改成 mmcblk0。
 
recovery.fstab中关于/data的格式化要修改格式化选项,还要增加一个格式化命令,修改之后的文件内容如下:
 
reconvery.fstab
 
  1. [device]    
  2. # mount point   fstype          device                  format option   mount option    
  3. /efs            rfs             /dev/block/stl3         default         default    
  4. /system         rfs             /dev/block/stl9         default         default    
  5. /dbdata         rfs             /dev/block/stl10        rfs16           default    
  6. /cache          rfs             /dev/block/stl11        rfs16           default    
  7. /sdcard         vfat            /dev/block/mmcblk1p1    default         default    
  8. /data           ext4            /dev/block/mmcblk1p2    ext4            default    
  9.     
  10. [format]    
  11. #index          option    
  12. rfs16   "/sbin/fat.format -F 16 -s 1 -S 4096"    
  13. rfs32   "/sbin/fat.format -F 32 -s 4 -S 4096"    
  14. ext4    "/sbin/mkfs.ext4"    
  15.     
  16. [mount]    
  17. #index          flags                                   options    
  18. rfs_opt1        nosuid,noatime,nodev,nodiratime         "check=no"    
  19. rfs_opt2        ro,nosuid,nodev                         "check=no"    
 
现在基本上搞定,但还有点小问题,那就是 vold.fstab 和 vold.conf 是在system/etc中的,没办法直接放在内核中,那该怎么办呢?
 
也很简单,把改好的这两个文件先放到内核的 tmp 目录下,这个目录通常是空的。
 
然后打开 init.rc 文件,开始修改。
 
首先搜索:
 
  1. mount rfs /dev/block/stl9 /system check=no  
这句,这句后面有几句 copy 语句,然后是:
 
  1. exec umount  
我们就在这句之前,增加几行我们自己的 copy 语句:
 
  1. # switch external mmc & internal mmc  
  2. copy /tmp/vold.fstab /system/etc/vold.fstab  
  3. copy /tmp/vold.conf /system/etc/vold.conf  
这两行的作用就是将这两个配置文件从内核的 tmp 目录中,复制到了 /system/etc 目录中了。
 
这些都改完之后,就可以打包了。
 
打包分两步,第一步先打包initramfs.img,这一步可以用下面的脚本:
 
pack-initramfs
 
  1. #/bin/bash    
  2. cd initramfs_root    
  3. find . | cpio -H newc -o > ../initramfs.img    
  4. cd ..    
把它保存到跟原来的zImage同一级目录下,然后执行它之后就可以看到initramfs.img了。
 
接下来第二步打包,我们还要下载一个程序,该程序从这里下载:http://forum.xda-developers.com/showthread.php?t=789712
也可以从这里下载:kernel_repacker.zip
 
解压之后,进入kernel_repacker目录,运行
 
 ./editor.sh ../zImage ../initramfs.img
 
 然后就可以得到一个 new_zImage 了。
 
然后将它改名为 zImage,再打包成 tar 格式,例如:
 
tar cvf ExtSD-Kernel-for-M110S-2.3.4-VG14.tar zImage
 
然后,就可以刷机了。刷机之后,执行wipe,虽然仍然提示你内置mmc完蛋了,但是/data分区可以格式化了。再然后你的手机就起死回生了。如果你的手机卡比较慢,wipe之后第一次重启可能会非常非常慢,一定要有耐心,不要心急拔电池,等到手机发出一个轻微震动的时候,那就离进入系统不远了。
 
进入系统之后,/sdcard 和 /data 分区都有了,以后TF卡坏了,或者想换卡了,直接从电脑上分好区,格式化好,替换一下TF卡就可以升级你的手机容量了,比内置TF卡没坏的时候还要爽。哈哈。

标签: android, m110s, i9000, 存储损坏, 修复

« 上一篇 | 下一篇 »

只显示10条记录相关文章

22 条回复至 "M110S(i9000)内置存储硬件损坏的替换外置存储修复法" 的评论

Hi, thanks for the information.  I too have a corrupted internal sd card.


I followed your instructions, however I am stuck at

./editor.sh ../zImage ../initramfs.img

I got the following error:

##### My name is ./editor.sh #####
##### The kernel is ../../zImage #####
##### The ramdisk is ../../I9000M.JVP/updates/initramfs.img #####
##### 01.  Extracting kernel  from ../../zImage (start = 18324)

gzip: stdin: decompression OK, trailing garbage ignored
7034672+0 records in
7034672+0 records out
7034672 bytes (7.0 MB) copied, 32.3349 s, 218 kB/s
##### ERROR : Couldn\'t match start/end of the initramfs .


This is the kernel I am using:

http://derek.theblog.ca/galaxys-i9000m-gingerbread-upgrade

direct link:

Here are the features:

    * Based on the latest Android 2.3.4 (XXJVP)
    * Latest CF-Root kernel (3.7), with ext4 (lagfix) support
    * Includes the latest Bell modem driver (KC1), so it’s fully compatible with the Canadian networks like Bell/Virgin/Rogers/Fido/Telus (1900/850 3G bands)
    * Visuals from the stock Android OS – AOSP lock screen, overscroll glow, CRT off animation and Gingerbread theme (credit to ock)
    * Extended power menu for easy reboots
    * NEW! GPS fix for faster lock times, better accuracy (credit to RJLM)


Can you please help me to resolve the error?
thanks

由 youke1 于 2011-07-27 03:26:08 提交#21

从lidroid过来看的,支持!!!

由 youke 于 2011-07-25 11:19:49 提交#22

Records:2212

发表评论

评论 (必须):