如果我告诉我的系统进入运行级别 3,这是否意味着它首先运行运行级别 0、1、2,然后最终运行运行级别 3?
我认为这个问题的答案是肯定的。但是当我查看 RHEL 6 系统时,我发现许多 rcX.d 目录包含相同的符号链接。
在我的/etc/rc.d/rc0.d/
[root@centos6 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
并且在/etc/rc.d/rc1.d/我看到与 rc0.d 中相同的符号链接集以及额外的链接。这似乎表明目录 rc0.d 和 rc1.d 是独立的,并且要进入运行级别 1,它不会执行运行级别 0 中的内容。这意味着如果 rc0 中的符号链接发生某些变化,可能会发生不好的事情.d 没有在 rc1.d 中完全复制,...等。
那么它到底是如何运作的呢?它只是扫描特定 rc.X 目录中的文件还是运行级别低于传递给 init 的 rc 级别的所有 rc.X 目录?
[root@centos6 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
答案1
如果我告诉我的系统进入运行级别 3,这是否意味着它首先运行运行级别 0、1、2,然后最终运行运行级别 3?
不,不是的。运行级别以这种方式不是连续的。
例证:运行级别0通常是“关闭”运行级别,它停止所有服务并最终停止(并可能关闭)系统。如果为了获得完全运行的系统,init 首先进入运行级别 0,那就不太好了。
也就是说,有通常A进展在此期间启动过程。内核在运行级别 1 中初始化,然后将控制权传递给 init,后者通常配置为进入运行级别 2(无需联网的多用户),然后是运行级别 3(完全可操作的文本模式),可能还可以进入运行级别 5(完全可操作)图形模式)。但这实际上是完全可配置的,并且进入哪个运行级别的细节主要是按照惯例。例如,我认为至少在过去,Debian 使用运行级别 4 来实现完全操作的图形模式,而在我的 Debian Wheezy 上,运行级别 2 和 3 似乎是相同的(diff <(ls /etc/rc2.d) <(ls /etc/rc3.d)
不输出任何内容)。每个运行级别具体对应什么由管理员决定。
同样按照惯例,运行级别 6 通常设置为重新启动系统;您可以从运行级别 1 直接跳转到运行级别 6,特别是在系统维护期间,如果某些因素阻止操作系统正常启动。
还值得注意的是,非 Linux 系统可能对不同运行级别的用途有不同的想法,或者具有不同数量的可用运行级别。这个概念在 *nix 世界中可能几乎是通用的,但实现和实际使用可能有很大差异。
总而言之,“运行级别”只是一种将相关进程和系统状态分组为可由管理员选择的可管理包的便捷方法。 (顺便说一句,Windows 的故障安全模式、网络故障安全、命令提示符故障安全、正常启动等具有非常相似的概念。)
答案2
当您切换运行级别时,唯一执行的是/etc/rc.d/rc${NEW_LEVEL}.d/
.
这意味着你是对的:每一个 rc*.d
目录需要能够处理全部从另一个运行级别切换时进程/服务发生变化。因此,每个 rc 目录都包含用于达到该运行级别的全套脚本。
假设您要切换到运行级别 3。/etc/rc.d/rc3.d/K*
脚本将尝试终止在您之前的运行级别(可以是任意数字)下运行的任何进程,并且/etc/rc.d/rc3.d/S*
脚本将启动任何需要启动的进程(并且尚未启动)从上一个运行级别开始)。
显然,管理所有这些符号链接将是一件非常痛苦的事情,因此有一些实用程序可以帮助管理这一点。在 Debian 和 Ubuntu(至少,也许其他)上,您可以用于update-rc.d
有选择地启用/禁用 中找到的脚本/etc/init.d
,或者将它们设置为每个脚本的“默认”或推荐设置。这将为您创建和更新所有符号链接,以反映您想要实施的任何配置更改。在 CentOS 上,我知道您可以使用ntsysv
或chkconfig
来做同样的事情。
实际上,你绝不自己触摸/etc/rc*.d/
(或)中的文件;/etc/rc.d/rc*.d/
您始终使用该工具(例如update-rc.d
、ntsysv
、chkconfig
)进行任何更改。