- A+
问题描写:
比来发现了一个问题,在新装的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,然则只有重启后才会施展作用。
总结
以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。
您可能感兴致的文章:
Centos 7下Mongodb开机无法自启动的办理办法