![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Тов. Lennart Poettering в частности, и авторы systemd в целом, не понимают значение слова "совместимость".
Иначе бы они не сделали свою новую прекрасную систему инициализации так, что онане способна выполнять старые добрые init-скрипты спотыкается на малейшем отступлении от выдуманного её авторами жёсткого шаблона.
Цитата вот отсюда: For compatibility with SysV we not only support our own configuration files for services, but also are able to read classic SysV init scripts, in particular we parse the LSB header, if it exists. /etc/init.d is hence not much more than just another source of configuration.
В переводе на человеческий язык - мы тут написали программу, которая парсит скрипты инициализации и пытается воспринимать их как сервисные описания для нашей супер-мега-системы. Нет, просто запускать скрипты инициализации в нужный момент нам религия не позволяет, это было бы слишком легко.
У-у-у! Школота линуксовая!
Длинная версия истории для заинтересованной публики приведена ниже.
Налаживаю высокодоступный кластер DB2 под Linux. Дистрибутив CentOS 7 (сиречь тот же RedHat, но с другим бантиком).
Поставил Tivoli SA MP, как кластер-менеджер. Он для DB2 штатный и единственно поддерживаемый, игрища со сторонними кластер-менеджерами я оставил на потом.
Настроил два экземпляра DB2, создал основную базу, создал резервную базу, настроил передачу и проигрывание транзакций на резервной базе.
Настроил TSAMP, добавил виртуальный IP-адрес, добавил базу под управление TSAMP.
Прогнал нагрузочный тест - всё работает, по команде поменял узлы ролями - переключились, IP-адрес переехал куда надо, приложение переподключилось.
Перезагрузил узел с основной базой. Тадам! Резерв с готовностью стал основным, на прежнем основном не поднялись кластерные сервисы и, соответственно, не стартовал экземпляр DB2 и база.
Стал разбираться. TSAMP - софт достаточно древний, запуск-остановка на старомодных SysV init-скриптах.
Запускаешь эти скрипты руками, что называется, напрямую - все стартует и успешно работает.
Пытаешься запускать утилитой service - также стартует, опять-таки нормально работает.
А вот при загрузке сервера - индейский фигвам получается, не стартует.
Стал разбираться дальше. Включил отладку systemd, получил прекрасное:
Игнонирует он, понимаешь! Просто игнорирует!
Дальнейшее расследование показало, что при просмотре перечня файлов в каталоге сервисных скриптов прекрасный systemd использует следующую пару проверок (цитата вот отсюда, см. функцию enumerate_sysv):
Говоря по-простому, "годными" считаются исключительно файлы, причём имеющие для владельца разрешение на выполнение.
Как нетрудно догадаться, TSAMP размещает в /etc/init.d сылки на реальные скрипты, которые спокойненько лежат в его собственном каталоге инсталляции.
Думаю, что найти реализацию SysV init, которая не разрешала бы размещать в /etc/init.d символьные ссылки, никому не удастся, так что systemd здесь сумел проявить свою несомненную оригинальность.
Решение проблемы: скопировать из каталога инсталляции TSAMP скрипты в каталог инициализации /etc/init.d (заменив ими ссылки, которые там размещает инсталлятор TSAMP).
Скрипт для решения проблемы:
Иначе бы они не сделали свою новую прекрасную систему инициализации так, что она
Цитата вот отсюда: For compatibility with SysV we not only support our own configuration files for services, but also are able to read classic SysV init scripts, in particular we parse the LSB header, if it exists. /etc/init.d is hence not much more than just another source of configuration.
В переводе на человеческий язык - мы тут написали программу, которая парсит скрипты инициализации и пытается воспринимать их как сервисные описания для нашей супер-мега-системы. Нет, просто запускать скрипты инициализации в нужный момент нам религия не позволяет, это было бы слишком легко.
У-у-у! Школота линуксовая!
Длинная версия истории для заинтересованной публики приведена ниже.
Налаживаю высокодоступный кластер DB2 под Linux. Дистрибутив CentOS 7 (сиречь тот же RedHat, но с другим бантиком).
Поставил Tivoli SA MP, как кластер-менеджер. Он для DB2 штатный и единственно поддерживаемый, игрища со сторонними кластер-менеджерами я оставил на потом.
Настроил два экземпляра DB2, создал основную базу, создал резервную базу, настроил передачу и проигрывание транзакций на резервной базе.
Настроил TSAMP, добавил виртуальный IP-адрес, добавил базу под управление TSAMP.
Прогнал нагрузочный тест - всё работает, по команде поменял узлы ролями - переключились, IP-адрес переехал куда надо, приложение переподключилось.
Перезагрузил узел с основной базой. Тадам! Резерв с готовностью стал основным, на прежнем основном не поднялись кластерные сервисы и, соответственно, не стартовал экземпляр DB2 и база.
Стал разбираться. TSAMP - софт достаточно древний, запуск-остановка на старомодных SysV init-скриптах.
Запускаешь эти скрипты руками, что называется, напрямую - все стартует и успешно работает.
Пытаешься запускать утилитой service - также стартует, опять-таки нормально работает.
А вот при загрузке сервера - индейский фигвам получается, не стартует.
Стал разбираться дальше. Включил отладку systemd, получил прекрасное:
systemd-sysv-generator[548]: Ignoring S13ctrmc symlink in rc3.d, not generating ctrmc.service. systemd-sysv-generator[548]: Ignoring S31cthats symlink in rc3.d, not generating cthats.service. systemd-sysv-generator[548]: Ignoring S32cthags symlink in rc3.d, not generating cthags.service.
Игнонирует он, понимаешь! Просто игнорирует!
Дальнейшее расследование показало, что при просмотре перечня файлов в каталоге сервисных скриптов прекрасный systemd использует следующую пару проверок (цитата вот отсюда, см. функцию enumerate_sysv):
if (!(st.st_mode & S_IXUSR)) continue; if (!S_ISREG(st.st_mode)) continue;
Говоря по-простому, "годными" считаются исключительно файлы, причём имеющие для владельца разрешение на выполнение.
Как нетрудно догадаться, TSAMP размещает в /etc/init.d сылки на реальные скрипты, которые спокойненько лежат в его собственном каталоге инсталляции.
Думаю, что найти реализацию SysV init, которая не разрешала бы размещать в /etc/init.d символьные ссылки, никому не удастся, так что systemd здесь сумел проявить свою несомненную оригинальность.
Решение проблемы: скопировать из каталога инсталляции TSAMP скрипты в каталог инициализации /etc/init.d (заменив ими ссылки, которые там размещает инсталлятор TSAMP).
Скрипт для решения проблемы:
sudo su cd /etc/init.d mkdir backup mv cthags backup/ mv cthats backup/ mv ctrmc backup/ cp /usr/sbin/rsct/bin/rc_ctrmc_rh ctrmc cp /usr/sbin/rsct/bin/rc.cthats_rh cthats cp /usr/sbin/rsct/bin/rc.cthags_rh cthags