Android Container原理分析
之前写的是英文的,翻译一下吧。可能会怪怪的。IntroduceAndroid container是docker的一种,为android再其他类型系统上构建基础的linux环境。最终的效果就好像android运行再一个独立的linux系统上如上所示,尽管windows和linux完全不同,也许可以通过构建一个全新的命名空间来构建linux环境Linux & Android...
之前写的是英文的,翻译一下吧。可能会怪怪的。
Introduce
Android container是docker的一种,为android再其他类型系统上构建基础的linux环境。最终的效果就好像android运行再一个独立的linux系统上
如上所示,尽管windows和linux完全不同,也许可以通过构建一个全新的命名空间来构建linux环境
Linux & Android
了解android和linux的关系是很必要的,通过认识android和linux各自的功能有助于理解android container的原理
如下:
Blue means that implement by android
准备条件:
- Linux 内核ENV: system call, related drivers, 内存管理,进程管理等
- 用户空间linux&android API: libc, libpcap, libcore etc
- Binder driver for IPC
- 以pid 1运行init进程
- 确保zygote 进程启动成功: Zygote是所有应用进程之父,提供了JVM环境
Linux Box
linux box需要做什么呢?
Namespaces:
- 让android相信自身再以root权限运行
- Android的UID应当和主进程存在映射关系(类似android中的多账户)
- Clone flag CLONE_NEWUSER
- 允许mount其他目录为android系统提供支持
File System:
构建基础的目录结构,就像镜像所做的
Input:
激活android系统的点击事件的分发
Audio/Video/Graphics:
提供UI,绘图,媒体接口给container
Network:
设置虚拟网卡设备用户上网,网卡设备的数据需要和物理网卡路由接通
Security:
- Verity, root of trust
- Cgroups
- Android Device Node Access
- SELinux
Android library:
确保android基础库和依赖库的支持
Boot android
先确认一下android是怎么启动的。如下:
android启动图示
Init: init进程为android系统的第一个进程。
App_main: Zygote进程的原始名称,后来改了
SystemServer: Zygote第一个儿子,负责所有android service的启动
android的init进程最初是被kernel启动的,而后从内核进程变为用户进程。container可以直接启用init作为容器内的第一个进程。
Architecture
Android container 需要直接或间接的和主系统沟通。如下:
也许android和Main OS有共同的api,也许没有。所以定制化的linux box需要对整体的api做一个代理。保证android系统正常运行。此外,binder为android系统独有,所以linux box也需要针对这一情况处理,将binder转换为其他形式的IPC还是单独实现?一些共享的组件也需要对android系统暴露出来,例如:wifi认证组件,蓝牙协议栈,openmax等
NameSpace
linux提供的分裂出一个全新命名空间的api,如下:
int clone(int (*fn)(void *), void *child_stack, int flags, void *arg)
Mounts
Android的目录布局比较复杂,并且各个目录的功能也不近相同。如下目录所见,虽然为android布局了理想的目录,但是由于container没有内核作为支撑,所以很多功能难以实现。这时候需要将部分目录mount到主系统的目录中,共用交叉的功能
Network
构建独立的网络接口,所有的网络请求通过此虚拟网卡转发到主系统的网卡中。这一功能可以参考VPN的实现。
Security
安全配置再container中也至关重要,目前可以想到的配置如下:
• 维持主系统的安全配置
• 确认root目录,保证android无法在未经许可的情况下访问主系统目录
• android的升级操作保持在为android提供的root路径下
• 配置主os和container的cpu&memory使用,保证调度上的安全性
• 保证container中的android目录拥有原本的读写权限限制
• 构建全新的selinux规则
Conclude
通过以上的介绍,目前我所知到支持namespace的系统都是类linux类型的。索性这一技术目前大多应用在linux类型的系统上。
更多推荐
所有评论(0)