这里有新鲜出炉的 MongoDB 手册, 程序狗速度看过来!
MongoDB 分布式文件存储的数据库
MongoDB 是一个基于分布式文件存储的数据库. 由 C++ 语言编写. 旨在为 web 应用提供可扩展的高性能数据存储解决方案.
这篇文章主要给大家介绍了关于 CentOS 7 系统下 SELinux 阻止 MongoDB 启动问题的相关资料, 文中通过示例代码介绍的非常详细, 对大家的学习或者工作具有一定的参考学习价值, 需要的朋友们下面随着小编来一起学习学习吧.
问题描述:
最近发现了一个问题, 在新装的 CentOS7 上, 安装了 MongoDB3.4, 挂载了一个大的数据盘后, 修改 / etc/mongo.conf, 将配置文件中的 log 和 data 目录放在新的数据盘下, 并修改文件的访问权限.
改完后的 mongo.conf:
# mongod.conf
# for documentation of all options, see:
# http://docs.mongodb.org/manual/reference/configuration-options/
# where to write logging data.
systemLog:
destination: file
logAppend: true
path: /data/mongodb/log/mongod.log
# Where and how to store data.
storage:
dbPath: /data/mongodb/data
.....
文件权限:
# ls -alh
drwxr-xr-x. 5 mongod mongod 4.0K 11 月 1 14:53 mongodb
# cd mongodb
# ls -alh
drwxr-xr-x. 3 mongod mongod 4.0K 11 月 9 19:08 data
drwxr-xr-x. 2 mongod mongod 4.0K 11 月 9 19:06 log
drwxr-xr-x. 2 mongod mongod 4.0K 11 月 1 14:54 run
执行
systemctl start mongod
命令后, 查看状态发现并没有启动, 查看 / var/log/message, 发现以下错误
Nov 9 06:06:44 [localhost] setroubleshoot: failed to retrieve rpm info for /data/mongodb/run/mongod.pid
Nov 9 06:06:44 [localhost] setroubleshoot: SELinux is preventing /usr/bin/mongod from write access on the file /data/mongodb/run/mongod.pid. For complete SELinux messages run: sealert -l f7148e11-b126-401e-ba9f-a9a87c1e54ae
Nov 9 06:06:44 [localhost] python: SELinux is preventing /usr/bin/mongod from write access on the file /data/mongodb/run/mongod.pid.#012#012***** Plugin restorecon (94.8 confidence) suggests ************************#012#012If you want to fix the label. #012/data/mongodb/run/mongod.pid default label should be default_t.#012Then you can run restorecon.#012Do#012# /sbin/restorecon -v /data/mongodb/run/mongod.pid#012#012***** Plugin catchall_labels (5.21 confidence) suggests *******************#012#012If you want to allow mongod to have write access on the mongod.pid file#012Then you need to change the label on /data/mongodb/run/mongod.pid#012Do#012# semanage fcontext -a -t FILE_TYPE '/data/mongodb/run/mongod.pid'#012where FILE_TYPE is one of the following: afs_cache_t, initrc_tmp_t, mongod_log_t, mongod_tmp_t, mongod_var_lib_t, mongod_var_run_t, puppet_tmp_t, user_cron_spool_t.#012Then execute:#012restorecon -v '/data/mongodb/run/mongod.pid'#012#012#012***** Plugin catchall (1.44 confidence) suggests **************************#012#012If you believe that mongod should be allowed write access on the mongod.pid file by default.#012Then you should report this as a bug.#012You can generate a local policy module to allow this access.#012Do#012allow this access for now by executing:#012# ausearch -c 'mongod' --raw | audit2allow -M my-mongod#012# semodule -i my-mongod.pp#012
从提示中可以看出是 SELinux 的防护功能, 阻止了访问.
SELinux
SELinux 的全称是 Security Enhanced Linux, 就是安全加强的 Linux. 在 SELinux 之前, root 账号能够任意的访问所有文档和服务; 如果某个文件设为 777, 那么任何用户都可以访问甚至删除; 这种方式称为 DAC(主动访问机制), 很不安全.
DAC 自主访问控制: 用户根据自己的文件权限来决定对文件的操作, 也就是依据文件的 own,group,other/r,w,x 权限进行限制. Root 有最高权限无法限制. r,w,x 权限划分太粗糙. 无法针对不同的进程实现限制.
SELinux 则是基于 MAC(强制访问机制), 简单的说, 就是程序和访问对象上都有一个安全标签 (即 selinux 上下文) 进行区分, 只有对应的标签才能允许访问. 否则即使权限是 777, 也是不能访问的.
在 SELinux 中, 访问控制属性叫做安全上下文. 所有客体 (文件, 进程间通讯通道, 套接字, 网络主机等) 和主体 (进程) 都有与其关联的安全上下文, 一个安全上下文由三部分组成: 用户(u), 角色 (r) 和类型 (t) 标识符. 但我们最关注的是第三个部分
当程序访问资源时, 主体程序必须要通过 selinux 策略内的规则放行后, 就可以与目标资源进行安全上下文的比对, 若比对失败则无法存取目标, 若比对成功则可以开始存取目标, 最终能否存取目标还要与文件系统的 rwx 权限的设定有关. 所以启用了 selinux 后出现权限不符的情况时, 你就得一步一步的分析可能的问题了.
解决过程:
/var/log/message 中的信息看起来比较费劲, 里面有一句提示:
For complete SELinux messages run: sealert -l e73ba9e8-f74d-4835-9b53-85667546b28c
根据提示执行:
# sealert -l e73ba9e8-f74d-4835-9b53-85667546b28c
SELinux is preventing /usr/bin/mongod from write access on the directory /data/mongodb/log.
***** Plugin catchall_labels (83.8 confidence) suggests *******************
If you want to allow mongod to have write access on the log directory
Then 必须更改 /data/mongodb/log 中的标签
Do
# semanage fcontext -a -t FILE_TYPE '/data/mongodb/log'
其中 FILE_TYPE 为以下内容之一: mongod_log_t, mongod_tmp_t, mongod_var_lib_t, mongod_var_run_t, tmp_t, var_lib_t, var_log_t, var_run_t.
然后执行:
restorecon -v '/data/mongodb/log'
***** Plugin catchall (17.1 confidence) suggests **************************
......
上面提示输出中已经包含了, 解决方法:
# semanage fcontext -a -t mongo_log_t '/data/mongodb/log'
# restorecon -v '/data/mongodb/log'
restorecon reset /data/mongodb/log context unconfined_u:object_r:unlabeled_t:s0->unconfined_u:object_r:mongod_log_t:s0
上面命令执行完毕后, 就解决了 / data/mongodb/log 目录的文件权限问题.
同样的方法, 再解决 / data/mongodb/data 和 / data/mongodb/run 目录的问题.
启动 mongod, 问题解决.
Nov 9 06:08:51 [localhost] systemd: Starting High-performance, schema-free document-oriented database...
Nov 9 06:08:51 [localhost] systemd: Started High-performance, schema-free document-oriented database.
Nov 9 06:08:51 [localhost] mongod: about to fork child process, waiting until server is ready for connections.
Nov 9 06:08:51 [localhost] mongod: forked process: 18218
Nov 9 06:08:51 [localhost] mongod: child process started successfully, parent exiting
P.S. 除了上面通过提示信息解决问题外, 还有一个比较暴力的方法, 直接关闭 SELinux, 但是不太建议.
# setenforce 0
# getenforce
Permissive
上面是临时关闭, 如果是永久关闭, 就需要编辑 / etc/selinux/config 文件, 将 SELINUX=enforcing 改为 SELINUX=disabled, 但是只有重启后才会发挥作用.
总结
以上就是这篇文章的全部内容了, 希望本文的内容对大家的学习或者工作具有一定的参考学习价值, 如果有疑问大家可以留言交流, 谢谢大家对 PHPERZ 的支持.
来源: http://www.phperz.com/article/18/0128/360817.html