Gre*_*een 5 filesystem mysql permissions
我真的不明白所有这些特权在 Linux 中是如何工作的。
要启动 MySQL 服务器mysqld
程序,必须将其.pid
文件写入/var/run/mysqld/
目录。但我们从FHS(文件系统层次结构标准)得知:
在启动过程开始时,必须清除(根据需要删除或截断)此目录下的文件。
所以每次MySQL服务器启动时都mysqld
必须在下面创建/mysqld
目录。/var/run/
的所有者和组/var
是root
并且/var
是:
drwxr-xr-x 13 root root 4096 may 20 23:41 var.
Run Code Online (Sandbox Code Playgroud)
我们还从 FHS(文件系统层次结构标准)得知:
/var/run 对于非特权用户(root 或运行守护程序的用户)应该是不可写的;如果任何用户可以在该目录中写入,这将是一个主要的安全问题。
所以mysqld
无法写入该目录。事实上,当我运行mysqld
启动 MySQL 服务器时,我总是收到错误:
user@user-desktop:~$ sudo mysqld --console
130720 23:43:02 [ERROR] Can't start server : Bind on unix socket: Permission denied
130720 23:43:02 [ERROR] Do you already have another mysqld server running on socket: /var/run/mysqld/mysqld.sock ?
130720 23:43:02 [ERROR] Aborting
Run Code Online (Sandbox Code Playgroud)
问题是:如果标准禁止打开该目录进行写入,mysqld
如何写入.pid
文件?/var/run/mysqld/
这是一个明显的矛盾,不是吗?
我的问题是:如何在不更改目录权限的情况mysqld
下创建和写入文件?目前我看到唯一的方法:/var/run/mysqld/
/var/run
user@user-desktop:$ sudo chmod a+w /var
Run Code Online (Sandbox Code Playgroud)
但这是标准所禁止的。
/var/run 对于非特权用户来说应该是不可写的,这意味着 root 和 sudo 帐户(因为这些是特权用户)可以对其进行写入。
MySQL 的 upstart 脚本以 root 身份启动,然后可以在/var/run
. 该文件是使用配置中设置的权限创建的。这应该是/etc/my.cnf
这样的:
[mysqld]
user = mysql
socket = /var/lib/mysql/mysql.sock
Run Code Online (Sandbox Code Playgroud)
在安装 MySQL 服务器之后,您应该有与 mysql 相关的内容,/etc/init.d
我得到:
您确定没有安装MySQL客户端吗?
(服务器版本:WSL2 中的 5.7.28-0ubuntu0.18.04.4 (Ubuntu))
Apparmor 保存控制其他文件权限的系统二进制文件。在第一次成功连接到 mysqld 服务器之前,我在“允许 pid、socket、socket 锁定文件访问”下添加了这一行,之后我将其删除,并且仍然可以第二次连接。
~$ sudo nano /etc/apparmor.d/usr.sbin.mysqld
Run Code Online (Sandbox Code Playgroud)
/run/mysqld/*, rwx
Run Code Online (Sandbox Code Playgroud)
~$ sudo service apparmor reload
Run Code Online (Sandbox Code Playgroud)
在此之前,我遇到了一些其他错误...必须更改在安装时自动创建的 /mysqld-files/ 文件夹的所有权和权限。然后将此选项添加到配置文件中,该文件默认设置为 null,这意味着服务器禁用导入和导出操作:
~$ sudo chown <username> /var/lib/mysql-files/ && chmod 750 /var/lib/mysql-files/
~$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Run Code Online (Sandbox Code Playgroud)
secure_file_priv = /var/lib/mysql-files
Run Code Online (Sandbox Code Playgroud)
我还必须添加这个,因为错误然后告诉我:
explicit_defaults_for_timestamp = ON
Run Code Online (Sandbox Code Playgroud)
在 WSL 中,您不必初始化 mysql。发生在安装时(/var/lib/mysql/ 中的初始化内容)。这样我们就可以直接登录了。如果我不在登录命令开头写入 sudo,则“错误 1698 (28000):用户 'root'@'localhost' 的访问被拒绝”:
~$ sudo service mysql start
~$ sudo mysql -u root -p
Enter Password: [just ENTER]
Run Code Online (Sandbox Code Playgroud)
然后最后修复“无目录,使用 HOME=/ 登录”:
~$ sudo service mysql stop
~$ sudo usermod -d /var/lib/mysql/ mysql
Run Code Online (Sandbox Code Playgroud)
ps 在编辑配置文件之前始终复制一份,并更改 std 端口 3306,并搜索手册。