我正在使用 chef 在 Ubuntu 16.04 上安装默认mysql-server
软件包。我在一台没有现有 MySQL 安装的服务器上执行此操作,但是做已经/var/lib/mysql
设置为已安装的驱动器。
因此,其中/var/lib/mysql
有一个目录。lost+found
如果我使用非常基本的 chef 安装 MySQL:
package 'mysql-server'
当/var/lib/mysql/lost+found
存在时,我收到一个错误:
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
invoke-rc.d: initscript mysql, action "start" failed.
dpkg: error processing package mysql-server-5.7 (--configure):
subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of mysql-server:
mysql-server depends on mysql-server-5.7; however:
Package mysql-server-5.7 is not configured yet.
dpkg: error processing package mysql-server (--configure):
dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while processing:
mysql-server-5.7
mysql-server
E: Sub-process /usr/bin/dpkg returned an error code (1)
(如果我只是 ,也会发生此错误apt-get install mysql-server
。)
但是,如果我lost+found
在安装之前删除该目录,一切都会正常工作。
我想象mysql 的安装过程会假设lost+found
目录实际上是一个数据库,并尝试在安装过程中升级它,或者做一些同样奇怪的事情。
我现在已经解决了这个问题(并且也向自己证明了lost+found
目录肯定是原因),方法是lost+found
在安装之前删除它,然后重新创建它:
directory '/var/lib/mysql/lost+found' do
action :delete
end
package 'mysql-server'
package 'mysql-client'
execute 'mklost+found' do
command 'mklost+found'
cwd '/var/lib/mysql'
end
这很好,但我相信专家可能会在标准 Kludge-o-Rama 量表上给它打 8.2 左右的分数。
当 /var/lib/mysql 已设置为挂载驱动器时,是否有更好的方法使用 chef 在 Ubuntu 上执行 MySQL 服务器的基本包默认安装?
答案1
是的,这是由于(a)存在/var/lib/mysql/lost+found
,(b)这部分造成的/var/lib/dpkg/info/mysql-server-5.7.postinst
:
216 # If database doesn't exist we create it.
217 if [ ! "$(ls -A "${mysql_statedir}")" ] && [ -d "${mysql_filesdir}" ]; then
218 existingdatabase=0
其中mysql_statedir
是/var/lib/mysql
,以及(c)Ubuntu 的(Debian 的)脑死亡政策在包安装(但可能未配置)时启动服务。
因此mysql启动失败:
Job for mysql.service failed because the control process exited with error code. See "systemctl status mysql.service" and "journalctl -xe" for details.
invoke-rc.d: initscript mysql, action "start" failed.
导致 dpkg 出错。
因此,你通过使 (a) 为假来修复它。让我们看看如何使 (b) 或 (c) 为假。
/var/lib/mysql
对于 (b),您可以提交错误报告,指出 /var/lib/dpkg/info/mysql-server-5.7.postinst 的第 217 行在单独的文件系统中不是最佳的,因此它包含lost+found
。也许它会得到修复。
对于 (c),您可以说服 Ubuntu 的权威人士,在安装软件包时启动服务不是一个好主意。他们的反驳是:使用 policy-rc.d。那会怎样?
创建一个/usr/sbin/policy-rc.d
文件,该文件在初始化脚本执行时不执行任何操作,只返回 0。mysql-server
请参阅invoker.d 规范。但是,脚本的其他部分依赖于 mysql 的实际启动。返回的正确代码不是 0;也许是 101?。但是,任何非零返回代码都会导致您现在遇到的相同结果。所以 policy-rc.d 对您没有帮助。/耸耸肩
我希望我已经让你相信你的解决方案是最好的。