http://wiki.yfang.cn/bin/view/MyTroubleShooting/Svn:ErrorWhileLoadingSharedLibraries:Libsvn_ra_dav-1_so_0:CannotRestoreSegmentPortAfterReloc:PermissionDenied
最简单的方法就是关闭 SELinux
问题描述
时间
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里读