高通平台编译时将镜像拆分sparse

此博客内容涉及Android系统的配置更新,主要变更包括将`persist`分区从非稀疏格式转换为稀疏格式,以及详细列出各分区如`devinfo`、`system`、`cache`和`persist`的大小、起始位置和sparse属性等信息。这些更改可能影响设备的存储管理和性能。
diff --git a/vendor/qcom/proprietary/tools/ext4_sparse/rawprogram0.xml b/vendor/qcom/proprietary/tools/ext4_sparse/rawprogram0.xml
index 3737515..58f783a 100644
--- a/vendor/qcom/proprietary/tools/ext4_sparse/rawprogram0.xml
+++ b/vendor/qcom/proprietary/tools/ext4_sparse/rawprogram0.xml
@@ -27,7 +27,7 @@
   <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="" label="devinfo" num_partition_sectors="2048" physical_partition_number="0" size_in_KB="1024.0" sparse="true" start_byte_hex="0x20200000" start_sector="1052672"/>
   <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="system.img" label="system" num_partition_sectors="6291456" physical_partition_number="0" size_in_KB="3145728.0" sparse="true" start_byte_hex="0x20300000" start_sector="1054720"/>
   <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="cache.img" label="cache" num_partition_sectors="524288" physical_partition_number="0" size_in_KB="262144.0" sparse="true" start_byte_hex="0xe4000000" start_sector="7471104"/>
-  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="" label="persist" num_partition_sectors="2097152" physical_partition_number="0" size_in_KB="1048576.0" sparse="false" start_byte_hex="0xf4000000" start_sector="7995392"/>
+  <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="persist.img" label="persist" num_partition_sectors="2097152" physical_partition_number="0" size_in_KB="1048576.0" sparse="true" start_byte_hex="0xf4000000" start_sector="7995392"/>
   <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="" label="misc" num_partition_sectors="2048" physical_partition_number="0" size_in_KB="1024.0" sparse="false" start_byte_hex="0x134100000" start_sector="10094592"/>
   <program SECTOR_SIZE_IN_BYTES="512" file_sector_offset="0" filename="" label="keystore" num_partition_sectors="1024" physical_partition_number="0" size_in_KB="512.0" sparse="false" start_byte_hex="0x134200000" start_sector="10096640"/>

 

<think>好的,用户现在想了解如何将原始磁盘镜像(rawdiskimage)转换为稀疏镜像sparseimage),并掌握在稀疏存储中识别已分配数据块的方法,同时忽略未使用的空白区域。我需要结合之前的回答和用户提供的引用内容来构建解决方案。 首先,转换格式方面,用户可能需要知道不同工具的使用方法,比如Linux下的qemu-img和fallocate,以及Windows和macOS的相关工具。之前回答中提到过dd命令的conv=sparse参数,这可能适用于raw格式的转换。同时,用户提供的引用[3]中提到复制内核镜像到/boot目录,这可能和文件系统操作有关,但这里主要关注镜像转换。然后,关于识别已分配数据块,之前已经详细分类了镜像格式解析法、文件系统查询法和编程接口法。需要确保这些方法适用于转换后的稀疏镜像。例如,使用qemu-imgmap命令来查看qcow2格式的分配状态,或者使用filefrag工具检查ext4文件系统的块分配情况。引用[1]提到ext4对数据局部性的优化,这可能影响稀疏镜像的块分配策略,但用户的问题更多是技术实现,所以需要具体操作步骤。用户可能还关心转换后的稀疏镜像如何验证是否正确,比如物理大小是否减小,空白区域是否被正确忽略。引用[3]中的问题涉及内核镜像的处理,但这里可能需要引导用户使用du命令比较逻辑和物理大小,如之前提到的du --apparent-size和普通du的区别。 另外,需要考虑不同文件系统对稀疏文件的支持差异,如引用[1]比较了ext4和ext3的不同,这可能影响转换后的稀疏镜像在不同环境中的表现。但用户的问题主要是转换和识别,所以可能需要在回答中提到跨平台工具的注意事项,比如Windows的fsutil和macOS的hdiutil。最后,生成相关问题时要围绕转换方法和数据块识别,比如不同工具的优缺点、性能影响,或者如何设计自定义稀疏格式。需要确保问题有针对性,帮助用户深入理解。</think>### Raw镜像Sparse镜像的完整方案 #### 一、转换方法分类 1. **文件系统级稀疏化**(适用于现有raw文件) ```bash # 通过fallocate释放空白区域(仅限支持稀疏文件的文件系统) fallocate -d input.raw ``` - 原理:利用文件系统的`hole punching`技术释放连续零块的物理存储[^1] - 数学表达:设文件总大小为$S$,已分配块占比为$\alpha$,转换后物理存储量: $$ S_{phys} = \alpha \times S $$ 2. **格式转换法**(生成新的稀疏格式) ```bash # 转换为qcow2格式(QEMU工具链) qemu-img convert -f raw -O qcow2 -o sparse_size=4M input.raw output.qcow2 # 转换为sparse image格式(dd工具) dd if=input.raw of=output.sparse bs=4K conv=sparse ``` - 参数解析: - `sparse_size=4M`:设置元数据粒度,影响空间利用率与查询速度的平衡[^1] - `conv=sparse`:自动检测并跳过全零块写入 3. **编程实现法**(自定义转换逻辑) ```python def raw_to_sparse(raw_path, sparse_path): with open(raw_path, 'rb') as f_in, open(sparse_path, 'wb') as f_out: block_size = 4096 zero_block = b'\x00' * block_size while True: data = f_in.read(block_size) if not data: break if data == zero_block: f_out.seek(block_size, os.SEEK_CUR) # 创建文件空洞 else: f_out.write(data) ``` - 核心逻辑:逐块检测零值区域,使用文件寻址跳过而非实际写入[^1] #### 二、已分配数据块检测技术 1. **qcow2格式解析** ```bash # 使用qemu-img查看块分配状态 qemu-img map --output=json output.qcow2 | jq '.data[] | select(.status == "allocated")' ``` - 输出示例: ```json { "start": 0, "length": 1048576, "depth": 0, "status": "allocated" } ``` - 数学描述:设镜像总逻辑块数为$N$,已分配块集合为: $$ A = \{ b_i | b_i \in [0,N), \text{allocated}(b_i) = \text{True} \} $$ 2. **raw稀疏文件检测** ```bash # 使用filefrag查看物理块分布 filefrag -v output.sparse | awk '/extent/{print $2,$4}' ``` - 输出示例: ``` 0-1023 266240-267263 2048-3071 268288-269311 ``` - 解析规则:逻辑块范围与物理块范围的映射关系满足: $$ \forall l \in [L_{start}, L_{end}], \exists p \in [P_{start}, P_{end}] $$ 3. **编程接口检测** ```c // 使用lseek检测文件空洞(Linux) off_t find_next_hole(int fd, off_t offset) { return lseek(fd, offset, SEEK_HOLE); } off_t find_next_data(int fd, off_t offset) { return lseek(fd, offset, SEEK_DATA); } ``` - 工作原理:通过`SEEK_DATA`和`SEEK_HOLE`标志定位数据块边界[^1] #### 三、性能优化对比 | 方法 | 时间复杂度 | 空间开销 | 检测精度 | |--------------|------------|----------|----------| | 文件系统查询 | $O(1)$ | 0 | 簇级粒度 | | 镜像格式解析 | $O(n)$ | 元数据量 | 字节级 | | 编程逐块扫描 | $O(n)$ | 0 | 块级粒度 | 其中$n$为镜像总块数,块大小通常为4KB-64MB[^1] #### 四、关键验证步骤 1. **完整性校验** ```bash # 对比原始文件与稀疏文件的内容差异 cmp -l input.raw output.sparse | grep -v '^0' ``` - 预期结果:仅显示空白区域差异 2. **空间利用率分析** ```bash # 查看物理/逻辑大小比 ls -lhs output.sparse ``` - 示例输出: ``` 1.2G -rw-r--r-- 1 user group 10G Jun 1 12:00 output.sparse ``` 表示物理占用1.2GB,逻辑大小10GB #### 五、跨平台实现差异 | 平台 | 转换工具 | 检测方法 | |---------|-------------------|----------------------------| | Linux | `fallocate` | `filefrag`/`FIEMAP` | | Windows | `fsutil` | `FSCTL_QUERY_ALLOCATED_RANGES` | | macOS | `hdiutil` | `APFS`稀疏文件元数据 | --- ### 对比总结 | 转换方式 | 转换速度 | 空间节省率 | 适用场景 | |--------------|----------|------------|------------------------| | 文件系统级 | 快 | 依赖原始文件碎片率 | 就地转换 | | 格式转换 | 中 | 高 | 跨平台迁移 | | 编程实现 | 慢 | 可控 | 定制化需求 | ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值