Summary: | Отсутствие указания уровней запуска для сервисов в init скриптах | ||||||
---|---|---|---|---|---|---|---|
Product: | Sisyphus | Reporter: | Сергей Котляров <shadowsbrother> | ||||
Component: | cross-component | Assignee: | Dmitry V. Levin <ldv> | ||||
Status: | NEW --- | QA Contact: | Dmitry V. Levin <ldv> | ||||
Severity: | normal | ||||||
Priority: | P3 | CC: | antohami, diablopc, lav, mike, zxwarior | ||||
Version: | unstable | Keywords: | METABUG | ||||
Hardware: | all | ||||||
OS: | Linux | ||||||
URL: | http://www.opennet.ru/openforum/vsluhforumID3/117762.html#94 | ||||||
Attachments: |
|
Description
Сергей Котляров
2019-07-02 13:04:00 MSK
Поясню коротко. В mkimage-profiles для включения init-скриптов используется команда chkconfig <daemon> on которая включает init-скрипты на runlevel со 2 по 5. Что далеко не для всех хорошо. Например, NetworkManager запускается из-за этого на 2 runlevel, на несетевом runlevel. Для того, чтобы использовать вместо chkconfig <daemon> on например, команду chkconfig --add <daemon> Т.е. запускать только на тех runlevel, которые прописаны в скриптах, необходимо, чтобы во всех init-скриптах были прописаны дефолтные runlevel. init-скрипты, у которых runlevel не прописаны, просто не включатся. На данный момент chkconfig <daemon> on меньшее зло. После исправления init-скриптов, можно задуматься о переходе в mkimage-profiles. А пока этим метабагом оценим масштаб проблемы. (In reply to comment #0) > Список пакетов, в init скриптах которых не указаны уровни запуска Зачастую это делается специально, чтобы скрипты не запускались сами собой в результате установки пакета. Раньше перечень служб, которые следует включать по окончании инсталяции операционной системы, был частью профиля установки. (В ответ на комментарий №2) > (In reply to comment #0) > > Список пакетов, в init скриптах которых не указаны уровни запуска > > Зачастую это делается специально, чтобы скрипты не запускались сами собой в > результате установки пакета. --add|reset не умеют запускать скрипты. Они только устанавливают|сбрасывают в дефолт. К тому же, если LSB-хидер с Default-Start|Stop: отсутствует, при наличии 'chkconfig: -', то --add|reset не сможет установить|сбросить Start|Kill дефолт, установив всё в Kill. А chkconfig <service> on сломает спецификацию на runlevel в альтах: https://book.linuxfromscratch.org.ru/systemv/chapter07/usage.html По которой сетевым инит-скриптам запрещено запускаться в runlevel 2 на системах System V. Список инит-скриптов не содержащих LSB-хидер с Default-Start|Stop:, но содержащих 'chkconfig: -': $ find $(grep 'chkconfig: -' /etc/rc.d/init.d/* | \ > awk -F ':' '{print $1}') -exec \ > grep -H -E -o -c 'Default-Start:' {} \; | grep :0 /etc/rc.d/init.d/alteratord:0 /etc/rc.d/init.d/dnsmasq:0 /etc/rc.d/init.d/ethtool:0 /etc/rc.d/init.d/hddtemp:0 /etc/rc.d/init.d/iptables:0 /etc/rc.d/init.d/multipathd:0 /etc/rc.d/init.d/nfslock:0 /etc/rc.d/init.d/osspd:0 /etc/rc.d/init.d/rawdevices:0 /etc/rc.d/init.d/template:0 /etc/rc.d/init.d/xl2tpd:0 Что будет на --add|reset: # chkconfig --list alteratord alteratord 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл # chkconfig --del alteratord # chkconfig --add alteratord # chkconfig --list alteratord alteratord 0:выкл 1:выкл 2:выкл 3:выкл 4:выкл 5:выкл 6:выкл # chkconfig --del alteratord # chkconfig alteratord on # chkconfig --list alteratord alteratord 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл # chkconfig alteratord reset # chkconfig --list alteratord alteratord 0:выкл 1:выкл 2:выкл 3:выкл 4:выкл 5:выкл 6:выкл Например сервис NM через on включать нельзя, иначе это гарантированно сломает правильный Start|Kill на runlevel -ах: # grep 'chkconfig:\|Default-St' /etc/init.d/NetworkManager # chkconfig: - 12 90 # Default-Start: 3 4 5 # Default-Stop: 0 1 6 Точно так же, on гарантированно сломает и network: # grep 'chkconfig:\|Default-St' /etc/init.d/network # chkconfig: 345 10 90 # Default-Start: 3 4 5 # Default-Stop: 0 1 2 6 посадив Start на уровни 2345 по-умолчанию для on. Вместо явно и правильно указанных. (In reply to comment #3) > (В ответ на комментарий №2) > > (In reply to comment #0) > > > Список пакетов, в init скриптах которых не указаны уровни запуска > > > > Зачастую это делается специально, чтобы скрипты не запускались сами собой в > > результате установки пакета. > > --add|reset не умеют запускать скрипты. Они только устанавливают|сбрасывают в > дефолт. При следующей загрузке это приводит к запуску скриптов. > chkconfig <service> on Если нужно явно указать runlevel, то у chkconfig есть параметр --level. > сломает спецификацию на runlevel в альтах: > https://book.linuxfromscratch.org.ru/systemv/chapter07/usage.html > По которой сетевым инит-скриптам запрещено запускаться в runlevel 2 runlevel 2 остался только в спецификациях. (В ответ на комментарий №4) > Если нужно явно указать runlevel, то у chkconfig есть параметр --level. Да. Но проблема в том, что в mkimage-profiles указывать runlevel сейчас нельзя. Но, видимо, выход как раз в том, чтобы такую возможность реализовать... (В ответ на комментарий №4) > > сломает спецификацию на runlevel в альтах: > > https://book.linuxfromscratch.org.ru/systemv/chapter07/usage.html > > По которой сетевым инит-скриптам запрещено запускаться в runlevel 2 > > runlevel 2 остался только в спецификациях. Заголовок инит-скрипта требует одного запуска, а система делает совсем по-другому и запускает инит-скрипт на том runlevel, на котором скрипт не должен быть запущен. > runlevel 2 остался только в спецификациях. Этот вопрос хотелось бы прояснить: Т.е. altlinux не придерживается спецификаций? (В ответ на комментарий №6) > (В ответ на комментарий №4) > > > сломает спецификацию на runlevel в альтах: > > > https://book.linuxfromscratch.org.ru/systemv/chapter07/usage.html > > > По которой сетевым инит-скриптам запрещено запускаться в runlevel 2 > > > > runlevel 2 остался только в спецификациях. > > Заголовок инит-скрипта требует одного запуска, а система делает совсем > по-другому и запускает инит-скрипт на том runlevel, на котором скрипт не должен > быть запущен. > Почему сервис NetworkManager запускается в 'runlevel 2', вопрос риторический: # chkconfig NetworkManager off # chkconfig NetworkManager on # chkconfig --list NetworkManager NetworkManager 0:выкл 1:выкл 2:вкл 3:вкл 4:вкл 5:вкл 6:выкл И правильно он будет запускаться только через --add|reset: (при явно указанных в LSB-хидере runlevel, которые устанавливаются|линкуются, или указанием runlevel в chkconfig:, или указанием runlevel в Default-St* в LSB-хидере) # chkconfig NetworkManager off # grep 'chkconfig:\|Default-St' /etc/init.d/NetworkManager # chkconfig: - 12 90 # Default-Start: 3 4 5 # Default-Stop: 0 1 6 # chkconfig NetworkManager reset # chkconfig --list NetworkManager NetworkManager 0:выкл 1:выкл 2:выкл 3:вкл 4:вкл 5:вкл 6:выкл Но это не сработает, если 'chkconfig: -' и Default-St* отсутствуют. В этом случае всё пролинкуется как Kill. И ни --add, ни reset не восстановят нормальный старт сервиса. (В ответ на комментарий №7) > И правильно он будет запускаться только через --add|reset: > (при явно указанных в LSB-хидере runlevel, которые устанавливаются|линкуются, > или указанием runlevel в chkconfig:, или указанием runlevel в Default-St* в > LSB-хидере) > Он будет правильно запускаться, если его явно правильно запустить: chkconfig --level 345 NetworkManager on Т.е. при сборке, в mkimage-profiles указать уровень запуска. (В ответ на комментарий №5) > > Если нужно явно указать runlevel, то у chkconfig есть параметр --level. > Да. Но проблема в том, что в mkimage-profiles указывать runlevel сейчас нельзя. > Но, видимо, выход как раз в том, чтобы такую возможность реализовать... Вот твой же однострочник насчёт конкретно dm: > - @$(call try,THE_DM_SERVICE,dm) А вот переписка по его поводу: > Просто случай с dm частный. В том-то и дело, что конкретно уровни 3 и 5 различаются ровно на него по самой задумке ;-) Хорошие системы позволяют решать простые проблемы просто (и сложные -- вообще). :-) (В ответ на комментарий №9) > ... > Хорошие системы позволяют решать простые проблемы просто (и сложные -- вообще). > :-) Ну и? Стоит реализовывать возможность задать runlevel в m-p? Чтобы можно было указать так: @$(call add,DEFAULT_SERVICES_ENABLE,345,NetworkManager) Если не указано, то всё по-старому. И где неверно запускать со 2 по 5, указать правильные runlevel. Created attachment 8175 [details] x11: don't chkconfig dm on explicitly (В ответ на комментарий №10) > Ну и? Стоит реализовывать возможность задать runlevel в m-p? Может, так; а может, сделать ручки для --add и/или --reset. Пока не знаю. > Чтобы можно было указать так: > @$(call add,DEFAULT_SERVICES_ENABLE,345,NetworkManager) Так точно нельзя, поскольку это или излишне усложнит логику, или сломает совместимость с имеющимися пользователями -- новые параметры идут в хвост и, видимо, не через запятую (по-моему, функции в make всё-таки не умеют переменное количество аргументов), а через двоеточие -- см. фичу control насчёт разбора такого вручную. > Если не указано, то всё по-старому. И где неверно запускать со 2 по 5, > указать правильные runlevel. Или... просто выкинуть одну лишнюю строчку, что я и сделал приложенным коммитом b8c42c6c2f2a835f6e8efa394af7cbc7c9a5eea5 в mkimage-profiles (ветка next). PS: а ещё это нифига не METABUG, поскольку метабаги -- инструмент не обсуждения, а собирания других багов, в которых и ведётся собственно обсуждение. (В ответ на комментарий №11) > Created an attachment (id=8175) [details] > x11: don't chkconfig dm on explicitly > > (В ответ на комментарий №10) > > Ну и? Стоит реализовывать возможность задать runlevel в m-p? > Может, так; а может, сделать ручки для --add и/или --reset. > Пока не знаю. > Моё ИМХО здесь соглашается с Михаилом: (В ответ на комментарий №9) > Хорошие системы позволяют решать простые проблемы просто (и сложные -- вообще). > :-) > Раньше перечень служб, которые следует включать по окончании инсталяции операционной системы, был частью профиля установки А куда дели если оно такое было, это ж просто чудное решение. > Зачастую это делается специально, чтобы скрипты не запускались сами собой в результате установки пакета. Имхо, как-то это неправильно. Тут либо запускать по какому-то дефолту (т.е если это какая-то сетевая служба, то и запускать ее 345), или при идеальном раскладе при установке пакетов содержащих службы вызывать post-install скрипт, который спросит на каких уровнях запускать. > runlevel 2 остался только в спецификациях. Так-же как и 4-й. С ними "самое то" это сделать копии с 1→2 3→4 и особо не заморачиваться. (В ответ на комментарий №13) > > runlevel 2 остался только в спецификациях. > > Так-же как и 4-й. > С ними "самое то" это сделать копии с 1→2 3→4 и особо не заморачиваться. И это сломает соответствие спецификации: https://book.linuxfromscratch.org.ru/systemv/chapter07/usage.html 0: остановить компьютер 1: однопользовательский режим 2: многопользовательский режим без сети 3: многопользовательский режим с сетью 4: зарезервированный для настроек, в ином случае аналогичен уровню 3 5: аналогичен уровню 3 4, обычно используется для GUI авторизации (например xdm или kdm) 6: перезагрузка компьютера А заодно и сломает правильный запуск с правильной конфигурацией этих сервисов: # grep 'chkconfig:\|Default-St' /etc/rc.d/init.d/{network,NetworkManager} /etc/rc.d/init.d/network:# chkconfig: 345 10 90 /etc/rc.d/init.d/network:# Default-Start: 3 4 5 /etc/rc.d/init.d/network:# Default-Stop: 0 1 2 6 /etc/rc.d/init.d/NetworkManager:# chkconfig: - 12 90 /etc/rc.d/init.d/NetworkManager:# Default-Start: 3 4 5 /etc/rc.d/init.d/NetworkManager:# Default-Stop: 0 1 6 которые часто включаются как service <service> on что в корне неправильно. Для этих сервисов --add/reset и никак иначе. Иначе после on они полезут в runlevel 2. И после того же on, dm полезет на уровни 2345, - только --add/reset, не on. На установке пакета, симлинковка отработает верно # rpm -q --scripts etcnet | head -n5 postinstall scriptlet (through /bin/sh): if [ $1 -eq 1 ]; then # This is a fresh install. /sbin/chkconfig --add network fi # rpm -q --scripts NetworkManager-daemon | sed -n '5,6p; 14,15p' postinstall scriptlet (through /bin/sh): #post_service NetworkManager if [ "$1" -eq 1 ]; then /sbin/chkconfig --add NetworkManager ||: Если эту симинковку не сломать через /sbin/chkconfig <service> on (В ответ на комментарий №4) > (In reply to comment #3) > > сломает спецификацию на runlevel в альтах: > > https://book.linuxfromscratch.org.ru/systemv/chapter07/usage.html > > По которой сетевым инит-скриптам запрещено запускаться в runlevel 2 > > runlevel 2 остался только в спецификациях. 'runlevel 2' в альтах, поддерживается на уровне постинсталл скриптов (Default-St* в приоритете): # rpm -q --scripts etcnet | head -n5 postinstall scriptlet (through /bin/sh): if [ $1 -eq 1 ]; then # This is a fresh install. /sbin/chkconfig --add network fi # grep 'chkconfig:\|Default-St' /etc/rc.d/init.d/network # chkconfig: 345 10 90 # Default-Start: 3 4 5 # Default-Stop: 0 1 2 6 # rpm -q --scripts NetworkManager-daemon | sed -n '5,6p; 14,15p' postinstall scriptlet (through /bin/sh): #post_service NetworkManager if [ "$1" -eq 1 ]; then /sbin/chkconfig --add NetworkManager ||: # grep 'chkconfig:\|Default-St' /etc/rc.d/init.d/NetworkManager # chkconfig: - 12 90 # Default-Start: 3 4 5 # Default-Stop: 0 1 6 Но service <service> on сломает этот правильный дефолт для runlevel. |