[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: sarge: /etc/init.d/networking , default runlevels



On Sat, Jul 09, 2005 at 03:28:46 +0400, Roman Shiryaev wrote:
> 
> Прописал в /etc/network/interfaces для интерфейса eth0
> загрузку/сохранение своих правил iptables (через опции
>  pre-up и post-down). Не суть каких. Суть в том, что сохранять
> их
> при выключении/перезагрузки машины у меня система ну никак не
> хотела.
> 
> Ладно, решил упростить задачу. Прописал опять-таки с помощью
> pre-up и post-down команду echo -e \\a  , чтобы убедиться, что
> она выполняется в нужные моменты. При загрузке (поднятии eth0) -
> "пик"
> раздается. В остальных случаях (reboot, halt) его просто нет.
> 
> Решил проверить нехитрой командой
> find /etc/rc* | grep networking  ,
> на каких уровнях (runlevels) запускается/останавливается "сеть".
> И вот что увидел:
> /etc/rc0.d/S35networking
> /etc/rc6.d/S35networking
> /etc/rcS.d/S40networking
> 
> Довольно странно. Получается, что при корректном ctrl-alt-delete
> (переход на 6-й runlevel) сетевые интерфейсы, вместо того, чтобы
> опускаться, наоборот повторно поднимаются? И в single mode, и в
> halt тоже???

Итак, немного разобрался что к чему. По поводу single mode
(SM) оказался не совсем прав. Да, в приведенной выше конфигурации
сеть поднимается и в нем (в SM) по той простой причине, что
скрипты из rcS выполняются при загрузке и при входе в SM
( вычитано в /etc/rcS.d/README ). Правда, мне всегда касалось,
что в SM сетевые интерфейсы должны опускаться. Отсюда первый
вопрос:

* Должна ли сеть подниматься в single mode?

Далее. Почему сеть поднимается в режимах останова (0) и
перезагрузки (6) (согласно /etc/inittab в debian sarge)?

Решил найти виновника среди установочных скриптов пакета netbase.
Скачал файлы с правилами сборки пакета netbase
(netbase_4.21.tar.gz) и почитал руководство начинающего
разработчика Debian
/usr/share/doc/maint-guide/maint-guide.en.html/ch-dother.en.html#s-maintscripts
Откуда был перенаправлен в Policy Manual, chapter 6, т.е. в
/usr/share/doc/debian-policy/policy.html/ch-maintainerscripts.html

В каталоге debian/ изучил находящиеся там файлы.

Из debian/README.Debian
------------------
Debian has traditionally used a free-form /bin/sh script called
/etc/init.d/network to configure networking (usually run from
/etc/rcS.d/S40netwok). This was created at a first install, and
then left to the admin to update as necessary.
------------------

ok. Что-то похожее на правду. При первой установке из созданных
у меня 3-х линков в /etc/rc?.d/  /etc/rcS.d/S40networking следует
считать легально существующем. Откуда взялись остальные два для
0-го и 6-го runlevel`ов? Копаю дальше.

Из debian/netbase.postinst
-----------------
     93   fi
     94 }
     95
     96 update_rc() {
     97   update-rc.d networking start 40 S . start 35 0 6 . > /dev/null
     98 }
     99
    100 case "$1" in
    101     configure)
    102     remove_old_files
    103     kill_portmapper "$@"
    104     update_hosts_file
    105     update_initd_networks "$@"
    106     fix_old_initscript "$@"
    107     update_rc
    108     ;;
    109
    110     abort-upgrade|abort-remove|abort-deconfigure)
-----------------

В общем, судя по коду скрипта, который вызывается и выполняется
после установки пакета netbase, умолчальные runlevel`ы
выставляются именно в этом месте через функцию update_rc(), код
которой укладывается в одну, 97-ую строку:

update-rc.d networking start 40 S . start 35 0 6 . > /dev/null

Далее иду повторно читать man update-rc.d и понимаю, что то ли
мейнтейнер что-то напутал, то ли я дурак. Но причина всех моих
бед в этом топике обнаружена. Собственно, эта строка и создала те
самые злополучные 3 ссылки, две из которых - неправильные(?).
По-моему, 97-я строка скрипта должна иметь следующий вид:

update-rc.d networking start 40 S . stop 35 0 6 . > /dev/null

Писать багрепорт или я все-таки не прав и в чем-то заблуждаюсь?

> 
> Сам я накосячить с runlevel`ами не мог, поскольку только сейчас
> до разборки с ними дошёл.
> 
> В общем, в итоге пришлось удалить вышеприведенный ссылки вручную
> find /etc/rc* | grep networking | xargs rm -f
> (т.к. update-rc.d с ключом -f этого делать почему-то не захотел)

Да, тут тоже понял причину. Ключ -f работает только при
соблюдении следующего синтаксиса:
      update-rc.d [-n] [-f] name remove

А я пытался разом и удалить ссылки, и создать новые. Скрипт же
этого делать не умеет и требует последовательного, в два шага,
удаления и создания ссылок.



Reply to: