我正在尝试让安装有 macports 的 MySQL 使用存储在受 FileVault 保护的主目录中的数据目录。
我使用sudo cp -a /opt/local/var/db/mysql5 ~/db/
(-a
以确保文件权限保持完整),然后用软链接替换原始的 mysql5 目录:sudo ln -s ~/db/mysql5 /opt/local/var/db/mysql5
但是,当我尝试启动 MySQL 时,它失败了。它至少会跟随软链接,以至于修改目录中的某些文件~/db/mysql5
,尤其是附加到其中的错误日志:
110108 15:33:08 mysqld_safe Starting mysqld daemon with databases from /opt/local/var/db/mysql5
110108 15:33:08 [Warning] '--skip-locking' is deprecated and will be removed in a future release. Please use '--skip-external-locking' instead.
110108 15:33:08 [Warning] '--log_slow_queries' is deprecated and will be removed in a future release. Please use ''--slow_query_log'/'--slow_query_log_file'' instead.
110108 15:33:08 [Warning] '--default-character-set' is deprecated and will be removed in a future release. Please use '--character-set-server' instead.
110108 15:33:08 [Warning] Setting lower_case_table_names=2 because file system for /opt/local/var/db/mysql5/ is case insensitive
110108 15:33:08 [Note] Plugin 'FEDERATED' is disabled.
110108 15:33:08 [Note] Plugin 'ndbcluster' is disabled.
/opt/local/libexec/mysqld: Table 'mysql.plugin' doesn't exist
110108 15:33:08 [ERROR] Can't open the mysql.plugin table. Please run mysql_upgrade to create it.
110108 15:33:09 InnoDB: Started; log sequence number 4 1596664332
110108 15:33:09 [ERROR] /opt/local/libexec/mysqld: Can't create/write to file '/opt/local/var/db/mysql5/mac.local.pid' (Errcode: 13)
110108 15:33:09 [ERROR] Can't start server: can't create PID file: Permission denied
110108 15:33:09 mysqld_safe mysqld from pid file /opt/local/var/db/mysql5/gPod.local.pid ended
我不明白为什么 MySQL 无法创建该pid
文件,因为使用_mysql
用户手动创建该文件成功(sudo -u _mysql touch mac.local.pid
从内部~/db/mysql5
)
有什么想法可以解决这个问题吗?
答案1
我评论过你的一个类似问题,因为我认为有更好的方法以加密状态存储 MySQL 数据。
这听起来像是权限问题。FileVault 在您的主文件夹中设置权限rwx------
(即所有者可以读取、写入和执行,但组和其他用户没有权限),而不是rwxr-xr-x
典型文件夹的默认权限。
这里起作用的因素是执行权限允许用户搜索(即遍历)文件夹。因此,当_mysql
用户调用mysqld
并跟随符号链接时,它会尝试遍历您的主文件夹,从而导致阻塞。它会mysqld_safe
使用调用它的用户的权限将错误消息写入日志(如果mysqld_safe
使用 MacPorts 启动脚本sudo /path/to/mysqld_safe
或类似脚本启动,则可能是 root 用户)。
您可以通过按顺序运行以下命令来测试此假设:
$ cd ~/db/mysql5/
$ sudo -u _mysql touch mac.local.pid
应该会成功,因为不涉及遍历,并且
$ sudo -u _mysql touch ~/db/mysql5/mac.local.pid
$ sudo -u _mysql touch /Users/[username]/db/mysql5/mac.local.pid
两者都失败了,但是
$ sudo -u _mysql touch ../mac.local.pid
可能会成功,因为~/db/
可能具有前面提到的更宽松的默认文件夹权限。
一个简单的解决方案是将你的主文件夹上的组设置为_mysql
,并授予该组搜索你的主文件夹的权限:
$ sudo chown :_mysql ~
$ chmod g=x ~
但这严重的安全后果。任何以_mysql
用户身份(可能通过 MySQL 中的漏洞)的人都可以导航到您的主文件夹并根据其权限操作文件和文件夹,默认情况下rwxr-xr-x
文件夹和rw-r--r--
文件。如前所述,这包括~/db/
和任何用户创建的文件夹或文件,以及和~/Public/
。~/Sites/
即使攻击者无法直接获取主文件夹中的文件列表,也有很多常见文件可供读取,并且有很多方法可以使用它们来收集有关周围其他内容的数据。(.bash_history
突然想到。)
答案2
Tait Lewis 很好地解释了执行权限的问题。然而,对真实用户帐户执行此操作既存在安全风险,也可能会阻止其他staff
组成员的合法执行。
我解决同样问题的方法如下:
- 创建一个新的标准用户帐户(在本例中我们将其称为
db
),并为其启用 FileVault。使用至少与主要用户一样强的密码。 - 以主用户身份登录后,运行以下命令:
- 挂载 db 用户的 FileVault 映像,但不使其在 Finder 中可浏览:
sudo hdiutil attach /Users/db/db.sparsebundle -owners on -mountpoint /Users/db -nobrowse
- 修复权限,以便
_mysql
用户可以执行 db 用户的主目录:
sudo chown :_mysql /Users/db; sudo chmod g=x /Users/db
- 关闭 MySQL:
sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper stop
- 将 MySQL 文件复制到 FileVault:
sudo cp -a /opt/local/var/db/mysql5 /Users/db/
/
(后面不要添加mysql5
)
现在您可以删除、安全删除或者只是重命名该
/opt/local/var/db/mysql5
目录。接下来创建软链接:
sudo ln -s /Users/db/mysql5 /opt/local/var/db/mysql5
- 最后,再次启动MySQL:
sudo /opt/local/etc/LaunchDaemons/org.macports.mysql5/mysql5.wrapper start
请注意,每次重新启动 Mac 时,您都需要挂载映像(使用命令sudo hdiutil ...
)并手动启动 MySQL,因为当 launchd 在挂载映像之前尝试自动启动它时,它将无法挂载。
答案3
首先,如果你还没有这样做,请务必验证你的 MySQL 版本是否支持相关表的符号链接。根据这篇 2008 年的文章,当时仅 MyISAM 表支持符号链接,并且“对于其他存储引擎的表使用的文件,如果您尝试使用符号链接,可能会遇到奇怪的问题。”
一旦你确信你的 MySQL 版本应该支持你正在做的事情,请仔细检查你试图mysqld_safe
以哪个用户身份启动,并将其与 上的权限进行比较/opt/local/var/db/mysql5/
。由于你使用了cp -a
,所以目录很可能是 _mysql 用户拥有并可写的(这就是它在你 时可以工作的原因sudo -u _mysql touch...
),但是当你试图从你的普通用户帐户启动 MySQL 时会失败(这不是 _mysql ,因此,没有对该目录的写权限)。
答案4
这可能有些牵强,但如果您软链接到单独的分区,则始终可以在软链接点挂载该分区,然后在通常挂载它的位置进行软链接。