Android的初始化脚本init.rc中的一些脚本的理解
金蝶云社区-墨家总院
墨家总院
14人赞赏了该文章 920次浏览 未经作者许可,禁止转载编辑于2018年11月21日 19:58:09

(本文独家发布在金蝶云社区上)

序言

最近我遇到了一些android系统的文件系统目录方面的问题,因此我必须修改android启动脚本init.rc来实现一些功能。但是对于init.rc我还有点陌生。幸好有比较了解这方面的同事帮我解决了问题。但是对于为了解决了问题而添加的脚本语句,我还不是特别了解。于是我在网上查阅了相关资料并试图理解,于是就有了这篇文章。

开始理解脚本语句

下面是本文试图解释的脚本语句,同时也是帮我搞定问题的关键:


mkdir /cores 0777 system systemmount tmpfs tmpfs /cores mode=0777,uid=1000,gid=1000restorecon_recursive /cores


我们逐一解释。

mkdir /cores 0777 system system

我们可以看到这条语句是不同于linux shell命令, mkdir /cores是标准的linux命令,但是这个命令后面那俩是什么鬼?经过了解才知道这是Android初始化脚本语言特殊的语法。从参考中的init语言规范可知,mkdir 有如下语法介绍:

mkdir <path> [mode] [owner] [group]

Create a directory at path, optionally with the given mode, owner, and 
group. If not provided, the directory is created with permissions 755 and 
owned by the root user and root group. If provided, the mode, owner 

and group will be updated if the directory exists already.

现在我们知道这条语句的意思是:

  1. 在根目录下创建一个名字为cores的目录。

  2. 这个目录的权限模式是“0777”。

  3. 这个目录的使用者,组使用者都是 system



mount tmpfs tmpfs /cores mode=0777,uid=1000,gid=1000


先看下init语言规范里的相关说明:


mount <type> <device> <dir> [ <flag>\* ] [<options>]

Attempt to mount the named device at the directory dir 
_flag_s include "ro", "rw", "remount", "noatime", ... 
options include "barrier=1", "noauto_da_alloc", "discard", ... as 
a comma separated string, eg: barrier=1,noauto_da_alloc

Linux开发人员基本都知道 "mount" 命令是用来将实际的文件系统连接到目录路径上。这条语句将会把tmpfs文件系统连到“/cores”这个目录下。其他三个选项和上一条语句类似,分别是这个目录的权限模式,uid(用户id),gid(组id)。1000这个数字在Android里也是代表system。

restorecon_recursive /cores

这条语句是selinux的相关命令。首先我们需要知道“restorecon”命令,我认为“restorecon_recursive”命令是 "restorecon"命令的递归版本。经过调查了Android源代码官网后,我猜测这个命令是用来恢复文件或者目录的SELinux的安全上下文配置,因为某些针对文件系统的命令(比如mount)会破坏他们的selinux的安全配置。

参考

  1. Android Init Language

  2. tmpfs

赞 14