Я использую Chef для установки по умолчанию mysql-server
пакет в Ubuntu 16.04. Я делаю это на сервере, на котором нет установленной MySQL, но делает иметь /var/lib/mysql
Настроил уже, как навесной диск.
Таким образом, /var/lib/mysql
имеет lost+found
каталог в нем.
Если я установлю 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
Это работает нормально, но я полагаю, что эксперты, вероятно, оценили бы его примерно на 8,2 по стандартной шкале Клудж-о-Рамы.
Есть ли лучший способ выполнить базовую установку MySQL Server по умолчанию в пакете на Ubuntu с помощью chef, когда / var / lib / mysql уже настроен как смонтированный диск?
Да, это вызвано (а) существованием /var/lib/mysql/lost+found
, (б) эта часть /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.
Итак, вы исправили это, сделав (а) ложным. Давайте посмотрим, как вы можете сделать (b) или (c) ложным.
Для (b) вы можете отправить отчет об ошибке, в котором говорится, что строка 217 /var/lib/dpkg/info/mysql-server-5.7.postinst неоптимальна, когда /var/lib/mysql
это отдельная файловая система, поэтому она содержит lost+found
. Может быть, это исправят.
Для (c) вы можете убедить власть имущих в Ubuntu, что запуск служб при установке пакета - плохая идея. Их ответ будет такой: используйте policy-rc.d. Как бы это было?
Создать /usr/sbin/policy-rc.d
файл, который ничего не делает, кроме возврата 0, когда сценарий инициализации mysql-server
. Увидеть invokerc.d spec. Однако есть другие части скрипта, которые зависят от фактического запуска mysql. Правильный код для возврата не равен 0; может 101 ?. Однако любой ненулевой код возврата приведет к тому же результату, что и сейчас. Так что policy-rc.d вам не поможет. / пожимать плечами
Надеюсь, я убедил вас, что ваше решение является лучшим.