Android system.img掛載和解除掛載
解包后的super.img,里面最重要的是system.img文件,如何對system.img進行掛載和解除掛載是需要掌握的能力
基礎知識
system.img、vendor.img 都存在兩種格式raw,sparse ,在ubuntu命令窗口下執行下執行:file system.img可以查看文件的信息。
-
一種是raw ext4 image,即經常說的raw image。
使用file觀察它: 其特點是完整的ext4分區鏡像(包含很多全零的無效填充區),可以直接使用mount進行掛載,因此比較大(一般1G左右)。file 查看
$ file system.img
system.img:Linux rev 1.0 ext4 filesystem data, UUID=da594c53-9beb-f85c-85c5-cedf76546f7a, volume name "system" (extents) (large files)
-
另一種是sparse ext4 image,即經常說的simg
就是說是一個非常普通的dat文件。由于它將raw ext4進行稀疏描述,因此尺寸比較小(沒有全零的無效填充區,一般在300到500M之間)。file查看:
$ file system.img
system.img: Android sparse image, version: 1.0, Total of 393216 4096-byte output blocks in 40 input chunks.
Android本身提供了源代碼工具在兩者之間轉換,源代碼位于:
system/core/libsparse/simg2img.c // 將sparse image轉換為raw image;system/core/libsparse/img2simg.c // 將raw image轉換為sparse image;
system.img解包
對于ext4格式的system.img文件,可以通過格式轉換,然后使用mount命令掛載到ubunut系統下文件夾下,達到解包,觀察system.img里面內容的目的。
//解包
$ sudo simg2img system.img system.img.ext4
//創建一個目錄
$ sudo mkdir system
//將解包的ext4文件掛載到system
$ sudo mount -o loop system.img.ext4 system
接下來就可以 cd 到system中觀察或者修改鏡像中得內容了!!!
如果img文件是ext2格式,mount的時候會出錯,但可以嘗試以下命令
$ sudo mount -o ro,loop system.img system //不過這種是只讀掛載,不能修改
file查看system.img
file system_a.img
system_a.img: Linux rev 1.0 ext2 filesystem data, UUID=4395823e-b539-5d50-84e9-e0b2d0ff116a (extents) (large files) (huge files)
system.img 打包
以下方法任選一種即可
方法1 :
sudo ./make_ext4fs -l 1456M -s -a system systest.img system
如果執行報錯“error: ext4_allocate_best_fit_partial: failed to allocate 2260 blocks, out ...” ,請將上述-l 后面的大小調大點(但不要太大,否則可能要修改 刷機配置,如mtk的 scatter.txt文件!)
1456M也可以通過原先的 file system.img計算得出來的鏡像systest.img 就是修改過的,可以重命名為system.img,如果 設備沒有安全啟動 那么就能啟動成功!
方法2:
$ sudo umount system$ sudo img2simg system.img.ext4 systest.img
方法2也適用于 userdata.img 的修改!