九、运行级别 1Linux 系统的运行级别(runlevel) Linux 系统有 7 个运行级别,Linux 系统任何时候都运行在一个指定的运行级别上,不同的运行级 别所运行的程序和服务不尽相同,所要完成的工作和要达到的目的也不相同 · 运行级别 0 系统停机(halt)状态,系统的默认运行级别不能设为 0,否则不能正常启动 · 运行级别 1 单用户工作(single user)状态,root 权限,用于系统维护,禁止远程登陆 · 运行级别 2 多用户(multiuser)状态 (没有 NFS) · 运行级别 3 完全的多用户(multiuser)状态 (NFS),登陆后进入控制台命令行模式 · 运行级别 4 系统未使用,保留 · 运行级别 5 X11 控制台 (xdmgdmkdm),登陆后进入图形 GUI 模式· 运行级别 6 系统正常关闭并重启(reboot),默认运行级别不能设为 6,否则不能正常启动 2、运行级别的原理 在目录 /etc/rc.d/init.d 下有许多服务器脚本程序,一般称为服务(service), 在 /etc/rc.d 7 个名为 rcN.d 的目录,其中 N=0-6,对应于系统的 7 个运行级别, rcN.d 目录下,都是 一些符号链接文件,这些链接文件都指向 init.d 目录下的 service 脚本文件,这些链接文件的命 名规则是 “K+nn+服务名“S+nn+服务名,其中 nn 2 位数字: : rc3.d 目录下的链接文件 S80sendmail 就指向 service 脚本文件 ../init.d/sendmail 系统会根据指定的 runlevel 进入对应的 rcN.d 目录,并按照文件名顺序检索目录下的链接文件 • 对于以 K 为开头的链接文件,系统将终止对应的服务 • 对于以 S 为开头的链接文件,系统将启动对应的服务 通过这种方式来实现 不同的运行级别运行不同的程序和服务3/etc/inittab配置文件详解 init 的进程号是 1,从这一点就能看出,init 进程是系统所有进程的起点,Linux 在完成核内引导以后, 就开始运行 init 程序,init 程序需要读取设置文件/etc/inittabinittab 是个不可执行的文本文件,他有若 干行指令所组成。在 Redhat 系统中,inittab 的内容如下所示(以“###”开始的中注释为笔者增加的)如果你改变了 inittab 文件,那么要使他立即生效,需要使用一个命令:init q# # inittab This file describes how the INIT process should set up # the system in a certain run-level. # # Author: Miquel van Smoorenburg, # Modified for RHS Linux by Marc Ewing and Donnie Barnes # # Default runlevel. The runlevels used by RHS are: # 0 – halt (Do NOT set initdefault to this) # 1 – Single user mode # 2 – Multiuser, without NFS (The same as 3, if you do not have networking) # 3 – Full multiuser mode # 4 – unused # 5 – X11 # 6 – reboot (Do NOT set initdefault to this) # ###表示当前缺省运行级别为 5(initdefault)id:5:initdefault: ###启动时自动执行/etc/rc.d/rc.sysinit 脚本(sysinit) # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 ###当运行级别为 5 时,以 5 为参数运行/etc/rc.d/rc 脚本,init 将等待其返回(wait) l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 ###在启动过程中允许按 CTRL-ALT-DELETE 重启系统 # Trap CTRL-ALT-DELETE ca::ctrlaltdel:/sbin/shutdown -t3 -r now # When our UPS tells us power has failed, assume we have a few minutes # of power left. Schedule a shutdown for 2 minutes from now. # This does, of course, assume you have powerd installed and your # UPS connected and working correctly. pf::powerfail:/sbin/shutdown -f -h +2 “Power Failure; System Shutting Down” # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c “Power Restored; Shutdown Cancelled” ###2345 级别上以 ttyX 为参数执行/sbin/mingetty 程序,打开 ttyX 终端用于用户登录, ###如果进程退出则再次运行 mingetty 程序(respawn) # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 ###5 级别上运行 xdm 程序,提供 xdm 图像方式登录界面,并在退出时重新执行(respawn) # Run xdm in runlevel 5 x:5:respawn:/etc/X11/prefdm -nodaemon 以上面的 inittab 文件为例,来说明一下 inittab 的格式。其中以#开始的行是注释行,除了注释行之 外,每一行都有以下格式: id:runlevel:action:process 对上面各项的周详解释如下: 1. id id 是指入口标识符,他是个字符串,对于 getty mingetty 等其他 login 程序项,需求 id tty 的编 号相同,否则 getty 程序将不能正常工作。2. runlevel runlevel init 所处于的运行级别的标识,一般使用 06 S s016 运行级别被系统保留: 其中 0 作为 shutdown 动作,1 作为重启至单用户模式,6 为重启;S s 意义相同,表示单用户模式, 且无需 inittab 文件,因此也不在 inittab 中出现,实际上,进入单用户模式时,init 直接在控制台 /dev/console)上运行/sbin/sulogin。在一般的系统实现中,都使用了 2345 几个级别,在 Redhat 系统中,2 表示无 NFS 支持的多用户模式,3 表示完全多用户模式(也是最常用的级别),4 保留给用户 自定义,5 表示 XDM 图像登录方式。79 级别也是能使用的,传统的 Unix 系统没有定义这几个级别。 runlevel 能是并列的多个值,以匹配多个运行级别,对大多数 action 来说,仅当 runlevel 和当前运行级 别匹配成功才会执行。 3. action action 是描述其后的 process 的运行方式的。action 可取的值包括:initdefaultsysinitbootbootwait 等: initdefault是个特别的action值,用于标识缺省的启动级别;当init由核心激活以后,他将读取inittab 中的 initdefault 项,取得其中的 runlevel,并作为当前的运行级别。如果没有 inittab 文件,或其中没有 initdefault 项, init 将在控制台上请求输入 runlevel sysinitbootbootwait action 将在系统启动时无条件运行,而忽略其中的 runlevel 其余的 action(不含 initdefault)都和某个 runlevel 相关。各个 action 的定义在 inittab man 手册 中有周详的描述。 4. process process 为具体的执行程序。程序后面能带参数。 第三部分:系统初始化 init 的设置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 他调用执行了/etc/rc.d/rc.sysinit,而 rc.sysinit 是个 bash shell 的脚本,他主要 init 的设置文件中有这么一行: si::sysinit:/etc/rc.d/rc.sysinit 他 调用执行了/etc/rc.d/rc.sysinit,而 rc.sysinit 是个 bash shell 的脚本,他主要是完成一些系统初始化的 工作,rc.sysinit 是每一个运行级别都要首先运行的重要脚本。他主要完成的工作有:激活交换分区,检 查磁盘,加载硬件模块及其他一些需要优先执行任务。rc.sysinit 约有 850 多行,不过每个单一的功能还是比较简单,而且带有注释,建议有兴趣的用户能自行 阅读自己机器上的该文件,以了解系统初始化所周详情况。由于此文件较长,所以不在本文中列出来, 也不做具体的介绍。 rc.sysinit 程序执行完毕后,将返回 init 继续下一步。 第四部分:启动对应运行级别的守护进程 rc.sysinit 执行后,将返回 init 继续其他的动作,通常接下来会执行到/etc/rc.d/rc 程序。以运行级别 5 为例,init 将执行设置文件 inittab 中的以下这行: l5:5:wait:/etc/rc.d/rc 5 这一行表示以 5 为参数运行/etc/rc.d/rc/etc/rc.d/rc 是个 Shell 脚本,他接受 5 作为参数,去执行/etc/rc.d /rc5.d/目录下的所有的 rc 启动脚本,/etc/rc.d/rc5.d/目录中的这些启动脚本实际上都是一些链接文件, 而不是真正的 rc 启动脚本,真正的 rc 启动脚本实际上都是放在/etc/rc.d/init.d/目录下。而这些 rc 启动 脚本有着类似的用法,他们一般能接受 startstoprestartstatus 等参数。 /etc/rc.d/rc5.d/中的 rc 启动脚本通常是 K S 开头的链接文件,对于以以 S 开头的启动脚本,将以 start 参数来运行。而如果发现存在相应的脚本也存在 K 打头的链接,而且已处于运行态了(/var/lock/subsys/ 下的文件作为标志),则将首先以 stop 为参数停止这些已启动了的守护进程,然后再重新运行。这样做 是为了确保是当 init 改动运行级别时,所有相关的守护进程都将重启。 至于在每个运行级中将运行哪些守护进程,用户能通过 chkconfig setup 中的“System Services”来自行 设定。常见的守护进程有: amd:自动安装 NFS 守护进程 apmd:高级电源管理守护进程 arpwatch:记录日志并构建一个在 LAN 接口上看到的以太网地址和 IP 地址对数据库 autofs:自动安装管理进程 automount,和 NFS 相关,依赖于 NIS crondLinux 下的计划任务的守护进程 namedDNS 服务器 netfs:安装 NFSSamba NetWare 网络文件系统 network:激活已设置网络接口的脚本程序 nfs:打开 NFS 服务 portmapRPC portmap 管理器,他管理基于 RPC 服务的连接 sendmail:邮件服务器 sendmail smbSamba 文件共享/打印服务 syslog:一个让系统引导时起动 syslog klogd 系统日志守候进程的脚本 xfsX Window 字型服务器,为本地和远程 X 服务器提供字型集 Xinetd:支持多种网络服务的核心守护进程,能管理 wuftpsshdtelnet 等服务 这些守护进程也启动完成了,rc 程序也就执行完了,然后又将返回 init 继续下一步。 第五部分:建立终端 rc 执行完毕后,返回 init。这时基本系统环境已设置好了,各种守护进程也已启动了。init 接下来会打 6 个终端,以便用户登录系统。通过按 Alt+Fn(n 对应 1-6)能在这 6 个终端中转换。在 inittab 中的以下 6 行就是定义了 6 个终端: 1:2345:respawn:/sbin/mingetty tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6从上面能看出在 2345 的运行级别中都将以 respawn 方式运行 mingetty 程序,mingetty 程序能打 开终端、设置模式。同时他会显示一个文本登录界面,这个界面就是我们经常看到的登录界面,在这个 登录界面中会提示用户输入用户名,而用户输入的用户将作为参数传给 login 程序来验证用户的身份。 第六部分:登录系统,启动完成 对于运行级别为 5 的图像方式用户来说,他们的登录是通过一个图像化的登录界面。登录成功后能直接 进入 KDEGnome 等窗口管理器。而本文主要讲的还是文本方式登录的情况: 当我们看到 mingetty 的登录界面时,我们就能输入用户名和密码来登录系统了。 Linux 的账号验证程序是 loginlogin 会接收 mingetty 传来的用户名作为用户名参数。然后 login 对用户名进行分析:如果用户名不是 root,且存在/etc/nologin 文件,login 将输出 nologin 文件的内容, 然后退出。这通常用来系统维护时防止非 root 用户登录。只有/etc/securetty 中登记了的终端才允许 root 用户登录,如果不存在这个文件,则 root 能在所有终端上登录。/etc /usertty 文件用于对用户作出附加 访问限制,如果不存在这个文件,则没有其他限制。 在分析完用户名后,login 将搜索/etc/passwd /etc/shadow 来验证密码及设置账户的其他信息,比如: 主目录是什么、使用何种 shell。如果没有指定主目录,将默认为根目录;如果没有指定 shell,将默认 /bin/bashlogin 程序成功后,会向对应的终端在输出最近一次登录的信息(/var/log/lastlog 中有记录),并检查用 户是否有新邮件(/usr/spool /mail/的对应用户名目录下)。然后开始设置各种环境变量:对于 bash 来说, 系统首先寻找/etc/profile 脚本文件,并执行他;然后如果用户的主目录中存在.bash_profile 文件,就执 行他,在这些文件中又可能调用了其他设置文件,所有的设置文件执行后后,各种环境变量也设好了, 这时会出现大家熟悉的命令行提示符,到此整个启动过程就结束了。 4、相关命令 4.1、查看当前系统运行等级 [root@test ~]# runlevel N 5 //’N’代表先前的 Runlevel; ‘5’代表目前的 Runlevel 4.2、切换系统运行等级 #init N //切换到运行级别 N # init 0 //关机 # init 6 //重启动系统