Laravel Homestead设置MySQL general_log_file到共享文件夹权限报错如何解决
问题根源
你遇到的OS errno 13 - Permission denied错误和secure_file_priv配置无关,给mysql用户授予root权限不仅解决不了问题,还会带来极大的安全隐患,必须先回滚该操作。
报错的核心原因有两个:
/home/vagrant/code是Vagrant挂载到虚拟机的Windows共享目录,默认挂载权限不允许mysql系统用户写入- Ubuntu系统默认启用的AppArmor强制访问控制模块,对mysqld进程的可读写路径做了白名单限制,共享目录不在默认白名单内,哪怕文件权限设为777也会被拦截。
解决步骤
1. 回滚mysql用户的root权限
在虚拟机终端执行以下命令,移除mysql用户的超额权限:
sudo deluser mysql sudo sudo rm -f /etc/sudoers.d/mysql
2. 调整共享目录挂载参数
在你本地Windows的Homestead配置目录下,编辑Homestead.yaml文件,找到folders配置段,给code目录的挂载项补充权限参数:
folders: - map: 【替换为你本地Windows存放代码的实际路径】 to: /home/vagrant/code options: dmode: 775 fmode: 664 uid: 111 gid: 113
注:Homestead环境默认mysql用户的uid为111、mysql组的gid为113,你可以在虚拟机执行
id mysql确认数值,如果和默认值不一致,替换为实际查询到的结果即可。
配置修改完成后,在本地Homestead目录执行命令重载虚拟机:
vagrant reload --provision
3. 修改AppArmor规则放开MySQL的路径权限
虚拟机重载完成后,ssh登录进虚拟机,执行以下操作:
- 编辑AppArmor的MySQL服务规则文件:
sudo vi /etc/apparmor.d/usr.sbin.mysqld
- 在文件的规则段中,添加两行共享目录的读写权限配置:
/home/vagrant/code/ rw, /home/vagrant/code/mysql.log rw,
- 保存退出后,重载AppArmor规则让配置生效:
sudo systemctl reload apparmor
4. 验证日志功能
登录MySQL,重新执行日志开启命令:
SET GLOBAL general_log_file = '/home/vagrant/code/mysql.log'; SET GLOBAL general_log = 'ON';
执行后不会再报权限错误,你可以直接在Windows本地的代码共享目录中看到实时更新的mysql.log通用查询日志文件。
内容的提问来源于stack exchange,提问作者dgshahr
相关产品推荐
相关产品推荐

