[sisyphus] СУПЕРБАГ ?:: LVM + systemd-230-alt1 ; ещё и slapd не стартует

Alexey Shabalin a.shabalin на gmail.com
Чт Июл 7 15:19:38 MSK 2016


23 июня 2016 г., 8:50 пользователь Gleb Kulikov <glebus на asd.iao.ru> написал:
> Коллеги, добрый день
>
> Вот даже и не знаю, заводить баг, или это я один такой везучий?
>
> После обновления на systemd-230-alt1 и 4.4.13-std-def-alt1, система напрочь
> потеряла способность подключать при загрузке разделы LVM.

> где
> /usr, /var, /var/log, /mnt/CONTAINERS и т.п. --- разделы LVM поверх md0:
> Загрузиться система не может.
> После логина рутом в режиме обслуживания и выдачи руками команды
> vgchange -a y
> тома нормально активируются,
> после exit --- возобновляется нормальный процесс загрузки и система входит в
> графику без каких-либо замечаний.

Попытаюсь рассказать, что произошло. Забегая вперед, скажу что это
были проблемы апстрима lvm2 и сборки (т.е. мои).

1) под systemd на раннем этапе загрузки запускаются генераторы из
/lib/systemd/system-generators, для lvm - lvm2-activation-generator.
Раньше в этом генераторе был такой код:
if (!(lvm = lvm_init(NULL))) {
т.е. по сути lvm инициировался из этого генератора. Это маскировало
все последующие проблемы.
Теперь этот код убрали, и генератор занимается только тем, чем должен
- генерацией unit-файлов.

2) генератор создаёт unit-файлы только в случае use_lvmetad = 0, иначе
просто завершает работу. (раньше он успевал еще инициировать lvm, но
как я описал в п.1, теперь он этого не делает)
У нас по-умолчанию use_lvmetad = 1, т.е. должен запуститься сервис lvmetad.

3) в нашем rpm определены _runtimedir как %{_var}/run, соответственно
в lvm2-lvmetad.socket попало значение
ListenStream=/var/run/lvmetad.socket
Дальше получился замкнутый круг - для инициализации lvm нужен lvmetad,
для старта lvmetad нужен сокет в /var/run/,  а /var находится на lvm,
который еще не инициирован. systemd построил зависимости, и понял что
сам не может решить эту проблему.
Кстати, если выставить use_lvmetad = 0, то должно было бы заработать.

В принципе, основное решение, это определение в спеке lvm2
%define _runtimedir /run
%define _lockdir /run/lock
Теперь lvmetad ничего не мешает запуститься и все работает как ожидается.

Выводов можно придумать множество. Один из - скорейшее мигрирование
/var/run -> /run

-- 
Alexey Shabalin


Подробная информация о списке рассылки Sisyphus