Pokud svému systému řeknu, aby přešel na úroveň běhu 3, znamená to, že nejprve proběhne úroveň běhu 0, 1, 2 a poté nakonec přejde úroveň běhu 3?
Myslel jsem, že odpověď na tuto otázku je ano. Ale když se podívám na svůj systém RHEL 6, vidím, že mnoho adresářů rcX.d obsahuje stejné symbolické odkazy.
Na stránce Můj /etc/rc.d/rc0.d/
[[email protected] rc.d]# ls -lah /etc/rc.d/rc0.d/
total 8.0K
drwxr-xr-x. 2 root root 4.0K Jun 27 11:59 .
drwxr-xr-x. 10 root root 4.0K Jul 9 15:06 ..
lrwxrwxrwx. 1 root root 13 Jun 12 13:02 K05atd -> ../init.d/atd
lrwxrwxrwx. 1 root root 14 Jun 12 13:01 K10cups -> ../init.d/cups
lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 18 Jun 12 12:51 K15svnserve -> ../init.d/svnserve
lrwxrwxrwx. 1 root root 14 Jun 12 10:58 K25sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 17 Jun 12 10:57 K30postfix -> ../init.d/postfix
lrwxrwxrwx. 1 root root 17 Jun 12 12:26 K50dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx. 1 root root 20 Jun 12 10:57 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 15 Jun 12 10:57 K60crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 25 Jun 27 11:59 K65vboxadd-service -> ../init.d/vboxadd-service
lrwxrwxrwx. 1 root root 17 Jun 27 11:58 K70vboxadd -> ../init.d/vboxadd
lrwxrwxrwx. 1 root root 21 Jun 27 11:59 K70vboxadd-x11 -> ../init.d/vboxadd-x11
lrwxrwxrwx. 1 root root 17 Jun 12 12:26 K73winbind -> ../init.d/winbind
lrwxrwxrwx. 1 root root 19 Jun 12 12:26 K74haldaemon -> ../init.d/haldaemon
lrwxrwxrwx. 1 root root 26 Jun 12 10:58 K75blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 15 Jun 12 11:15 K75netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K75udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 24 Jun 12 12:26 K84NetworkManager -> ../init.d/NetworkManager
lrwxrwxrwx. 1 root root 24 Jun 27 11:59 K84wpa_supplicant -> ../init.d/wpa_supplicant
lrwxrwxrwx. 1 root root 19 Jun 12 10:58 K85mdmonitor -> ../init.d/mdmonitor
lrwxrwxrwx. 1 root root 20 Jun 12 12:25 K85messagebus -> ../init.d/messagebus
lrwxrwxrwx. 1 root root 20 Jun 12 10:58 K87multipathd -> ../init.d/multipathd
lrwxrwxrwx. 1 root root 21 Jun 12 10:57 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 16 Jun 12 10:58 K88auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 15 Jun 27 11:59 K88iscsi -> ../init.d/iscsi
lrwxrwxrwx. 1 root root 17 Jun 12 10:57 K88rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 16 Jun 12 10:58 K89iscsid -> ../init.d/iscsid
lrwxrwxrwx. 1 root root 21 Jun 12 13:01 K89portreserve -> ../init.d/portreserve
lrwxrwxrwx. 1 root root 15 Jun 12 11:15 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 17 Jun 12 11:15 K90network -> ../init.d/network
lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K92ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 Jun 12 10:57 K92iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 22 Jun 12 10:58 K99lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 17 Jun 12 11:15 S00killall -> ../init.d/killall
lrwxrwxrwx. 1 root root 14 Jun 12 11:15 S01halt -> ../init.d/halt
lrwxrwxrwx. 1 root root 15 Jun 26 12:32 S95jexec -> ../init.d/jexec
A v /etc/rc.d/rc1.d/ Vidím stejnou sadu symbolických odkazů jako v rc0.d plus další odkazy. Zdá se, že to naznačuje, že adresáře rc0.d, rc1.d jsou nezávislé a že pro spuštění úrovně 1 neprovádí věci v úrovni běhu 0. Což znamená, že se mohou stát špatné věci, pokud nějaké symbolické odkazy v rc0 .d nebyly přesně replikovány v rc1.d, … atd.
Jak to tedy skutečně funguje? Skenuje pouze soubory v konkrétním adresáři rc.X nebo projde všechny adresáře rc.X, které mají nižší úroveň, než je úroveň rc předaná init?
[ro[email protected] rc.d]# ls -lah /etc/rc.d/rc1.d/
total 8.0K
drwxr-xr-x. 2 root root 4.0K Jun 27 11:59 .
drwxr-xr-x. 10 root root 4.0K Jul 9 15:06 ..
lrwxrwxrwx. 1 root root 13 Jun 12 13:02 K05atd -> ../init.d/atd
lrwxrwxrwx. 1 root root 14 Jun 12 13:01 K10cups -> ../init.d/cups
lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 18 Jun 12 12:51 K15svnserve -> ../init.d/svnserve
lrwxrwxrwx. 1 root root 14 Jun 12 10:58 K25sshd -> ../init.d/sshd
lrwxrwxrwx. 1 root root 17 Jun 12 10:57 K30postfix -> ../init.d/postfix
lrwxrwxrwx. 1 root root 17 Jun 12 12:26 K50dnsmasq -> ../init.d/dnsmasq
lrwxrwxrwx. 1 root root 20 Jun 12 10:57 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 15 Jun 12 10:57 K60crond -> ../init.d/crond
lrwxrwxrwx. 1 root root 25 Jun 27 11:59 K65vboxadd-service -> ../init.d/vboxadd-service
lrwxrwxrwx. 1 root root 17 Jun 27 11:58 K70vboxadd -> ../init.d/vboxadd
lrwxrwxrwx. 1 root root 21 Jun 27 11:59 K70vboxadd-x11 -> ../init.d/vboxadd-x11
lrwxrwxrwx. 1 root root 17 Jun 12 12:26 K73winbind -> ../init.d/winbind
lrwxrwxrwx. 1 root root 19 Jun 12 12:26 K74haldaemon -> ../init.d/haldaemon
lrwxrwxrwx. 1 root root 15 Jun 12 11:15 K75netfs -> ../init.d/netfs
lrwxrwxrwx. 1 root root 24 Jun 12 12:26 K84NetworkManager -> ../init.d/NetworkManager
lrwxrwxrwx. 1 root root 24 Jun 27 11:59 K84wpa_supplicant -> ../init.d/wpa_supplicant
lrwxrwxrwx. 1 root root 19 Jun 12 10:58 K85mdmonitor -> ../init.d/mdmonitor
lrwxrwxrwx. 1 root root 20 Jun 12 12:25 K85messagebus -> ../init.d/messagebus
lrwxrwxrwx. 1 root root 20 Jun 12 10:58 K87multipathd -> ../init.d/multipathd
lrwxrwxrwx. 1 root root 21 Jun 12 10:57 K87restorecond -> ../init.d/restorecond
lrwxrwxrwx. 1 root root 16 Jun 12 10:58 K88auditd -> ../init.d/auditd
lrwxrwxrwx. 1 root root 15 Jun 27 11:59 K88iscsi -> ../init.d/iscsi
lrwxrwxrwx. 1 root root 17 Jun 12 10:57 K88rsyslog -> ../init.d/rsyslog
lrwxrwxrwx. 1 root root 16 Jun 12 10:58 K89iscsid -> ../init.d/iscsid
lrwxrwxrwx. 1 root root 21 Jun 12 13:01 K89portreserve -> ../init.d/portreserve
lrwxrwxrwx. 1 root root 15 Jun 12 11:15 K89rdisc -> ../init.d/rdisc
lrwxrwxrwx. 1 root root 17 Jun 12 11:15 K90network -> ../init.d/network
lrwxrwxrwx. 1 root root 19 Jun 12 10:57 K92ip6tables -> ../init.d/ip6tables
lrwxrwxrwx. 1 root root 18 Jun 12 10:57 K92iptables -> ../init.d/iptables
lrwxrwxrwx. 1 root root 22 Jun 12 10:58 S02lvm2-monitor -> ../init.d/lvm2-monitor
lrwxrwxrwx. 1 root root 26 Jun 12 10:58 S25blk-availability -> ../init.d/blk-availability
lrwxrwxrwx. 1 root root 19 Jun 12 10:57 S26udev-post -> ../init.d/udev-post
lrwxrwxrwx. 1 root root 15 Jun 26 12:32 S95jexec -> ../init.d/jexec
lrwxrwxrwx. 1 root root 16 Jun 12 11:15 S99single -> ../init.d/single
Přijatá odpověď:
Když přepnete úroveň běhu, jediné, co se spustí, jsou skripty v /etc/rc.d/rc${NEW_LEVEL}.d/
.
To znamená, že máte pravdu:Každý rc*.d
adresář musí být schopen zpracovat vše změn procesu/služby při přechodu z jiné úrovně běhu. Každý adresář rc tedy obsahuje úplnou sadu skriptů pro dosažení této úrovně běhu.
Řekněme, že přecházíte na úroveň běhu 3. /etc/rc.d/rc3.d/K*
skripty se pokusí zabít všechny procesy, které běžely na jakékoli předchozí úrovni běhu (může to být libovolné číslo) a /etc/rc.d/rc3.d/S*
skripty spustí všechny procesy, které je třeba spustit (a ještě nebyly spuštěny v předchozí úrovni běhu).
Je zřejmé, že správa všech těchto symbolických odkazů by byla skutečnou bolestí, takže existují nástroje, které vám to pomohou zvládnout. Na Debianu a Ubuntu (alespoň, možná na jiných), můžete použít update-rc.d
pro selektivní povolení/zakázaní skriptů nalezených v /etc/init.d
, nebo je nastavit na „výchozí“ nebo doporučená nastavení pro každý skript. Tím se vytvoří a aktualizují všechny symbolické odkazy, aby odrážely změny konfigurace, které chcete zavést. Chápu, že na CentOS můžete použít ntsysv
nebo chkconfig
udělat to samé.
Ve skutečnosti nikdy dotkněte se souborů v /etc/rc*.d/
(nebo /etc/rc.d/rc*.d/
) vy sám; nástroj používáte vždy (např. update-rc.d
, ntsysv
, chkconfig
), abyste mohli provést jakékoli změny.