Chinaunix首页 | 论坛 | 博客
  • 博客访问: 340878
  • 博文数量: 89
  • 博客积分: 2919
  • 博客等级: 少校
  • 技术积分: 951
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-23 11:51
个人简介

好懒,什么都没写

文章分类

全部博文(89)

文章存档

2012年(3)

2011年(17)

2007年(20)

2006年(49)

我的朋友

分类: LINUX

2007-09-04 08:29:36

Linux运行等级的切换
在初始化rc脚本注释中,我们介绍了系统起动和运行等级切换时
,系统大概要做哪些工作,现在我们来具体分析一下,默认等级为3,机器从开机到初始化完成具体做了哪些工作。
一、系统刚开机的启动分析
首先,我们知道不管是哪种原因进入init进程,必然会按以下命令si::sysinit:/etc/rc.d/init.d/rc
sysinit生成一个初始化进程,现在刚开机,这个子进程自然也会得到运行。在以sysinit为参数调用rc脚本,后将执行以下操作:
1、载入/etc/sysconfig/rc中的变量和functions中的函数,设置终端显示参数和信号处理方式;
2、由于刚开机,前一个运行级别被设为N;
3、previous=N,所以等级切换部分跳过,也就是找以K开头的那部分不做(事实上rcsysinit.d中也不存在以K开头的服务)
4、找出rcsysinit.d中所有以S开头的服务,具体为:
/etc/rc.d/rcsysinit.d/S00mountkernfs
/etc/rc.d/rcsysinit.d/S05modules
/etc/rc.d/rcsysinit.d/S10udev
/etc/rc.d/rcsysinit.d/S20swap
/etc/rc.d/rcsysinit.d/S30checkfs
/etc/rc.d/rcsysinit.d/S40mountfs
/etc/rc.d/rcsysinit.d/S50cleanfs
/etc/rc.d/rcsysinit.d/S60setclock
/etc/rc.d/rcsysinit.d/S70console
/etc/rc.d/rcsysinit.d/S80localnet
5、由于previous=N,刚开机且runlevel=sysinit,所以以上的服务被依此启动
6、以上服务启动完成后,该子进程结束。

关于以上服务的具体代码注释将在单独的文件中给出。

由于默认的运行等级3,所以系统在rc sysinit子进程结束后,将启动13:3:wait:/etc/rc.d/init.d/rc
3,即以参数3,运行脚本rc,分析一下过程:
1、初始同上;
2、刚开机,不执第一个循环判,即查找以K开头的服务
3、在查找以S开头的服务时,只有以下两个服务存在
/etc/rc.d/rc3.d/S10sysklogd
/etc/rc.d/rc3.d/S20network
4、由于previous=N,刚开机且runlevel=sysinit,以上两项服务被启动;
5、以上服务启动完成后,该子进程结束。

二、等级切换的情况
现在我们假设,如果我们切换运行等级,那系统会做些什么呢(要切换运行等级,只要以带参数形式运行init进程即可,例如init
1,表示切换至我zai 当前运行级别为3,我们使用init 1,切换至到单用户模式,这时init进程运行过程如下:
首先,以参数sysinit运行rc脚本,通过简单的分析我们可知,由于其中的服务都已经启动,所以不会有任何服务启动或停止(有点问题,我再想一下)。
其次,以参数1运行脚本rc,其执行过程也很简单,由于previous!=N 所以找出/etc/rc1.d目录下以K开头服务,有以下两项:
/etc/rc.d/rc1.d/K80network
/etc/rc.d/rc1.d/K90sysklogd
同时,发现该服务在/etc/rc3.d中(也就是已经被开启),所以以参数stop运行该项服务,也就是要停止服务。同时下一个循环中,判断/etc/rc1.d是否存在以S开头的服务,需要启动。如果有则启动,否则子进程结束。

三、关机和重启动分析
有了以上的基础,就很容易知道关机和重新启动的过程了。
首先,在rc sysinit中关闭以K开头,而且已经启动的服务,只有:
/etc/rc.d/rc0.d/K90sysklogd
其次,在rc 0(rc 6)中以stop为参数运所有以S开头的服务,通常有以下几项:
/etc/rc.d/rc0.d/S60sendsignals
/etc/rc.d/rc0.d/S70mountfs
/etc/rc.d/rc0.d/S80swap
/etc/rc.d/rc0.d/S90localnet
/etc/rc.d/rc0.d/S99halt

在基于DEBIAN的LINUX系统中,我们可以在/etc/init.d目录中新增一个SHELL SCRIPT,然后在/etc/rc2.d中新增一个连接文件,如: ln -s /etc/init.d/rclocal /etc/rc2.d/S99rclocal

再例如JBOSS的系统启动,采取同样的 方法,在jboss/bin目录中有脚本 如:redhat-init-shell 先COPY到/etc/init.d中然后增加连接到/etc/rc2.d中即可。

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

自定义Linux的启动与关闭过程(内置inittab详解)
对Linux系统的启动和关闭过程进行管理是系统管理员的必备技能之一。管理员必须要清楚系统中运行着哪些服务,如何增加新的服务,如何删除不必要的服务。本节向Linux管理员介绍自定义启动和关闭系统时涉及的文件。

一、 引导过程概览

当一个Linux系统引导后,Linux启动管理器(LILO)加载核心,核心首先被解压缩,显示设备被初始化,然后核心开始对系统中的硬件进行检查。当 发现硬件设备后,调入相应的模块以支持对硬件的访问。硬件检测完毕后,核心将以只读方式挂接根文件系统。假如根文件系统是完整的,根文件系统将以读写方式 重新挂接。

之后,核心将执行一个叫init的程序。Init执行后,系统就启动并开始运行。可以对Init进程进行配置,这可以通过/etc/inittab文件来完成。

/etc/inittab文件的语法格式如下:

id:run-level:acion:process [argument]

● 第一项是一个惟一的标志,用以区分inittab文件中不同条目。

● 第二项指定了该条目在哪种运行等级中应用。

● 第三项指定了采取的动作。

● 第四项是要运行的进程和其参数,可以在这里指定命令行参数Linux系统的运行等级是通过run-level指定的。在Linux系统中有7个运行等级:

● 0——挂起(不要将initdefault设置为此项)。

● 1——单用户模式。

● 2——多用户,没有连网的支持。

● 3——完全的多用户模式,具有连网的支持。

● 4——没有使用。

● 5——X11,多用户模式与网络支持。

● 6——重新启动(不要将initdefault的值设置为此项)。

在init配置这一行中,你可以指定多个运行状态。指定运行状态1和3下应用某操作的配置如下:

id:12:action:rocess [argument]

下面列出了系统运行状态可以使用的动作:

● respawn——当该进程终止时自动启动。

● wait——该进程只运行1次,init等待该进程,直到该进程结束。

● once——该进程只运行1次。

● boot——该进程在系统启动时运行,不考虑系统的运行等级。

● bootwait——该进程在系统启动时运行,init等待该进程,直到该进程结束。

● off——不采取任何动作。用来使一条配置失效,而不用删除该条配置。可以代替表示注释的#号。

● ondemand——通常没有使通常不使用。

● initdefault——指定系统的默认运行等级。运行的进程一列被忽略。

● sysinit——该进程在系统启动时运行一次。Sysinit的动作要比boot和bootwait的优先级高。

● powerwait——init进程收到SIGPWR信号下运行的进程。UPS电源在电源发生问题时会向该进程发送SIGPWR信号。Init进程会等待该进程,直到该进程终止。

● powerfail——同powerwait相同。但是init不会等待进程的终止。

● powerokwait——当init进程收到SIGPWR信号,并且/etc/powerstatus文件包括有OK的文本内容。/etc/powerstatus文件通常由UPS监视软件创建,用来显示电源问题已经解决。

● ctrlaltdel——当init进程收到SIGINT信号时做的动作。

● kbrequest——当init进程收到键盘信号时做的动作。

二、 /etc/rc.d/rc.sysinit脚本

当Linux启动后,核心运行init程序,该程序调用/etc/rc.d/rc.sysinit脚本。这个脚本先于其它任何程序而运行,是因为在/etc/inittab文件中有这么一行:

si::sysinit:/etc/rc.d/rc.sysinit

其中的运行等级一项为空,是因为init识别sysinit是系统初始化的动作。Rc.sysinit脚本执行很多任务,包括设置主机名,启动交换分区,检查文件系统和加载核心模块等。通常用户不需要对/etc/rc.sysinit脚本做任何修改。

三、 /etc/rc.d/rc脚本

当init程序被告知改变运行状态的时候,在/etc/inittab文件中的7行用来指定运行的程序:

l0:0:wait:/etc/rc.d/rc 0

l1:1:wait:/etc/rc.d/rc 1

l2:2:wait:/etc/rc.d/rc 2

l3:3:wait:/etc/rc.d/rc 3

l4:4:wait:/etc/rc.d/rc 4

l5:5:wait:/etc/rc.d/rc 5

l6:6:wait:/etc/rc.d/rc 6

对应的每个运行等级,将分别将运行等级作为参数,运行/etc/rc.d/rc脚本程序。这个脚本被用来启动和停止特定运行等级中的各种服务。比如,假如init被告知改变运行状态到5,那么下面的命令将被自动运行:

/etc/rc.d/rc 5

rc脚本将进行3个阶段的过程:

● 检查并确认指定运行等级下子目录是否存在。假如rc命令运行的参数是5,那么该脚本检查/etc/rc.d/rc5.d目录是否存在。假如存在,则继续执行,假如不存在,运行登记就不会改变。

● 检查在指定运行等级的该运行的程序是否在运行,假如已经运行,脚本将杀死关闭该程序,以保证在下个阶段正常启动。

● 所有以K开头的脚本文件会被停止并重新启动,所有以S开头的脚本文件会被启动。

一个典型的/etc/rc.d/rc5.d下的文件列表见下面:

lrwxrwxrwx 1 root root 16 May 21

12:54 K08autofs -> ../init.d/autofs

lrwxrwxrwx 1 root root 15 May 21

12:54 K15httpd -> ../init.d/httpd

lrwxrwxrwx 1 root root 18 May 21

12:54 S75keytable ->

/init.d/keytable

lrwxrwxrwx 1 root root 13 May 21

12:54 S85gpm -> ../init.d/gpm

/etc/rc.d/init.d目录下的文件有两种方式被连接,某些脚本形式如下:

K[2位数字]script-name

其它一些脚本形式如下:

S[2位数字]script-name

以S开始的脚本表示启动脚本,以K开始的脚本表示停止脚本。2位数字指定了这些脚本程序运行的优先顺序。越小的数字越先运行。比如K08autofs将先 于K15httpd脚本运行。当rc脚本运行结束后,init的过程也就结束,系统在指定的运行等级就可以使用了。

四、 /etc/rc.d/init.d目录

/etc/rc.d/init.d目录下是所有运行等级需要的脚本文件。每个脚本都可以用来启动或停止特定的服务。

所有的脚本都使用命令行语法。比如,要启动ipchains服务,下面的脚本将被执行:

/etc/rc.d/init.d/ipchains start

如果停止ipchains服务,下面的脚本将被执行:

/etc/rc.d/init.d/ipchains stop

/etc/rc.d/init.d目录下所有的脚本程序都使用start和stop参数启动或停止一项服务。这些脚本被连接到/etc/rc.d/rc[0-6]各个目录下。

五、 /etc/rc.d/rc.local脚本

/etc/rc.d/rc.local文件在运行等级2,3和5后运行一次。任何需要启动后运行的程序都可以写到该脚本中。

六、/etc/rc.d/rc.serial脚本

/etc/rc.d/rc.serial脚本通常在运行等级3和5中运行,用来对串口初始化。

七、启动系统

在启动系统中,init首先调用rc.sysinit脚本,然后运行默认运行等级下的程序,默认等级在/etc/inittab中指定,类似于下面的示例:

id:3:initdefault:

在这里,默认的值是3,表示init将运行让系统进入多用户模式的脚本。在/etc/rc.d/rc3.d目录下的以S开头的脚本程序将被运行。在这些脚本运行后,系统就进入到了指定的运行等级。

八、覆盖默认的运行等级

默认的运行等级可以通过在LILO提示符下输入参数而改变。语法如下:

[label] [run-level]

比如,如果将系统启动为单用户模式,而不是默认的运行等级3,可以输入:

linux single

或者

linux 1

来实现。

通过在LILO提示符下指定运行等级可以改变默认的运行等级。

九、关闭系统

关闭系统的最简单方法是改变到特定的运行等级。比如,

init linux 0

将关闭Linux系统。不过这个命令并不通知系统中的其它在线用户系统将要关闭,用户就无法有足够的时间保存他们手头的工作。更使用常用的办法是使用 shutdown命令关闭系统。Shutdown 命令会在系统中广播系统关闭的消息,系统管理员可以使用这个命令对关闭系统的时间进行安排和调度。下面是使用shutdown的一些示例:

shutdown –r now 表示立刻重新启动

shutdown –h 5 表示在5分钟后关闭和停止系统

shutdown –k 5 不关闭系统,但是向其它用户发送
这个消息

shutdown –c 取消运行的shutdown命令

十、在关闭系统进行时禁止用户登录

用户可以在关闭系统前的时间内登录系统。为了防止用户登录,可以在/etc目录下创建一个名为nologin的文件,并在该文件内写出关闭系统在进行中, 登录被禁止的话。在该文件创建后,需要在/etc/rc.local增加一行删除该文件的命令,以取消禁止用户登录的限制:

rm –f /etc/nologin

十一、让一般用户具有运行shutdown的权限

在默认的配置情况下,/etc/inittab文件允许普通用户使用键盘上的[Ctrl][Alt][Delete]键重新启动系统。在/etc/inittab文件中对应的条目是:

ca::ctrlaltdel:/sbin/shutdown –t3 –r now

该行内容允许使用[Ctrl][Alt][Delete]启动shutdown程序以重新启动系统。可以在该行前面加上#符号以禁止这个功能。为了让特定的用户可以使用shutdown命令

关闭系统,可以在/etc/目录下创建一个名为shutdown.allow的文本文件。里面列出的用户将可以使用shutdown命令重新启动系统。

十二、 处理电源故障

很明显地,管理员要处理电源引起的故障。当面对电源故障的时候首先确保系统能正常的关闭。默认的/etc/inittab文件包括如下的内容:

pf::powerfail:/sbin/shutdown –f –h +2 “Power failure;sysem shutting down”

电源故障由UPS处理,或者系统中的powerd进程向init进程发送SIGPWR信号。默认的情况是让系统在UPS的支持下运行2分钟后关闭。

假如在关闭过程中,电源得到了恢复,/etc/inittab文件中一行用来取消shutdown进程的运行:

pr:12345:powerokwait:/sbin/shutdown –c “Power Restored .Shutdown Cancelled”

当init收到SIGPWR信号,/etc/powerstatus文件同时包含OK字符串时,该行被执行。

十三、管理init文件

System V形式的init程序使用了一些文件,符号连接和目录。幸运地是,Linux有3个工具可以管理init文件:

● chkconfig。

● ntsysv。

● linuxconf。

十四、 使用chkconfig

chkconfig工具允许系统管理员维护运行等级中启动和停止服务的符号连接文件。它同时可以维护/etc/rc.d/init.d目录下的所有脚本程序。下面是使用chkconfig的一些典型应用。

● 列出可管理的服务

执行下面的命令列出每一个运行等级启动的服务:

/sbin/chkconfig –list

使用下面的命令检查特定服务的配置:

/sbin/chkconfig –list inet

前面的命令将列出各个运行等级中inet服务的具体配置情况,结果如下:

inet 0:off 1:off 2:off 3:on 4:on 5:on 6:off

输出结果表明,inet服务在系统运行等级3和5中启动。

● 增加新服务

为了在当前运行等级中增加可用的新的服务,可以运行下面的命令:

chkconfig –add httpd

该命令将在当前运行等级中增加httpd服务。

使用下面的命令给特定的运行等级增加新的服务:

/sbin/config –level 4 –add inet

这个命令将给运行等级4增加inet服务。

● 删除服务

使用下面的命令从当前运行等级中删除一项服务:

/sbin/chkconfig –del inet

这个命令将从当前的运行等级中删除inet服务。

使用下面的命令从指定的运行等级中删除一项服务:

/sbin/chkconfig –del gated –level 5

这个命令将从运行等级5中删除gated服务。

十五、使用ntsysv

ntsysv工具允许通过一个简单的菜单管理服务。在当前的运行等级下启动该命令,可以使用:

/usr/sbin/ntsysv

选择希望启动的服务,点击OK。

在指定的运行等级下使用ntsysv,可以使用:

/usr/sbin/ntsysv –level

比如,配置运行等级4下的ntsysv,可以使用:

/usr/sbin/ntsysv –level 4

十六、 使用linuxconf 按照下面的步骤使用linuxconf工具:

● 在命令行中,输入linuxconf命令。

● 选择Control|Control Panel | Control Service。

● 启动或禁止某项服务。

● 接受更改。

● 在退出linuxconf之前激活更改。



阅读(1692) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2009-05-04 17:39:03

good....