手动挂载apex镜像

news2025/1/19 14:36:04

手动挂载apex镜像

1.loop设备

在类 UNIX 系统里,loop 设备是一种伪设备(pseudo-device),或者也可以说是仿真设备。它能使我们像块设备一样访问一个文件。

这要先从mount的流程来理解,挂载操作,实际上就是把设备上的文件系统/目录文件连接到指定的目录(directory)下,在操作系统层面就是把挂载设备和挂载目录的对应关系加到内核中的Vfsmount里的对应表单里(内核启动后会从硬盘上加载到内存里),这样我们就可以通过访问目录路径来访问设备上的数据了。

loop mount是另一种mount方式,如果说普通mount解决了实际硬件存储设备的挂载,bind mount解决了目录到目录的挂载,那么loop mount则解决了将档案文件到目录的挂载

档案,英文Archive,与文件(file)不同,是一个打包好的文件集,里面一般包含许多文件, 比如 tar,jar,iso ,img就是常见的档案格式

那又是怎么实现将档案文件挂载到目录下呢?

实际上,系统先把档案文件(比如某个.iso文件)映射到loop设备上
#losetup  /dev/loop0   xxxx.iso        使系统误认为xxxx.iso为存储设备/dev/loop0

再欺骗mount命令,使他认为  /dev/loop0真的是个设备在运行,挂载到指定目录
#mount   -t   xxxx.iso   /dev/loop0    /loop设备路径    

但前提是,被访问的loop设备里的档案文件具有linux识别的文件系统,像tar, jar, zip 这样的档案,只是一种压缩格式,本身不是文件系统,即使通过loop mount挂载上去了,直接访问他也读不出什么数据,这很好理解,就像在windows下不装任何解压软件,就无法打开压缩文件一样。所有一般我们都是拿img、iso映射到loop设备。

2.apex包结构

APEX文件格式如下

从顶层看,APEX文件是一个Zip文件,其中的文件均是未压缩的。

其中的四个文件有apex_manifest.jsonAndroidManifest.xmlapex_pubkeyapex_payload.img

  • apex_manifest.json文件包括package name和版本,用来标识该APEX文件

  • AndroidManifest.xml可以允许APEX文件使用一些apk的工具,像adb、package manager、 app install app等。举个例子APEX文件可以使用aapt检查文件的metadata。该文件还包括packcage name和版本号,这些内容通常也会再apex_manifest.json文件中。

  • apex_payload.img是依赖dm-verity的EXT4文件系统镜像。该镜像在运行时通过一个回环设备加载。具体地说,metadata和hash tree是通过libavb创建的。apex_payload.img还没有被解析,因为要求该文件是可挂载的。一些常规文件包含在该镜像中。

  • apex_pubkey是用来给文件系统签名的公钥。该公钥确保下载的apex文件是以编译阶段相同的方式签名。

3.开始实验

  1. 将apex解压缩,上传到Linux中

其实apex包就是个压缩包,将后缀名改成.zip,自行使用Windows解压工具进行解压

上传后我们可以看下它的文件结构和它的文件系统属性

amx@amxxxx:~/Android/system$ file apex_payload.img 
apex_payload.img: Linux rev 1.0 ext2 filesystem data, UUID=7d1522e1-9dfa-5edb-a43e-98e3a4d20250 (extents) (large files) (huge files)

amx@amxxxx:~/Android/system$ tune2fs -l apex_payload.img 
tune2fs 1.44.5 (15-Dec-2018)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          7d1522e1-9dfa-5edb-a43e-98e3a4d20250
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      ext_attr dir_index filetype extent sparse_super large_file huge_file uninit_bg dir_nlink extra_isize shared_blocks
Filesystem flags:         signed_directory_hash 
Default mount options:    user_xattr acl
Filesystem state:         clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              32
Block count:              8213
Reserved block count:     0
Free blocks:              8
Free inodes:              5
First block:              0
Block size:               4096
Fragment size:            4096
Blocks per group:         32768
Fragments per group:      32768
Inodes per group:         32
Inode blocks per group:   2
Filesystem created:       Thu Jan  1 08:00:01 1970
Last mount time:          n/a
Last write time:          Thu Jan  1 08:00:01 1970
Mount count:              0
Maximum mount count:      -1
Last checked:             Thu Jan  1 08:00:01 1970
Check interval:           0 (<none>)
Lifetime writes:          32 MB
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:               256
Required extra isize:     32
Desired extra isize:      32
Default directory hash:   half_md4
Directory Hash Seed:      7d1522e1-9dfa-5edb-a43e-98e3a4d20250
  1. 查看当前空闲的loop设备
amx@amxxxx:~/Android/system$ sudo losetup -f
/dev/loop0

可以看到当前空闲的loop设备为/dev/loop0,所以我们打算将apex与/dev/loop0进行关联

  1. 将apex镜像与loop设备关联
amx@amxxxx:~/Android/system$ sudo losetup /dev/loop0 apex_payload.img
  1. 将loop设备挂载到目标节点上
amx@amxxxx:~/Android/system$ sudo mount -o ro /dev/loop0 /home/amx/Android/apex/com.android.i18n

这里我模仿了安卓将它挂载到了/home/amx/Android/apex/com.android.i18n

这里只能使用ro只读形式挂载,因为apex_playload.img采用了ext4文件系统,且在文件系统中添加了shared_block属性,该属性不允许随意修改镜像文件,也是为了将镜像文件尽量压缩到最小(从名字就可以看出来共享块)。这里可以通过改变inode结构改变这个属性,但是有点难度,需要了解ext文件系统才行。

  1. 查看是否挂载成功

可以看到我们可以像访问块设备一样访问apex包啦

4.参考

  • https://blog.csdn.net/shengxia1999/article/details/52081286?spm=1001.2014.3001.5506
  • https://blog.csdn.net/qq_28351465/article/details/106458089?spm=1001.2014.3001.5506

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/197595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【MyBatis】核心配置文件,三大对象的作用域,#{}和${}的区别

1. environment环境:一般一个环境environment会对应一个SqlSessionFactory对象sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"),"另一个环境的id");// 数据库环境配置在这个标签里 // 这里的default表示默认使用的环…

Spring Security 源码解读 :基本架构及初始化

Spring Security 是基于web的安全组件&#xff0c;所以一些相关类会分散在 spring-security包和web包中。Spring Security通过自定义Servlet的Filter的方式实现&#xff0c;具体架构可参考官网Spring Security: Architecture 这里使用Spring Boot 2.7.4版本&#xff0c;对应Sp…

安某客滑块分析

本文仅供学习&#xff0c;不参与商业应用 目标连接&#xff1a; aHR0cHM6Ly93d3cuYW5qdWtlLmNvbS9jYXB0Y2hhLXZlcmlmeS8/Y2FsbGJhY2s9c2hpZWxkJmZyb209YW50aXNwYW0 接口分析 刷新链接可以看到getInfoTp的接口&#xff0c;请求参数sessionId及dInfo是加密参数 返回的参数包含…

Cesium 生成terrain地形数据

Cesium 生成terrain地形数据 处理地形数据 由于CTB工具不支持DEM为NoData值和float的数据,所以需要对数据进行处理。 多个tif必须县合并镶嵌成一张tifpixeltype从float转为intNoData值处理为0我使用的是ArcGis10.5,打开ArcMap: 打开 ArcToolbox->Data Management Tools…

C语言基础知识(55)

C语言程序在不使用数组的情况下找到“N”个数字中的最大数字参考以下代码实现&#xff1a;#include<stdio.h>intmain(){int count 0;int numb1 0;int numb2 0;int i 0;printf("Enter count of numbers ");scanf("%d",&count);if(count <0){p…

HTTP绕WAF之浅尝辄止

0X00前言 最近参加重保&#xff0c;和同事闲聊时间&#xff0c;谈起来了外网&#xff0c;彼时信心满满&#xff0c;好歹我也是学了几年&#xff0c;会不少的。结果&#xff0c;扭头看完do9gy师傅的《腾讯 WAF 挑战赛回忆录》&#xff0c;就啪啪打脸了。说来惭愧&#xff0c;最…

【数据结构(5)】2.3 线性表的类型定义

文章目录1. 线性表的抽象数据类型定义2. 线性表的基本操作1. 线性表的抽象数据类型定义 数据对象&#xff1a;就是一些元素&#xff0c;元素的个数大于等于 0。数据关系&#xff1a;ai-1 是 ai 的前驱&#xff0c;同时 ai 是 ai-1 的后继&#xff0c;他们都属于集合 D 2. 线性…

1月的碎碎念,但是很有必要

从今年开始每个月会整理一个我生活的琐碎但觉得有必要的事&#xff0c;一来方便年底回顾&#xff0c;二来也希望这些事情对大家有也有些参考。 不高大上&#xff0c;但是希望某一天再看到的时候会觉得充满趣味。1.新的1年的1月开始了&#xff0c;想了很多计划&#xff0c;搬新办…

rocketmq源码-consumerQueue和indexFile文件写入

前言 在rocketmq的文件中&#xff0c;除了commitLog文件&#xff0c;还有两个重要的文件&#xff0c;分别是indexFile文件和consumerQueue文件&#xff0c;这篇笔记主要记录这两个文件的数据是怎么写进去的 consumeQueue文件中对应topic下的一个queue&#xff0c;在consumeQue…

ubuntu22.04安装kalibr

前言 首先ros1目前目前在ubuntu支持的最高版本是20.04。当时我是在ubuntu22.04上编译安装的ros1。过程也十分坎坷&#xff0c;手动下载了很多包&#xff0c;具体就不累赘了。 再者目前网上的资料也都是kalibrros1, 所以推荐安装ros1之后再来安装kalibr。其次这次安装主要 参考…

关于splitChunks的一次原理探索

前言 前端时间在做项目加载优化时用到了splitChunks自动拆包&#xff0c;后了解了一下原理写下了此文。 Modules和Chunks Modules简单来理解就是我们写的功能模块&#xff0c;不管是CommonJS还是ESM都算是一个Module&#xff0c;而Chunks则是webpack根据我们的规则/默认规则…

spring security 前后端分离 进行用户验证 权限登陆的实现代码(看不懂??直接cv)

目录 前言&#xff1a; 一.所需依赖 二.application.properties 三.工具类 3.1ApplicationContextUtils 3.2JwtUtils 3.3ResponseResult 3.4ResponseStatus 3.5RsaUtils 四.UserDetailServiceImpl 五.成功处理器 六.SecurityConfig 七. filter 前言&#xff1a; 前后…

多个路由器的局域网终端设备的资源访问

多个路由器之间资源的访问 本质是将路由设备放置到一个网段 中继路由 中继的路由可以看作是另一个路由中的一个终端设备&#xff0c;只是为了延长传递wifi&#xff0c;在使用ipcofig中的网关和主路由的网关一样&#xff0c;一般都是主路由的IP。 无线桥接的中继路由 无论是…

车-电-路网时空分布负荷预测研究(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

使用c语言连接mysql数据库并且批量插入数据

​ 使用从c连接数据库需要在本机安装数据库&#xff0c;或者拿到数据库所在主机的IP地址。先说明我使用的是mysql8.0 64位的数据库&#xff0c;使用的vs是vs2019。 1.配置环境 首先打开vs2019&#xff0c;创建一个空项目&#xff0c;让后右击下图所示位置&#xff0c;然…

网络编程套接字之UDP

文章目录一、网络编程二、UDP数据报套接字编程DatagramSocketDatagramPacket实现客户端服务器程序EchoServer客户端一、网络编程 我们网络编程的核心: Socket API&#xff0c;操作系统为我们应用程序提供的API&#xff0c;我们的Socket是和传输层密切相关的。 我们传输层为我…

SpringBoot+Vue+Wx健康上报系统

简介&#xff1a;本项目采用了基本的springbootvueWx设计健康上报系统。详情请看截图。经测试&#xff0c;本项目正常运行。本项目适用于Java毕业设计、课程设计学习参考等用途。 项目描述 项目名称SpringBootVueWx健康上报系统源码作者LHL项目类型Java EE项目 &#xff08;前…

多线程初阶——线程状态

多线程初阶——线程状态 文章目录多线程初阶——线程状态1.Thread类及常见构造方法2.Thread常见的方法3.线程相关的重要操作3.1启动线程—start()3.2中断线程3.3 等待线程— join()3.4 获取线程引用3.5休眠线程—sleep()4.线程的状态1.Thread类及常见构造方法 方法说明Thread(…

前端js实现根据文件url批量压缩下载成zip包

前言 项目开发中&#xff0c;产品经理提了这样一个需求&#xff1a;将系统中的附件实现批量打包下载功能。本来系统中是有单个下载及批量下载功能&#xff0c;现在应业务方的需求&#xff0c;需要多加个批量打包下载。 初步设想是&#xff1a;由后端编写接口实现。但后来经过思…

从事测试开发8年,聊聊我是怎么从0基础到年薪40万的

本人从事测试开发8年多&#xff0c;之前在猪场工作&#xff0c;年薪突破40W&#xff0c;算是一个生活过得去的码农。&#xff08;仅代表本人&#xff09;目前从事软件测试行业的薪资待遇还是很不错的&#xff0c;所以如果朋友们真的对软件测试感兴趣的话可以坚持学下去&#xf…