首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SELinux 权限问题导致 GreatSQL 运行不了的坑

SELinux 权限问题导致 GreatSQL 运行不了的坑

作者头像
GreatSQL社区
发布于 2023-02-22 02:43:44
发布于 2023-02-22 02:43:44
87200
代码可运行
举报
运行总次数:0
代码可运行

* GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。

系统版本:Linux version 4.18.0-348.el8.x86_64

前言

SELinux 是什么

安全增强型 Linux(SELinux)是一种采用安全架构的 Linux® 系统,它能够让管理员更好地管控哪些人可以访问系统。它最初是作为 Linux 内核的一系列补丁,由美国国家安全局(NSA)利用 Linux 安全模块(LSM)开发而成。

SELinux 工作原理

SELinux 定义了每个人对系统上的应用、进程和文件的访问控制。利用安全策略(一组告知 SELinux 哪些能访问,哪些不能访问的规则)来强制执行策略所允许的访问。

当应用或进程(称为主体)发出访问对象(如文件)的请求时,SELinux 会检查访问向量缓存(AVC),其中缓存有主体和对象的访问权限。

开启 SELinux 可以提升系统的安全性,但同时也会带来一些问题。在特定场景有的人会选择关闭 SELinux 以换取更好的兼容性。

在GreatSQL的安装手册里,就有关闭 SELinux 这一步。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#关闭selinux
$ setenforce 0
$ sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config

不禁让人好奇,这个 SELinux 安全模块,如果不关闭会产生什么问题,在使用时有哪些需要注意的地方。于是我特意尝试了一下,开启 SELinux 安装 GreatSQL 数据库,看看会出现哪些问题。

问题产生

为了发现问题,我特意选择在用户目录(/root)下载解压 GreatSQL 二进制压缩包,然后再移动到指定目录使用。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /root
wegt https://***.***/greatsql.tar.gz
tar -xvf greatsql.tar.gz
mv /root/greatsql /usr/local/

安装过程一切顺利,数据库正常启动了,但是在配置 systemd 进程守护的时候出现了问题。

greatsql.service文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vim /usr/lib/systemd/system/greatsql.service

[Unit]
Description=GreatSQL Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
User=greatsql
Group=greatsql


# Have mysqld write its state to the systemd notify socket
Type=notify

# Disable service start and stop timeout logic of systemd for mysqld service.
TimeoutSec=0

# Start main service
ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS 

# Use this to switch malloc implementation
#EnvironmentFile=-/etc/sysconfig/mysql

# Sets open_files_limit
LimitNOFILE = 10000

Restart=on-failure

RestartPreventExitStatus=1

# Set environment variable MYSQLD_PARENT_PID. This is required for restart.
Environment=MYSQLD_PARENT_PID=1

PrivateTmp=false

systemctl start greatsql 启动数据库的时候报以下错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@Linux ~]# systemctl restart greatsql
Job for greatsql.service failed because the control process exited with error code.
See "systemctl status greatsql.service" and "journalctl -xe" for details.

直接运行mysqld没问题但是使用systemctl 就启动不了。

根据上面的报错,查看一下 greatsql systemd的状态和相关日志

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@gip Linux]# systemctl status greatsql.service
● greatsql.service
   Loaded: loaded (/usr/lib/systemd/system/greatsql.service; bad; vendor preset: disabled)
   Active: failed (Result: exit-code) since Tue 2023-01-10 16:00:06 CST; 17s ago
  Process: 147226 ExecStart=/usr/local/greatsql/bin/mysqld --defaults-file=/etc/my.cnf $MYSQLD_OPTS (code=exited, status=203/EXEC)
 Main PID: 147226 (code=exited, status=203/EXEC)

Jan 10 16:00:06 gip systemd[1]: greatsql.service: Service RestartSec=100ms expired, scheduling restart.
Jan 10 16:00:06 gip systemd[1]: greatsql.service: Scheduled restart job, restart counter is at 5.
Jan 10 16:00:06 gip systemd[1]: Stopped greatsql.service.
Jan 10 16:00:06 gip systemd[1]: greatsql.service: Start request repeated too quickly.
Jan 10 16:00:06 gip systemd[1]: greatsql.service: Failed with result 'exit-code'.
Jan 10 16:00:06 gip systemd[1]: Failed to start greatsql.service.
Jan 10 16:00:23 gip systemd[1]: /usr/lib/systemd/system/greatsql.service:1: Missing '='.

通过查看上述信息,可以得知 程序启动的时候抛出了报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Main PID: 147226 (code=exited, status=203/EXEC)

通过上网搜索可以得知,status=203/EXEC 报错可能和权限不足有关,记一下这里的PID。

我们继续查看一下相关日志证实一下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@Linux ~]# journalctl _PID=13386

-- Logs begin at Tue 2023-01-10 16:54:11 CST, end at Tue 2023-01-10 17:09:15 CST. --
Jan 10 17:00:36 gip systemd[13386]: greatsqld.service: Failed to execute command: Permission denied
Jan 10 17:00:36 gip systemd[13386]: greatsqld.service: Failed at step EXEC spawning /usr/local/greatsql/bin/mysqld: Permission denied

可以看到确实是权限不足。

但是奇怪的事情来了,通过查看文件权限发现权限并没有问题。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[root@GreatSQL bin]# ls -lah |grep mysql
-rwxr-xr-x.   1 root root    6.9M 429 2022 mysql
-rwxr-xr-x.   1 root root    6.8M 429 2022 mysqladmin
-rwxr-xr-x.   1 root root    7.1M 429 2022 mysqlbinlog
-rwxr-xr-x.   1 root root    6.8M 429 2022 mysqlcheck
-rwxr-xr-x.   1 root root    6.3K 429 2022 mysqld_pre_systemd
-rwxr-xr-x.   1 root root     34K 429 2022 mysqld_safe
-rwxr-xr-x.   1 root root    6.9M 429 2022 mysqldump
-rwxr-xr-x.   1 root root    1.7K 429 2022 mysqldumpslow
 ***后省略***

即便把权限改成755,甚至777 也还是会报一样的错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
chown -R mysql:mysql /usr/local/mysql
chmod 755 -R /usr/local/mysql

问题原因

后面我有检查了所有相关文件的权限,都没问题,但是程序还是会报权限不足。

在网上翻阅了资料,发现了问题产生原因。

SELinux 的问题, 因为我的二进制文件是先下载到 /root 目录,然后才移到 /usr/local/greatsql目录,从/root目录移动到/usr/local/目录时它们的 SELinux 上下文不会自动变更,依然是用户主目录。所以出现了权限问题。

解决方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#恢复文件的安全上下文
restorecon -rv /usr/local/greatsql

总结

可执行文件是先存放在用户目录,然后移动到别的目录,文件的 SELinux 上下文不会自动变更,依然是用户目录。

这就导致了,能直接运行,但是通过 systemd 启动时仍然报 Permission denied权限不足的问题。

解决方法就是用restorecon命令用来恢复SELinux文件属性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
restorecon -rv 目标目录

相关链接: 解决文件权限正确,但 systemd 服务仍然提示没有权限,启动失败。(https://blog.csdn.net/kunyus/article/details/106592236) 一文带你看懂 SELinux 是什么? (redhat.com(https://www.redhat.com/zh/topics/linux/what-is-selinux)

Enjoy GreatSQL :)


《零基础学习MySQL》视频课程

戳此小程序即可直达B站

https://www.bilibili.com/video/BV1Da411W7Va?spm_id_from=333.999.0.0&vd_source=ae1951b64ea7b9e6ba11f1d0bbcff0e4


文章推荐:


关于 GreatSQL

GreatSQL是由万里数据库维护的MySQL分支,专注于提升MGR可靠性及性能,支持InnoDB并行查询特性,是适用于金融级应用的MySQL分支版本。

GreatSQL社区官网: https://greatsql.cn/

Gitee: https://gitee.com/GreatSQL/GreatSQL

GitHub: https://github.com/GreatSQL/GreatSQL

Bilibili:https://space.bilibili.com/1363850082

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GreatSQL社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
从零开始学习React-目录结构,创建组件页面(二)
1:打开编辑器,导入上一节的创建的项目,开始查看目录结构,manifest.json指定了开始页面index.html,一切的开始都从这里开始。
王小婷
2019/11/05
2.3K0
React基础语法01-双向数据绑定
把model里面的值赋给input,即把this.state里面的username值给了input,当页面加载的时候,model层就能改变视图view。 model
王小婷
2019/11/10
8150
React基础语法01-双向数据绑定
React基础语法06-事件对象的应用
老规矩,先看完官方文档,记录学习笔记: 教程:https://www.runoob.com/react/react-tutorial.html 文档:http://caibaojian.com/react/
王小婷
2019/11/10
6000
React基础语法05-改变this指向的3种方法
使用this指向当前组件的三种方法:分别是在模板里,在构造函数里,在构造函数里改变,推荐第三种,箭头函数。
王小婷
2019/11/10
5400
React基础语法02-onKeyUp键盘事件
3:继续实现 按回车键的时候,拿到值,首先监听KeyUp或者KeyDown事件,进行判断,当keyCode==13的时候,表示键盘按下,获取值。
王小婷
2019/11/10
3K0
React基础语法02-onKeyUp键盘事件
基于antd实现一个轮播图
关于antd的使用这里就不多说了,前面已经写过了,从零开始学习React-引入Ant Design 组件(八):https://www.jianshu.com/p/e7e905d89673,现在为了对组件的熟悉,来根据文档写一个常见的轮播图吧。
王小婷
2019/12/11
2.6K0
React基础语法04-循环数组渲染数据的方法
首先在this.state里面定义数组list: ['111', '222', '3333'], 写方法过滤,map循环遍历更改数组,返回一个li,把value放进去。
王小婷
2019/11/10
3.2K0
「React 手册 」从创建第一个 React 组件开始学起
大家好,在本系列的前三篇文章里,我们一起学习了在 React 中经常会用到的 ES6 新特性,以及 REACT 16+ 版本的一些新特性 和 团队 成员在 Winwow 和 MAC 环境下混合开发时需要注意的一些问题,从本篇文章起,我们将正式开始从最基础的内容开始学习React,今天我们将从创建第一个 React 组件开始学起。
前端达人
2019/12/24
2.6K0
「React 手册 」从创建第一个 React 组件开始学起
测开技能--Web开发 React 学习(二)环境搭建
开发环境的搭建,才是学习的第一步,那么我们看看,应该怎么搭建Recat的环境。那么跟着下面的教程,一步步来吧。
雷子
2021/03/15
3270
测开技能--Web开发 React 学习(二)环境搭建
react 学习:react 生命周期
一、图示 二、编写电子时钟 1 新建DigitalClock.js import React from 'react' /** * */ class DigitalClock extends R
爱明依
2019/04/22
4890
react 学习:react 生命周期
react学习:React状态
实现一个点赞按钮。点击数字增加 一:建立LikeButton.js  import React from 'react' class LikeButton extends React.Component{ constructor(props){ super(props) this.state={ likes:0 } // this.increaseLikes=this.increaseLikes.bind
爱明依
2019/04/22
8090
react学习:React状态
React多页面应用2(webpack4 处理CSS及图片,引入postCSS,及图片处理等)
本教程总共9篇,每日更新一篇,请关注我们!你可以进入历史消息查看以往文章,也敬请期待我们的新文章! 1、React多页面应用1(webpack4 开发环境搭建,包括热更新,api转发等)---2018.04.04 2、React多页面应用2(webpack4 处理CSS及图片,引入postCSS,及图片处理等)---2018.04.08 3、React多页面应用3(webpack4 多页面实现)---2018.04.09 4、React多页面应用4(webpack4 提取第三方包及公共组件)---2018
前端人人
2018/04/11
1.4K0
React多页面应用2(webpack4 处理CSS及图片,引入postCSS,及图片处理等)
react 学习:React属性 数组遍历、css引入
一:index.js 里直接引入css。 import React from 'react'; import ReactDOM from 'react-dom'; import './index.css'; import App from './App'; // import Welcome from './Welcome'; import * as serviceWorker from './serviceWorker'; import 'bootstrap/dist/css/bootstrap.
爱明依
2019/04/22
1.2K0
react 学习:React属性 数组遍历、css引入
「React 基础」关于组件属性(props)与状态(state)的入门介绍
大家好,在上一篇文章里,我们一起学习了如何创建第一个 React 组件,我相信通过上一篇文章的学习我们已经基本熟悉了什么是 React 组件,但是还有更多关于组件的内容值得我们去深入学习。本篇文章,我将和大家一起复习下如何使用组件的属性(props)与状态(state)。
前端达人
2019/12/26
1.6K0
「React 基础」关于组件属性(props)与状态(state)的入门介绍
React基础语法08-点击按钮,获取input框的值(通过ref来获取)
使用setState来改变username的值,让username的值等于val,即表单输入的值就赋给了userusername。
王小婷
2019/11/10
5.5K0
React技巧之导入并使用Image
原文链接:https://bobbyhadz.com/blog/react-import-image[1]
chuckQu
2022/08/19
1.8K0
React技巧之导入并使用Image
React 安装
实例中我们引入了三个库: react.development.min.js 、react-dom.development.min.js 和 babel.min.js:
陈不成i
2021/07/29
6160
「React 手册 」如何创建函数组件?
大家好,在前面的几篇相关文章里,我们一起学习了如何使用类的方式声明组件,以及如何属性传值和处理本地数据状态,本篇文章我们一起学习如何使用函数的方式进行声明组件。
前端达人
2019/12/30
3.1K0
「React 手册 」如何创建函数组件?
在 hexo 中无痛使用本地图片
1 起因 在 hexo 中使用本地图片是件非常让人纠结的事情,在 markdown 里的图片地址似乎永远无法和最后生成的网页保持一致。 这些问题使得我一度不愿意使用本地图片而选择用图床,但被移动运营商无耻的横条广告逼得打算上 https,图床只支持 http 就成了问题。 hexo 下插入图片现在大概有几个方案 1.1 放在根目录 早期大部分的方案是把图片放在 source/img 下,然后在 markdown 里写 ![img](/source/img/img.png) 。显然这样在本地的编辑器里完全不能
用户1148881
2018/01/15
2.8K0
React基础语法07-点击按钮,获取input框的值(通过事件对象获取)
在this.state里面定义一个空的username:'',并且把把表单输入的值赋值给username。
王小婷
2019/11/10
5.8K0
推荐阅读
相关推荐
从零开始学习React-目录结构,创建组件页面(二)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档