序言
最近我遇到了一些android系统的文件系统目录方面的问题,因此我必须修改android启动脚本init.rc来实现一些功能。但是对于init.rc我还有点陌生。幸好有比较了解这方面的同事帮我解决了问题。但是对于为了解决了问题而添加的脚本语句,我还不是特别了解。于是我在网上查阅了相关资料并试图理解,于是就有了这篇文章。
开始理解脚本语句
下面是本文试图解释的脚本语句,同时也是帮我搞定问题的关键:
mkdir /cores 0777 system systemmount tmpfs tmpfs /cores mode=0777,uid=1000,gid=1000restorecon_recursive /cores
我们逐一解释。
1 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, ownerand group will be updated if the directory exists already.
现在我们知道这条语句的意思是:
在根目录下创建一个名字为cores的目录。
这个目录的权限模式是“0777”。
这个目录的使用者,组使用者都是 system。
2 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。
3 restorecon_recursive /cores
这条语句是selinux的相关命令。首先我们需要知道“restorecon”命令,我认为“restorecon_recursive”命令是 "restorecon"命令的递归版本。经过调查了Android源代码官网后,我猜测这个命令是用来恢复文件或者目录的SELinux的安全上下文配置,因为某些针对文件系统的命令(比如mount)会破坏他们的selinux的安全配置。