Errcode: 13报错主因是SELinux安全上下文不匹配,而非传统权限问题;即使chown和chmod正确,若/var/lib/mysql或自定义目录(如/data/mysql)上下文非mysqld_db_t,mysqld仍被静默拒绝写入,需用semanage fcontext注册规则并restorecon -Rv修复。

为什么chown和chmod都对了还报Errcode: 13
因为SELinux根本不看ls -l输出的属主和权限,它只认安全上下文(security context)。即使/data/mysql属主是mysql:mysql、权限是755,只要上下文类型不是mysqld_db_t,mysqld进程就会被静默拒绝写入。
典型表现:Can't create/write to file './ibdata1' (Errcode: 13),但ls -ld /data/mysql显示一切正常;audit.log里实际记录的是avc: denied { write } tcontext=system_u:object_r:default_t:s0——说明目标类型是default_t,而非mysqld_db_t。
-
ls -Z /data/mysql查当前上下文,正常应含mysqld_db_t - 临时验证:执行
sudo setenforce 0后systemctl start mysqld若立刻成功,基本坐实是SELinux问题 -
getenforce输出Enforcing,且sestatus | grep "Current mode"显示enforcing,就是它
怎么给新目录打上正确的SELinux标签
不能只用chcon临时改——重启或重装后丢失。必须注册持久规则再批量重标。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 注册规则:
sudo semanage fcontext -a -t mysqld_db_t "/data/mysql(/.*)?"(路径末尾(/.*)?确保子目录也匹配) - 立即生效:
sudo restorecon -Rv /data/mysql(-v显示变更,-R递归) - 如果用了自定义socket路径(如
/data/mysql/mysql.sock),单独加规则:sudo semanage fcontext -a -t mysqld_var_run_t "/data/mysql/mysql\.sock"(点号要转义),再restorecon -v
Docker挂载新目录时为什么还是失败
宿主机上打了标签,但容器启动时没生效——因为Docker默认不透传或重标SELinux上下文。
- 方案一(推荐):宿主机先打标签+
restorecon,再启动容器,确保宿主机目录上下文已是mysqld_db_t - 方案二(运行时):加
:z标签,让Docker自动重标:docker run -v /data/mysql:/var/lib/mysql:z mysql:8.0 - 漏掉
:z或没提前打标签,容器内看到的仍是unconfined_u:object_r:default_t:s0,mysqld照样被拒
非标准端口或临时文件也被拦怎么办
迁移目录常连带改端口(比如port = 3307)或指定tmpdir,这些路径SELinux默认不认。
- 查端口策略:
semanage port -l | grep mysql,若没看到3307,就加:sudo semanage port -a -t mysqld_port_t -p tcp 3307 -
tmpdir设在/mnt/tmp?补规则:sudo semanage fcontext -a -t mysqld_tmp_t "/mnt/tmp(/.*)?",再restorecon -Rv /mnt/tmp - 布尔值也要检查:
getsebool mysqld_can_network为off?远程连不上就开:sudo setsebool -P mysqld_can_network on
SELinux的麻烦不在“关不关”,而在“标不标全”——少一个路径规则,MySQL就在某处卡住,日志里还不明说。得靠ausearch -m avc -ts recent | grep mysqld翻audit日志才能揪出漏网之鱼。

















