本篇文章主要介绍了"android全磁盘加密",主要涉及到方面的内容,对于系统运维感兴趣的同学可以参考一下:
android 全磁盘加密 什么是全磁盘加密?全磁盘加密是使用一个密钥来为android设备上所有的用户数据加密的过程。一旦设备被加密,所有的用户创建的数据都...
ro.crypto.fs_type
ro.crypto.fs_real_blkdev
ro.crypto.fs_mnt_point
ro.crypto.fs_options
ro.crypto.fs_flags
(ASCII 8-digit hex number preceded by 0x)
启动框架以提示输入密码框架启动,然后查看vold.decrypt是否被设置为 trigger_restart_min_framework。这告诉框架这是在tmpfs /data磁盘中启动的,他需要获取用户密码。
首先,他需要确定磁盘是否被正确加密。他发送命令cryptfs cryptocomplete到vold。如果加密完全成功,则返回0.如果内部错误,返回-1.或者是如果加密没有完全成功返回-2。vold通过查看用于CRYPTO_ENCRYPTION_IN_PROGRESS标志的加密元数据来决定这个。如果被设置了,加密进程被中断了,在设备中没有可用的数据。如果vold返回一个错误,UI应该向用户展示一个信息来重启和工厂重置设备,并且给用户一个按钮来这样做。
解密带有密码的数据一旦cryptfs cryptocomplete成功了,框架就会展示一个UI询问磁盘密码。UI通过向vold发送命令cryptfs checkpw
来检查密码。如果密码正确(这是由正确挂载到临时位置的加密/data决定的,然后卸载塔),vold在属性ro.crypto.fs_crypto_blkdev中保存解密块设备的名称,并且向UI返回状态0.如果密码不正确,向UI返回-1。
停止框架UI弹出一个加密启动图形,然后使用命令 cryptfs restart
. vold设置属性
vold.decrypt为trigger_reset_main来调用vold,这样会使init.rc
去处理class_reset main。这会在主类中停止所有的服务,这允许tmpfs /data被卸载。
挂载/datavold然后挂载解密/data分区,然后准备新的分区(如果是带有可擦选项加密的话,是不会被准备的,这在首次发行的时候是不支持的)。他设置属性vold.post_fs_data_done为0,然后设置vold.decrypt为trigger_post_fs_data。这会使init.rc来运行他的
post-fs-data命令。他们会创建任何必要的目录或者是链接,然后设置vold.post_fs_data_done为1.一旦vold在那个属性中看到1,他便会设置属性 vold.decrypt
为trigger_restart_framework
.这会使init.rc重新开始位于类main中的服务,并且从启动后第一次启动位于类late_start中的服务。
开启全框架现在,框架就会使用解密/data文件系统启动他所有的服务,并且系统准备投入使用。
失败
一个解密失败的设备可能是下面几个原因。设备使用常规系列步骤开始启动:
- 检测带有密码的加密设备
- 挂载tmpfs
- 开启框架提示输入密码
但是框架打开之后,设备可能会遇到一些错误:
如果这些错误没有解决,提示用户进行工厂清除: