共计 4151 个字符,预计需要花费 11 分钟才能阅读完成。
前言
SELinux 是什么
平安增强型 Linux(SELinux)是一种采纳平安架构的 Linux® 零碎,它可能让管理员更好地管控哪些人能够拜访零碎。它最后是作为 Linux 内核的一系列补丁,由美国国家安全局(NSA)利用 Linux 平安模块(LSM)开发而成。
SELinux 工作原理
SELinux 定义了每个人对系统上的利用、过程和文件的访问控制。利用安全策略(一组告知 SELinux 哪些能拜访,哪些不能拜访的规定)来强制执行策略所容许的拜访。
当利用或过程(称为主体)收回拜访对象(如文件)的申请时,SELinux 会查看拜访向量缓存(AVC),其中缓存有主体和对象的拜访权限。
开启 SELinux 能够晋升零碎的安全性,但同时也会带来一些问题。在特定场景有的人会抉择敞开 SELinux 以换取更好的兼容性。
在 GreatSQL 的装置手册里,就有敞开 SELinux 这一步。
# 敞开 selinux
$ setenforce 0
$ sed -i '/^SELINUX=/c'SELINUX=disabled /etc/selinux/config
不禁让人好奇,这个 SELinux 平安模块,如果不敞开会产生什么问题,在应用时有哪些须要留神的中央。于是我特意尝试了一下,看看会呈现哪些问题。
问题发现
为了发现问题,我特意抉择在用户目录(/root)下载、加压 GreatSQL 二进制压缩包,而后再挪动到指定目录应用。
cd /root
wegt https://***.***/greatsql.tar.gz
tar -xvf greatsql.tar.gz
mv /root/greatsql /usr/local/
装置过程一切顺利,数据库失常启动了,然而在配置 systemd
过程守护的时候呈现了问题。
greatsql.service 文件:
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
启动数据库的时候报错以下谬误。
[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 的状态和相干日志
[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.
通过查看上述信息,能够得悉 程序启动的时候抛出了报错。
Main PID: 147226 (code=exited, status=203/EXEC)
通过上网收索能够得悉,status=203/EXEC
报错可能和权限有余无关, 记一下这里的 PID。
咱们持续查看一下相干日志证实一下。
[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]: greatsql.service: Failed to execute command: Permission denied
Jan 10 17:00:36 gip systemd[13386]: greatsql.service: Failed at step EXEC spawning /usr/local/greatsql/bin/mysqld: Permission denied
能够看到的确是权限有余。
然而奇怪的事件来了,通过查看文件权限发现权限并没有问题。
[root@GreatSQL bin]# ls -lah |grep mysql
-rwxr-xr-x. 1 root root 6.9M 4 月 29 2022 mysql
-rwxr-xr-x. 1 root root 6.8M 4 月 29 2022 mysqladmin
-rwxr-xr-x. 1 root root 7.1M 4 月 29 2022 mysqlbinlog
-rwxr-xr-x. 1 root root 6.8M 4 月 29 2022 mysqlcheck
-rwxr-xr-x. 1 root root 6.3K 4 月 29 2022 mysqld_pre_systemd
-rwxr-xr-x. 1 root root 34K 4 月 29 2022 mysqld_safe
-rwxr-xr-x. 1 root root 6.9M 4 月 29 2022 mysqldump
-rwxr-xr-x. 1 root root 1.7K 4 月 29 2022 mysqldumpslow
*** 后省略 ***
即使把权限改成 755,甚至 777 也还是会报一样的谬误。
chown -R mysql:mysql /usr/local/mysql
chmod 755 -R /usr/local/mysql
问题起因
前面我有查看了所有相干文件的权限,都没问题,然而程序还是会报权限有余。
在网上翻阅了材料,发现了问题产生起因。
是 SELinux 的问题,因为我的二进制文件是先下载到 /root
目录,而后才移到 /usr/local/greatsql
目录,从 /root
目录挪动到 /usr/local/
目录时它们的 SELinux 上下文不会主动变更,仍然是用户主目录。所以呈现了权限问题。
解决办法:
# 复原文件的平安上下文
restorecon -rv /usr/local/greatsql
总结
可执行文件是先寄存在用户目录,而后挪动到别的目录。文件的 SELinux 上下文不会主动变更,仍然是用户目录。
这就导致了, 能间接运行,然而通过 systemd 启动时依然报 Permission denied 权限有余的问题。
解决办法就是用 restorecon 命令用来复原 SELinux 文件属性
restorecon -rv 目标目录
相干链接:
解决文件权限正确,但 systemd 服务依然提醒没有权限,启动失败。
一文带你看懂 SELinux 是什么? (redhat.com)
Enjoy GreatSQL :)
对于 GreatSQL
GreatSQL 是由万里数据库保护的 MySQL 分支,专一于晋升 MGR 可靠性及性能,反对 InnoDB 并行查问个性,是实用于金融级利用的 MySQL 分支版本。
相干链接:GreatSQL 社区 Gitee GitHub Bilibili
GreatSQL 社区:
社区博客有奖征稿详情:https://greatsql.cn/thread-10…
技术交换群:
微信:扫码增加
GreatSQL 社区助手
微信好友,发送验证信息加群
。