免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3679 | 回复: 3
打印 上一主题 下一主题

【转】技术贴,android文件系统的剖析!!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-01 13:41 |只看该作者 |倒序浏览
转载自:http://hi.baidu.com/androidhacke ... 7685fc39012fba.html
转载请注明出处


手机文件系统分为不同的部分,可能如下,不同的系统顺序不同,

#cat /proc/mtd
dev:
size
erasesize
name
mtd0: 00040000 00020000 "misc"
mtd1: 00500000 00020000 "recovery"
mtd2: 00280000 00020000 "boot"
mtd3: 04380000 00020000 "system"
mtd4: 04380000 00020000 "cache"
mtd5: 04ac0000 00020000 "userdata"
我们主要涉及recovery和boot,在我们操作之前最好是备份他俩。

# cat /dev/mtd/mtd1 > /sdcard/mtd1.img# cat /dev/mtd/mtd2 > /sdcard/mtd2.img

System存放/中挂载的所有文件,userdata中存放data目录中的数据,主要是你安装的apps及其文件。

我们最好把自己喜欢的update.zip发在sdcard的root目录中,以在弄乱boot分区后可以恢复。

有另外一个重要的文件
/system/recovery.img,他是mtd1的完全拷贝。每次关机他都会重新刷写mtd1一次,这代表你对recovery即/dev/mtd/mtd1的修改再重启后都无效。如果要改变mtd1,最好是插入image在
/system/recovery.img中,如果你升级系统没有替换
/system/recovery.img会很惨的。

Boot和recovery不是正常的文件系统,是android自定的格式,有一个2k的头,接着是gzipped的kernel和ramdisk,一个可选的second stage loader(少见)。定义在mkbootimg.h中。

+-----------------+

| boot header
| 1 page

+-----------------+

| kernel
| n pages


+-----------------+

| ramdisk
| m pages

+-----------------+

| second stage
| o pages

+-----------------+


n = (kernel_size + page_size - 1) / page_size

m = (ramdisk_size + page_size - 1) / page_size

o = (second_size + page_size - 1) / page_size




0. all entities are page_size aligned in flash

1. kernel and ramdisk are required (size != 0)

2. second is optional (second_size == 0 -> no second)


Ramdisk是一个小型文件系统包含用来初始化系统的核心文件,它包含关键的初始化进程,比如init.rc(可以设定系统范围的属性),下面是ramdisk中的一系列的文件。关于ramdisk的文档如下地址

./init.trout.rc
./default.prop
./proc
./dev
./init.rc
./init
./sys
./init.goldfish.rc
./sbin
./sbin/adbd
./system
./data
Recovery image还有额外的文件,包含recovery二进制程序及其支持文件(在home+power按下重启时运行),文件如下

./res
./res/images
./res/images/progress_bar_empty_left_round.bmp
./res/images/icon_firmware_install.bmp
./res/images/indeterminate3.bmp
./res/images/progress_bar_fill.bmp
./res/images/progress_bar_left_round.bmp
./res/images/icon_error.bmp
./res/images/indeterminate1.bmp
./res/images/progress_bar_empty_right_round.bmp
./res/images/icon_firmware_error.bmp
./res/images/progress_bar_right_round.bmp
./res/images/indeterminate4.bmp
./res/images/indeterminate5.bmp
./res/images/indeterminate6.bmp
./res/images/progress_bar_empty.bmp
./res/images/indeterminate2.bmp
./res/images/icon_unpacking.bmp
./res/images/icon_installing.bmp
./sbin/recovery
解压编辑和压缩镜像

镜像中有一串00接着1F 8B,0之前为kernel,1F 8B之后为ramdisk,我们可以编辑ramdisk,不过得先un gizp它,再un cpio它。我们可以用如下命令:

gunzip -c ../your-ramdisk-file | cpio -i之后在工作目录中会有所有的ramdisk的文件,我们可以编辑它。



为了重新创建ramdisk,我们的gzip和re cpio它,所有工作目录中的文件都将被加入ramdisk中。

find . | cpio -o -H newc | gzip > ../newramdisk.cpio.gz

最后我们可以组合内核,使用mkbootimg程序,命令如下

mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel your-kernel-file --ramdisk newramdisk.cpio.gz -o mynewimage.img

把image刷写到手机上:

如果有新的recoveryimage,直接插入手机中,重启。如果是boot,得使用adb如下。

adb push ./mynewimage.img /sdcard

得到root权限。使用如下两条命令:



# cat /dev/zero > /dev/mtd/mtd2
write: No space left on device [this is ok, you can ignore]# flash_image boot /sdcard/mynewimage.imgReboot
如果有错误,使用update.zip重新升级。

论坛徽章:
0
2 [报告]
发表于 2011-04-09 03:43 |只看该作者
谢谢了

太有启发了

论坛徽章:
0
3 [报告]
发表于 2011-04-28 12:05 |只看该作者
mkbootimg --cmdline 'no_console_suspend=1 console=null' --kernel your-kernel-file --ramdisk newramdisk.cpio.gz -o mynewimage.img

这里的--cmdline 'no_console_suspend=1 console=null' 怎么理解呀?

论坛徽章:
0
4 [报告]
发表于 2011-04-28 20:41 |只看该作者
恩,好东西,学习下
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP