我最近将我的一个应用程序服务器升级到 CentOS 6(.2),并准备将其用于生产,这时我遇到了以下问题;每当我尝试通过 semanage 添加自定义 http 端口时,我都会收到以下错误消息:
libsemanage.semanage_exec_prog: Child process /sbin/setfiles did not exit cleanly.
libsemanage.semanage_install_active: setfiles returned error code -1.
libsemanage.semanage_exec_prog: Child process /sbin/setfiles did not exit cleanly.
libsemanage.semanage_install_active: setfiles returned error code -1.
/usr/sbin/semanage: Could not commit semanage transaction
我尝试运行的命令:
semanage port -a -t http_port_t -p tcp 27960
当前内核:
2.6.32-220.4.1.el6.x86_64 #1 SMP Tue Jan 24 02:13:44 GMT 2012 x86_64 x86_64 x86_64 GNU/Linux
当前策略coreutils-python:
2.0.83-19.18.el6
最后,当前的 selinux 设置:
SELinux status: enabled
SELinuxfs mount: /selinux
Current mode: enforcing
Mode from config file: enforcing
Policy version: 24
Policy from config file: targeted
有人遇到过这个问题吗?如果遇到过,您是如何解决的?
提前致谢
- 编辑 -
我检查了 /var/log/messages,看起来 semanage 失败了,原因是“内核:内存不足:杀死进程 1648 (semanage) 得分 769 或牺牲子进程”。这很奇怪,因为我有一个几乎完全相同的克隆(在 linode.com 上),具有相同的 cpu/mem 规格,并且命令运行正常。
free -t -m
在 semanage 持续失败的服务器上:
total used free shared buffers cached
Mem: 489 79 410 0 0 11
-/+ buffers/cache: 67 422
Swap: 0 0 0
Total: 489 79 410
答案1
在 Digital Ocean 上也遇到了类似的问题。某些 VM 主机(Digital Ocean、AWS、Rackspace)可能默认未启用交换空间,这显然会导致semanage
被杀死。
在我玩过的 CentOS 7 VM 上,semanage
执行命令之前需要 300 到 400 MB 的可用 RAM 才能成功运行而不会被杀死。
答案2
发现问题了,当我实现自己的自定义内核而不是预装内核时,我忘记添加交换驱动器。当我重新添加交换驱动器时,命令运行正常。