挂载system.img并提取文件
今天提取线刷包的system.img出来,使用Mount命令挂载
$ sudo mount -t ext4 -o loop system.img /mnt mount: 文件系统类型错误、选项错误、/dev/loop0 上有坏超级块、 缺少代码页或助手程序,或其他错误 有些情况下在 syslog 中可以找到一些有用信息- 请尝试 dmesg | tail 这样的命令看看。
这坑爹死了。。于是想了个办法把ext4转为yaffs2格式,使用simg2img.py,脚本在博文最下面
$ ./simg2img.py system.img
等待转换完成,当前目录下就会出现一个tmp.img,然后我们就可以挂载了!
$ mkdir tmp $ sudo mount tmp.img tmp
我需要提取system.img里面文件,所以复制一份出来,然后卸载tmp.img的挂载
$ sudo cp -r tmp system $ sudo umount tmp
最后递归修改提取出来的文件用户就可以了!
$ sudo chown -R michellgaby system
这样就大功告成了!!下面是ext4转换为yaffs2的脚本
#!/usr/bin/env python #encoding:utf8 #=============================================================================== # # FILE: simg2img.py # # USAGE: ./simg2img.py system.img # # DESCRIPTION: # # AUTHOR: Karl Zheng # COMPANY: Meizu # CREATED: 2011年10月18日 15时25分15秒 CST # REVISION: --- #=============================================================================== import sys import struct class ext4_file_header: def __init__(self, buf): self.magic, \ self.major, \ self.minor, \ self.file_header_size, \ self.chunk_header_size, \ self.block_size, \ self.total_blocks, \ self.total_chunks, \ self.crc32, \ = struct.unpack('<IHHHHIIII', buf) class ext4_chunk_header: def __init__(self, buf): self.type,\ self.reserved,\ self.chunk_size,\ self.total_size,\ = struct.unpack('<HHII', buf) if len(sys.argv) > 1: filename = sys.argv[1] else: print "No file is designated!!" sys.exit(1) ifd = open(filename, "rb") buf="" # get filelen ifd.seek(0, 2) file_len = ifd.tell() print file_len ifd.seek(0, 0) buf = ifd.read(28) #print repr(buf) file_header = ext4_file_header(buf) EXT4_FILE_HEADER_MAGIC = 0xED26FF3A EXT4_CHUNK_HEADER_SIZE = 12 if file_header.magic != EXT4_FILE_HEADER_MAGIC: print "Not a compressed ext4 file!!" sys.exit(1) print "file_header chunks:%X"%(file_header.total_chunks) total_chunks = file_header.total_chunks print("total chunk = %d "%(total_chunks)) ofd = open("tmp.img", "wb") sector_base = 82528 output_len = 0 while total_chunks > 0: buf = ifd.read(EXT4_CHUNK_HEADER_SIZE) chunk_header = ext4_chunk_header(buf) sector_size = (chunk_header.chunk_size * file_header.block_size) >> 9; #print "ct:%X, cs:%X, ts:%X, ss:%X"%(chunk_header.type, chunk_header.chunk_size, chunk_header.total_size, sector_size) data = "" if chunk_header.type == 0xCAC1: # raw type data = ifd.read(chunk_header.total_size - EXT4_CHUNK_HEADER_SIZE) if len(data) != (sector_size << 9): print("len data:%d, sector_size:%d"%(len(data), (sector_size << 9))) sys.exit(1) else: print ("len data:%d, sector_size:%d"%(len(data), sector_size << 9)) ofd.write(data) output_len += len(data) print("raw_chunk ") print("write raw data in %d size %d \n"%(sector_base, sector_size)) print("output len:%x"%(output_len)) sector_base += sector_size else: if chunk_header.type == 0xCAC2: # TYPE_FILL data = '\0' * (sector_size << 9); ofd.write(data) output_len += len(data) print("fill_chunk \n") print("chunk_size:%x"%(chunk_header.chunk_size)) print("output len:%x"%(output_len)) sector_base += sector_size else: if chunk_header.type == 0xCAC3: # TYPE_DONT_CARE print "none chunk at chunk:%d"%(file_header.total_chunks - total_chunks) print("data_size:0x%x, chunk_size:%d, block_size:%d"%(sector_size << 9, chunk_header.chunk_size, file_header.block_size)) data = '\0' * (sector_size << 9); ofd.write(data) output_len += len(data) sector_base += sector_size else: data = '\0' * (sector_size << 9); ofd.write(data) print "unknown type!!" output_len += len(data) print("output len:%x"%(output_len)) sector_base += sector_size total_chunks -= 1 print("remain chunks = %d "%(total_chunks)); print "write done" ifd.close() ofd.close()