前段时间用ubuntu 12.04 编译了Galaxy S II Kernel, 结果无法正常boot, 后来通过看kernel log, dmesg 发现如下问题:
[ 1.794046] init: skipping insecure file '/init.rc'
[ 1.797667] init: skipping insecure file '/init.smdk4210.rc'
[ 1.803434] init: skipping insecure file '/default.prop'
[ 6.000636] init: Timed out waiting for /dev/.coldboot_done
[ 6.004869] init: Unable to open persistent property directory /data/property errno: 2
后来在下面这个帖子上找到了解决方法,一直没时间研究下究竟是为啥,总是匆匆忙忙,很多东西就这么过去了,没有留下任何东西,很悲哀,记录一下吧:
原因是system/core/util.c 中加入了init.rc 等文件用户组写权限的检查,因此最终的解决方案是:
chmod g-w -R boot/initramfs && \
去掉用户组group 的写权限。
chmod 百科:
C语言函数
函数原型
函数名称:chmod 函数原型:int chmod( const char *filename, int pmode ); 所属库:io.h 函数功能:改变文件的读写许可设置,如果改变成功返回0,否则返回-1示例
这个例子中实现了把文件sample.txt设置为 只读文件 : #include <conio.h> #include <io.h> #include <sys/stat.h> int main(void) { if( chmod("D:\\sample.txt",S_IREAD)==-1) { cprintf("文件sample.txt不存在\n"); } else { cprintf("文件sample.txt变为只读文件\n"); } return 0; } 备注:S_IREAD、S_IWRITE、S_IFREG均定义在sys/stat.h头文件下 可以使用命令chmod来为文件或目录赋予权限。Linux/Unix 的 档案存取 权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所存取。 使用权限:所有使用者 格式:chmod [-cfvR] [--help] [--version] mode file... 参数说明: mode : 权限设定字串,格式如下 : [ugoa...][[+-=][rwxX]...][,...],其中u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。 + 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。 -s :在文件执行时把进程的属主或组ID置为该文件的文件属主。 -c : 若该档案权限确实已经更改,才显示其更改动作 -f : 若该档案权限无法被更改也不要显示错误讯息 -v : 显示权限变更的详细资料 -R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更) --help : 显示辅助说明 --version : 显示版本 相关函数: fchmod , stat, open, chown 头文件:#include <sys/types.h> #include <sys/stat.h> 定义函数:int chmod(const char * path, mode_t mode); 函数说明:chmod()会依参数mode 权限来更改参数path 指定文件的权限。 参数 mode 有下列数种组合: 1、S_ISUID 04000 文件的 (set user-id on execution)位 2、S_ISGID 02000 文件的 (set group-id on execution)位 3、S_ISVTX 01000 文件的sticky 位 4、S_IRUSR (S_IREAD) 00400 文件 所有者 具可读取权限 5、S_IWUSR (S_IWRITE)00200 文件 所有者 具可写入权限 6、S_IXUSR (S_IEXEC) 00100 文件 所有者 具可执行权限 7、S_IRGRP 00040 用户组具可读取权限 8、S_IWGRP 00020 用户组具可写入权限 9、S_IXGRP 00010 用户组具可执行权限 10、S_IROTH 00004 其他用户具可读取权限 11、S_IWOTH 00002 其他用户具可写入权限 12、S_IXOTH 00001 其他用户具可执行权限 注:只有该文件的 所有者 或有效用户识别码为0,才可以修改该文件权限。 基于系统安全,如果欲将数据写入一执行文件,而该执行文件具有S_ISUID 或S_ISGID 权限,则这两个位会被清除。如果一目录具有S_ISUID 位权限,表示在此目录下只有该文件的 所有者 或root 可以删除该文件。 返回值:权限改变成功返回0, 失败返回-1, 错误原因存于errno. 错误代码 : 1、EPERM 进程的有效用户识别码与欲修改权限的文件拥有者不同, 而且也不具root 权限. 2、EACCESS 参数path 所指定的文件无法存取. 3、EROFS 欲写入权限的文件存在于 只读文件 系统内. 4、EFAULT 参数path 指针 超出可存取内存空间. 5、EINVAL 参数mode 不正确 6、ENAMETOOLONG 参数path 太长 7、ENOENT 指定的文件不存在 8、ENOTDIR 参数path 路径并非一目录 9、ENOMEM 核心内存 不足 10、ELOOP 参数path 有过多符号连接问题. 11、EIO I/O 存取错误 范例 /* 将/etc/passwd 文件权限设成S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH */ #include <sys/types.h> #include <sys/stat.h> main() { chmod("/etc/passwd", S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH); }编辑本段Linux命令——chmod
命令描述
变更文件 或目录的权限。在UNIX系统家族里,文件或目录权限的控制分别以读取,写入,执行3种一般权限来区分,另有3种特殊权限可供运用,再搭配拥有者与所属群组管理权限范围。您可以使用chmod指令去 变更文件 与目录的权限,设置方式采用文字或数字代号皆可。符号连接的权限无法变更,如果您对符号连接修改权限,其改变会作用在被连接的原始文件。权限范围的表示法如下: u:User,即文件或目录的拥有者。 g:Group,即文件或目录的所属群组。 o:Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围。 a:All,即全部的用户,包含拥有者,所属群组以及其他用户。 有关权限代号的部分,列表于下: r:读取权限,数字代号为"4"。 w:写入权限,数字代号为"2"。 x:执行或切换权限,数字代号为"1"。 -:不具任何权限,数字代号为"0"。 s:特殊?b>功能说明: 变更文件 或目录的权限。语法
chmod [-cfRv][--help][--version][<权限范围>+/-/=<权限设置...>][文件或目录...] chmod [-cfRv][--help][--version][数字代号][文件或目录...] chmod [-cfRv][--help][--reference=<参考文件或目录>][--version][文件或目录...]选项说明
-c或--changes 效果类似"-v"参数,但仅回报更改的部分。 -f或--quiet或--silent 不显示 错误信息 。 -R或--recursive 递归处理,将指定目录下的所有文件及子目录一并处理。 -v或--verbose 显示指令执行过程。 --help 在线帮助。 --reference=<参考文件或目录> 把指定文件或目录的权限全部设成和参考文件或目录的权限相同 --version 显示版本信息。 <权限范围>+<权限设置> 开启权限范围的文件或目录的该项权限设置。 <权限范围>-<权限设置> 关闭权限范围的文件或目录的该项权限设置。 <权限范围>=<权限设置> 指定权限范围的文件或目录的该项权限设置。范例
范例一 :将档案 file1.txt 设为所有人皆可读取 : chmod ugo+r file1.txt 将档案 file1.txt 设为所有人皆可读取 : chmod a+r file1.txt 将档案 file1.txt 与 file2.txt 设为该档案拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 : chmod ug+w,o-w file1.txt file2.txt 将 ex1.设定为只有该档案拥有者可以执行 : chmod u+x ex1 将目前目录下的所有档案与子目录皆设为任何人可读取 : chmod -R a+r * 当其他用户执行oracle的sqlplus这个程序时,他的身份因这个程序暂时变成oracle chmod u+s sqlplus 此外,chmod也可以用数字来表示权限如 chmod 777 file 语法为:chmod abc file 其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。 r=4,w=2,x=1 若要rwx属性则4+2+1=7; 若要rw-属性则4+2=6; 若要r-x属性则4+1=5。 范例二 : chmod a=rwx file 和 chmod 777 file 效果相同 chmod ug=rwx,o=x file 和 chmod 771 file 效果相同 若用chmod 4755 filename可使此程式具有root的权限 范例三 : 如果在cd /media/amasun/java/develop/array之后执行 chmod 777 ./ 是将本目录(即/media/amasun/java/develop/array)设为任何人可读,写,执行 如果是 管理员 也就是常说的ROOT用户的话,基本上有可以查看所有文件的权力.