Bug 36967

Summary: Отсутствие указания уровней запуска для сервисов в init скриптах
Product: Sisyphus Reporter: Сергей Котляров <shadowsbrother>
Component: cross-componentAssignee: Dmitry V. Levin <ldv>
Status: NEW --- QA Contact: Dmitry V. Levin <ldv>
Severity: normal    
Priority: P3 CC: antohami, diablopc, lav, mike, zxwarior
Version: unstableKeywords: METABUG
Hardware: all   
OS: Linux   
URL: http://www.opennet.ru/openforum/vsluhforumID3/117762.html#94
Attachments:
Description Flags
x11: don't chkconfig dm on explicitly none

Description Сергей Котляров 2019-07-02 13:04:00 MSK
Список пакетов, в init скриптах которых не указаны уровни запуска, из-за чего сервисы получаются отключены для всех уровней запуска (https://forum.altlinux.org/index.php?topic=36177.msg340641#msg340641, https://forum.altlinux.org/index.php?topic=36177.msg340642#msg340642) или наоборот включенными там, где не надо (runlevel 2, https://forum.altlinux.org/index.php?topic=36177.msg340590#msg340590)
Comment 1 Антон Мидюков 2019-07-02 14:56:31 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. А пока этим метабагом оценим масштаб проблемы.
Comment 2 Dmitry V. Levin 2019-07-03 00:20:20 MSK
(In reply to comment #0)
> Список пакетов, в init скриптах которых не указаны уровни запуска

Зачастую это делается специально, чтобы скрипты не запускались сами собой в результате установки пакета.  Раньше перечень служб, которые следует включать по окончании инсталяции операционной системы, был частью профиля установки.
Comment 3 Speccyfighter 2019-07-03 15:54:04 MSK
(В ответ на комментарий №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.
Вместо явно и правильно указанных.
Comment 4 Dmitry V. Levin 2019-07-03 16:03:38 MSK
(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 остался только в спецификациях.
Comment 5 Антон Мидюков 2019-07-03 16:16:46 MSK
(В ответ на комментарий №4)
> Если нужно явно указать runlevel, то у chkconfig есть параметр --level.

Да. Но проблема в том, что в mkimage-profiles указывать runlevel сейчас нельзя.
Но, видимо, выход как раз в том, чтобы такую возможность реализовать...
Comment 6 Speccyfighter 2019-07-03 16:34:31 MSK
(В ответ на комментарий №4)
> > сломает спецификацию на runlevel в альтах:
> > https://book.linuxfromscratch.org.ru/systemv/chapter07/usage.html
> > По которой сетевым инит-скриптам запрещено запускаться в runlevel 2
> 
> runlevel 2 остался только в спецификациях.

Заголовок инит-скрипта требует одного запуска, а система делает совсем по-другому и запускает инит-скрипт на том runlevel, на котором скрипт не должен быть запущен.


> runlevel 2 остался только в спецификациях.

Этот вопрос хотелось бы прояснить:
Т.е. altlinux не придерживается спецификаций?
Comment 7 Speccyfighter 2019-07-03 18:07:48 MSK
(В ответ на комментарий №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 не восстановят нормальный старт сервиса.
Comment 8 Антон Мидюков 2019-07-03 18:38:16 MSK
(В ответ на комментарий №7)
> И правильно он будет запускаться только через --add|reset:
> (при явно указанных в LSB-хидере runlevel, которые устанавливаются|линкуются,
> или указанием runlevel в chkconfig:, или указанием runlevel в Default-St* в
> LSB-хидере)
>

Он будет правильно запускаться, если его явно правильно запустить:
chkconfig --level 345 NetworkManager on

Т.е. при сборке, в mkimage-profiles указать уровень запуска.
Comment 9 Michael Shigorin 2019-07-03 20:19:23 MSK
(В ответ на комментарий №5)
> > Если нужно явно указать runlevel, то у chkconfig есть параметр --level.
> Да. Но проблема в том, что в mkimage-profiles указывать runlevel сейчас нельзя.
> Но, видимо, выход как раз в том, чтобы такую возможность реализовать...

Вот твой же однострочник насчёт конкретно dm:

> -       @$(call try,THE_DM_SERVICE,dm)

А вот переписка по его поводу:

> Просто случай с dm частный.

В том-то и дело, что конкретно уровни 3 и 5 различаются ровно
на него по самой задумке ;-)

Хорошие системы позволяют решать простые проблемы просто (и сложные -- вообще).
:-)
Comment 10 Антон Мидюков 2019-07-03 20:28:37 MSK
(В ответ на комментарий №9)
> ...
> Хорошие системы позволяют решать простые проблемы просто (и сложные -- вообще).
> :-)

Ну и? Стоит реализовывать возможность задать runlevel в m-p?

Чтобы можно было указать так:
@$(call add,DEFAULT_SERVICES_ENABLE,345,NetworkManager)

Если не указано, то всё по-старому. И где неверно запускать со 2 по 5, указать правильные runlevel.
Comment 11 Michael Shigorin 2019-07-03 20:38:43 MSK
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, поскольку метабаги -- инструмент не обсуждения, а собирания других багов, в которых и ведётся собственно обсуждение.
Comment 12 Speccyfighter 2019-07-04 04:07:58 MSK
(В ответ на комментарий №11)
> Created an attachment (id=8175) [details]
> x11: don't chkconfig dm on explicitly
> 
> (В ответ на комментарий №10)
> > Ну и? Стоит реализовывать возможность задать runlevel в m-p?
> Может, так; а может, сделать ручки для --add и/или --reset.
> Пока не знаю.
> 

Моё ИМХО здесь соглашается с Михаилом:

(В ответ на комментарий №9)
> Хорошие системы позволяют решать простые проблемы просто (и сложные -- вообще).
> :-)
Comment 13 DiabloPC 2019-07-04 19:02:11 MSK
> Раньше перечень служб, которые следует включать
по окончании инсталяции операционной системы, был частью профиля установки

А куда дели если оно такое было, это ж просто чудное решение.

> Зачастую это делается специально, чтобы скрипты не запускались сами собой в
результате установки пакета. 

Имхо, как-то это неправильно. Тут либо запускать по какому-то дефолту (т.е если это какая-то сетевая служба, то и запускать ее 345), или при идеальном раскладе при установке пакетов содержащих службы вызывать post-install скрипт, который спросит на каких уровнях запускать.

> runlevel 2 остался только в спецификациях.

Так-же как и 4-й.
С ними "самое то" это сделать копии с 1→2 3→4 и особо не заморачиваться.
Comment 14 Speccyfighter 2019-07-05 18:25:01 MSK
(В ответ на комментарий №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.
Comment 15 Speccyfighter 2019-07-05 19:28:25 MSK
На установке пакета, симлинковка отработает верно

# 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
Comment 16 Speccyfighter 2019-07-17 13:13:34 MSK
(В ответ на комментарий №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.