问题描述
时间
2008.10.14环境
CentOS5症状
正常安装svn后执行不能
# 执行svn命令,会提示 [root@localhost lib]# svn svn: error while loading shared libraries: /usr/local/svn-1.4.0/lib/libsvn_ra_dav-1.so.0: cannot restore segment prot after reloc: Permission denied
问题原因和解决方案
- 非常快的排除了系统文件权限(就是那个chmod能改的lrwxrwxrwx)可能,因为这是一个符号链接,一直追过去权限没有问题
- 不卖关子,这个问题的原因是因为SELinux被Enable但是没有配置过libsvn_ra_dav-1.so.0文件的security context的原因,为了检查这个问题,你可以执行下面的命令来确认
# sestatus [-v] # 注意里面 SELinux status: enabled 部分 # 其他方法也可以查看,比如 cat /selinux/enforce 1 代表 enforcing 状态, 0 代表 permissive 状态 # 或者下面这个更直观 getenforce
- 通常有两种解决方案
- 方案一:避开问题,如果你提出了这个问题并为之困惑,我基本上可以判断你并不熟悉SElinux的工作性质,甚至从来没有注意过它的存在。基于这种考虑,如果你联系你们的服务器管理员后确认SElinux不是你们系统中必须的,那么把它干掉吧。具体方法是执行setenforce disabled来禁用selinux,或者至少setenforce permissive来用warning代替禁止你工作的error级错误,这样Selinux就不再强悍的把你挡掉了。同样的配置实现在CentOS5或者RHEL5中可以通过system-config-securitylevel-tui来设定,它包装了这个小功能。
- 方案二:继续Enable SElinux的情况下,你需要针对这件事做的操作也很简单,执行下面的命令更改security context就可以了,问题是,你可能今后亦然遇到这种类似的问题,你需要比较了解SElinux的机制和你的应用程序的底层调用。
chcon -t texrel_shlib_t /usr/local/svn-1.4.0/lib/libsvn_ra_dav-1.so.0
多说两句
- SElinux对于Linux新手来说可能是一个比较难于理解的工具,对于一般的新手系统管理员来说,你可以先跳过这个工具,简单的disable掉它。
- SElinux很大程度上解决了简单的权限认证不能够保证系统真正安全的问题,是美国军方提出的。所以对于系统复杂,分工详细,安全要求比较高的系统来说,这是一个好东西,不过同时带来的是较为复杂的设置(一般非常强大的可定制工具都是这样),要求管理员对系统和程序比较了解,否则可能把自己希望的服务挡掉继而出现本文提到的类似问题。
- 感兴趣的朋友可以直接查看SElinux的官方文档,来获取更多消息。
SElinux可能涉及到的命令
# 查看SElinux Enable情况 sestatus getenforce # 设定SElinux是否启用 setenforce # 防火墙管理的TUI,可以设定Selinux状态 system-config-securitylevel-tui # 查看当前用户security context id -Z # 查看文件security context ls -Z ls --lcontext ls --scontext # 查看运行进程的security context ps -eZ # 更改文件security context chcon # 重置文件security context restorecon # 根据已有的挡掉的log生成允许的规则,可以帮助你调试当前规则 cat /var/log/message | audit2allow audit2allow -d #这个是从dmesg里读