这几天有空,看了前面几位老兄的翻译,觉得不错,可惜未翻完,等的我这个急啊,没办法,只好自己边翻边看了,刚翻完了一篇,拿出来给大伙看看,欢迎指正错误啊。
第九章 执行启动和关闭程序
目标
完成这一章,你应该能够做以下事情:
确定运行级别的基本原理
确定启动进程的状态
控制启动进程
执行系统关闭程序
确定运行级别的基本原理
一个运行级别是一个系统状态,通过一个数字或字母来描述,用来定义用户当前可用的服务和资源。系统总是运行于一个单一的运行级别
Solaris OE运行级别
0 关闭Solaris操作环境,显示boot PROM ok提示符,用于安全关闭系统电源
s或S Soaris OE单用户模式,所有临界文件系统被挂接,并且是可以访问的
1 系统运行于单用户管理状态,可以访问所有可用的文件系统
2 系统支持多用户操作,多个用户可以访问系统。所有系统守护进程都被运行,除了NFS服务
3 系统支持多用户操作,并且NFS共享可用,这是系统/etc/inittab文件中指定的默认级别
4 这一级别当前没有启用
5 关闭Solaris OE并且关闭系统电源
6 关闭Solaris OE,系统重启到默认的运行级别
确定系统当前运行级别
# who –r
改变运行级别
你可以用init命令手工进行运行级别间的转换。你也能够使用shutdown、halt、reboot和poweroff等命令来改变运行级别。
辨别boot程序的阶段
一般的,当系统打开电源时,PROM监视器运行一个POST程序,检查系统硬件和内存。如果没有发现错误,并且auto-boot?参数被设置为true,系统开始自动引导程序。
整个导入程序被描述为四个明显的阶段:
boot PROM阶段
boot程序阶段
kernel初始化阶段
init阶段
下图显示了详细启动阶段:
boot PROM阶段
在启动过程的第一部分,boot PROM阶段执行下面这些步骤:
PROM运行POST
boot PROM固件运行POST,确认系统的硬件和内存,如果自检成功完成,开始它的顺序启动。
PROM显示系统标识,模式类型、处理器类型和速度、键盘状态、PROM版本号、RAM数量、NVRAM系列号,以太网址和host ID。
boot PROM确定启动设备,通过读取PROM参数boot-device
boot PROM读位于默认启动磁盘设备上的位于0扇区的磁盘卷标
boot PROM从PROM中获得默认启动设备的启动程序
boot PROM读取叫做bootblk的系统主引导程序(位于1-15扇区),它包括一个UNIX文件系统读取器。(在系统安装期间,bootblk程序被installboot程序放置在磁盘上)
Boot命令把bootblk程序从本地设备导入内存。
boot程序阶段
接下来描述boot程序阶段:
bootblk从boot设备导入第二boot程序ufsboot到内存
到ufsboot的路径被记录在bootblk程序中,bootblk程序由Solaris OE指令installboot安装。
Ufsboot程序本地化,并且导入适当的两部分kernel
Kernel的内核是两片叫做genunix和unix的静态代码,genunix是与平台无关的通用kernel文件,unix是指定平台的kernel文件。
当usfboot把这两个文件导入到内存后,他们被组合成运行的kernel的形式。
在运行于32位模式的系统上,这两部分kernel位于目录/platform/`uname –m`/kernel
在运行于64位模式的系统上,这两部分kernel位于目录/platform/`uname –m`/kernel/sparcv9
kernel初始阶段
下面描述kernen初始化阶段:
kernel读它的配置文件,调用/etc/system
kernel初始化自身,并且开始导入模块
kernel使用ufsboot命令导入文件。当它为了挂接root文件系统已经导入足够多的模块的时候,它并不绘制ufsboot程序并且继续。(?)
kernel启动/etc/init进程
注意:/etc/init和/sbin/init进程被链接到一起。
SunOS kernel是一个很小的内核,由genunix和unix和很多动态导入的kernel模块组成。
模块由设备驱动,支持文件系统的二进制文件,流文件,也包括其他类型的为指定的系统任务使用的模块组成。
组成内核的典型模块位于目录/kernel和/usr/kernel中,同平台相关的模块位于目录/platform/`uname –m`/kernel和/platform/`uname –i`/kernel目录中。
下面描述各模块子目录的类型:
drv —— 设备驱动
exec —— 可执行文件形式
fs —— 文件系统类型,例如,ufs,nfs和proc
misc —— 各种混杂的模块(虚拟交换)
sched —— 调度类(继承执行调度)
strmod —— 流模块(归纳了用户和设备驱动间的连接)
sys —— 系统调用(定义应用所使用的接口)
/kernel/drv目录包括所有系统启动所用到的设备驱动。/usr/kernel/drv包括所有其他的设备驱动。
在启动时或需要的时候,如果应用发出要求,需要的模块被自动导入,当一个模块不再使用,它所使用的内存被另外一个任务需要的时候,它可能被卸载。
启动进程完成之后,当设备(例如磁带设备)被访问的时候,设备驱动被导入。这个进程叫做自动配置,因为当需要的时候,一些kernel驱动模块被自动导入
一旦初始化或重新配置启动,系统自检并且检查所有挂载的设备。
动态kernel安排的优点是使得整个kernel的大小更小,更有效的使用内存,允许简单的改变或调整。下图显示这个安排:
注意:sparcv9CUP是一类支持64位处理的CPU
/etc/system文件和kernel配置
警告:Solaris OE基于系统(内存,CPU等等)建立内核。大多数情况下,默认的内核的性能是非常足够处理系统上大多数日常活动。任何改变都应该极度小心。
/etc/system文件是改变系统启动时哪一个模块和参数将被内核加载的控制文件。默认的,这个文件中的所有行都被注释掉了。
改变内核的行为(或配置)需要编辑/etc/system文件。改变这个文件允许你改变内核的可加载模块的处理,也可以改变内核参数以调整系统性能。
ufsboot程序包含了一个默认可加载内核模块的列表,这些模块在系统启动是将被加载。然而,你能通过改变/etc/system文件越过这个列表,控制哪个模块和参数将被加载。
这个文件的所有改变将在系统重启后有效。
/etc/system文件能明确的控制:
系统启动时加载的默认kernel模块的查找路径。
Root文件系统类型和设备
启动时从系统自动加载的模块中排除在外的模块
在系统启动时而不是首次访问时强制加载的模块。
新值将覆盖默认kernel参数值。
注意:命令行长度必须小于等于80个字符,并且注释行以*开始以新的一行结束。
/etc/system文件被分成五个明显的段落:
moddir:
为默认可加载kernel模块设置查找路径。你能把多个查找路径列在一起,用空格或冒号分隔。如果模块没有在第一个目录里被发现,将查找第二个目录,依此类推。
Root设备和root文件系统配置:
设置root文件系统类型列表,默认是:rootfs:ufs
设置root设备。默认是boot程序驻留的设备的物理路径名。物理路径名是和系统平台和配置相关的,举例如下:
rootdev:/sbus@1,f8000000/esp@0,800000/sd@3,0:a
exclude:
kernel初始化期间不允许被加载的可加载kernel模块。例如:
exclude :sys/shmsys
forceload:
kernel初始化期间,强制加载的kernel模块,例如:
forceload :drv/vx
在用户或应用运行一个动作,当它的服务被初次访问时,默认动作将自动加载一个kernel模块。
Set:
为修改系统操作而改变内核参数,例如
set maxusers=40
编辑/etc/system文件
在你编辑/etc/system文件之前,你应该做一个备份。如果你在这个文件里输入一个错误的值。系统可能不能启动。
下面的例子显示怎样做一个原始的/etc/system文件的备份,并编辑/etc/system文件。
# cp /etc/system /etc/system.orig
# vi /etc/system
如果一个启动进程因为/etc/system文件的错误而失败了,使用交互式启动命令:boot –a。当你被要求输入一个system文件名的时候,输入你的备份的system文件的名称,或/dev/null为一个空的配置文件。
Init 阶段
系统启动进程的最后阶段是init阶段。在这一阶段期间,init守护进程启动运行控制(rc)脚本,启动其他进程。Init守护进程是一个通用程序。它的主要角色是从存储在/etc/inittab文件中的信息创建进程。
Init守护进程执行系统启动(rc)脚本,依次,执行一系列其他脚本。
Init接成功完成之后,默认的行为是显示系统命令行登陆符或GUI登陆窗口。
/etc/inittab文件
当你启动一个系统或使用init或shutdown命令改变运行级别时,init守护进程通过读取/etc/inittab文件中的信息,停止进程,启动程序,或执行二者,
inittab文件为init进程定义了三个重要的条目:
系统默认运行级别。
系统进入一个新的运行级别时要采取的动作
启动,监视,在终止后重启的进程
/etc/inittab文件中的每一行条目都包含下面的四个域:
id :rstate :action :process
注意:从rc脚本输出的信息是直接指向/dev/msglog文件的。Solaris 8 OE及以前的版本,所有这些信息都被写到/dev/console文件。/dev/msglog文件常常被用做系统启动或后台应用信息输出的收集。
Action域关键词
Initdefault :标识默认的运行级别,当init程序被初始调用的时候读取。Init程序决定初始进入哪一个运行级别时使用。默认是运行级别3。
Sysinit :在init程序企图访问控制台之前(在控制台登陆提示符之前)执行这个程序。Init进程继续读取inittab文件之前,等待这个进程的完成。
Wait :在移动到同一运行级别的下一条之前启动一个进程并等它完成。
Respawn :如果进程死掉了,init进程重启它。如果进程不存在,init启动它并继续读取inittab文件。如果程序不存在,不需要任何动作,init进程继续读取inittab文件。
Powerfail :仅仅init进程收到一个电源失败信号的时候执行这个进程。
警告:如果rstate域是空的,并且initdefault行被使用,rstat域被译为0123456,并且init进程默认进入运行级别6。这讲引起系统连续重启。
接下来将按顺序描述inittab文件每一行:
1. 初始化流模块
2. 配置套接字传输提供者
3. 初始化文件系统
4. 定义默认运行级别
5. 描述一个电源失败shutdown
6. 定义一个单用户模式
7. 定义运行级别0
8. 定义运行级别1
9. 定义运行级别2
10. 定义运行级别3
11. 定义运行级别5
12. 定义运行级别6
13. 定义到firmware的转换
14. 定义到power off的转换
15. 定义到reboot的转换
16. 初始化服务访问控制器
17. 初始化ttymon端口监视器,放置一个命令行提示符到控制台
init进程
init程序读取/etc/inittab文件做接下来的事情:
1. 标识initdefault条目,定义默认运行级别3。
2. 执行在action域有sysinit的任何进程条目以至于任何指定的初始化能够在用户登陆前发生。这包括/sbin/rcS的执行,它挂载并检查/(root),/usr,/var和/var/adm文件系统。、
3. 执行在rstat域有3和action域有一个合适的关键词(同默认的运行级别3三匹配的关键词)的任何进程条目。
在这个运行级别执行的命令包括:
/usr/sbin/shutdown – 仅仅在系统收到一个电源fail信号后init进程运行shutdown命令
/sbin/rc2 – 启动系统守护进程,使系统进入运行级别2(多用户模式)。
/sbin/rc3 – 为运行级别3启动NFS和其他网络资源服务器
/usr/lib/saf/sac – 启动设备端口监视器,例如ASCII终端和调制解调器。
/usr/lib/saf/ttymon – 启动ttymon进程,监控有登陆请求的控制台。在所有系统上默认的terminal_type都像在/etc/inittab中列出的那样是sun。
控制启动进程
Solaris OE提供一系列运行控制脚本(rc)以停止和启动同运行级别相关的典型的程序。
/sbin目录
每一个运行级别相关的rc脚本都位于/sbin目录。
Rc脚本被init进程执行以设置变量。测试环境和调用其他脚本启动和停止指定运行级别的进程。
Rc脚本rc0,rc5,rc6彼此是硬连接的。注意每一个脚本都被指派了相同的脚本inode号。
Solaris OE在/etc目录下为后向兼容提供了相同系列的rc脚本。这些脚本是到/sbin目录的rc脚本的符号连接。
运行控制脚本和他们的功能
/sbin/rc0 运行/etc/rc0.d/K*脚本然后/etc/rc0.d/S*脚本执行下面任务:
停止系统服务和守护进程
终止所有正在运行的进程
卸载所有文件系统
启动脚本应该仅仅完成快速系统清除功能
/sbin/rc1 运行/etc/rc1.d/S*脚本完成下面的任务:
停止系统服务和守护进程
终止所有正在运行的用户进程
卸载所有远程文件系统
如果前一运行级别是S,挂载所有本地文件系统
/sbin/rc2 运行/etc/rc2.d/S*脚本完成下面的任务:
如果前一运行级别是S,挂载所有本地文件系统
删除/tmp目录下的任何文件和子目录
配置系统帐号
配置默认路由
启动大部分系统守护进程
/sbin/rc3 运行/etc/rc3.d/K*脚本,然后运行/etc/rc3.d/S*脚本,完成下面的任务:
清理/etc/dfs/sharetab文件
共享/etc/dfs/dfstab文件中列出的所有资源
启动nfsd和mountd命令
/sbin/rc5 /sbin/rc6 运行/etc/rc0.d/K*脚本,然后运行/etc/rc0.d/S*脚本,完成下面的任务:
停止系统服务和守护进程
终止所有正在运行的进程
卸载所有文件系统
启动仅仅完成快速系统清除功能的脚本
/sbin/rcS 运行/etc/rcS.d脚本使系统到运行级别S:
建立一个最小网络
挂载/usr,/var和/var/adm目录,如果他们是分离的文件系统
设置系统名
检查/(root)和/usr文件系统
挂载伪文件系统(/proc和/dev/fd)
为重新配置启动重建设备条目
挂载单用户模式需要的其他文件系统
/etc/rc#.d目录
/etc/rc#.d目录包含启动和停止相应运行级别的系统进程附加的脚本
启动运行控制脚本
/etc/rc#.d启动脚本一直以ls命令排序的次序运行。以S开头的文件被运行以启动一个系统进程。这些脚本被适当的/sbin/rc#调用,这个脚本传递参数“start”给他们,如果他们的名字并不是以.sh结尾。没有参数被传递到.sh脚本。这些文件名的格式如下:
S##name-of-script
停止运行控制脚本
/etc/rc#.d停止运行脚本(也被看作是kill脚本)总是以命令ls排序的次序运行。用K开头的文件被运行以停止或杀死一个系统进程。这些脚本被合适的/etc/rc#调用,这个脚本传送参数“stop”给他们,如果他们的名字并不是以.sh结尾的。这些文件命名格式如下:
K##name-of-script
注意——以小写的k或s开头的文件名会被init进程忽略的,他们不会被执行。为使一个脚本不被运行,用合适的小写字母重命名它。
/etc/init.d目录
运行控制脚本位于/etc/init.d目录
运行控制脚本/etc/init.d/cron是到相应的运行控制脚本/etc/rc2.d/S75crom的硬连接。
每一个运行级别有单独脚本的好处是你能作为root用户在/etc/init.d目录中单独运行脚本。
你能停止或启动一个进程而不用改变系统运行级别。
建立新的运行控制脚本
为了定制一个系统,你能建立新的脚本启动和停止附加进程或服务
例如,为了消除手动启动一个数据库服务起的需求,你能创建一个当合适的网络服务已经启动之后,自动启动数据库的脚本。
为了增加运行控制脚本启动和停止一个服务,在/etc/init.d目录下建立脚本,在合适的/etc/rc#.d目录下创建连接,保证服务能够在恰当的运行级别下被启动和停止。
注意——图中halt和reboot命令并不像init和shutdown命令那样处理inittab文件。Init和shutdown命令运行状态间变换的首选的方法。
执行系统关闭程序
为了执行一个管理任务或维护活动,如果你预见到电源损耗或如果你需要把系统移动到一个新的地方,你能关闭Solaris OE。
Solaris OE需要一个干净的有序的关闭,停止进程,把内存中数据写到磁盘,卸载文件系统。
当然,系统关闭时你所需要的工作的类型决定了系统怎样被关闭和你使用哪一个命令。
下面描述了系统关闭的不同类型。
关闭系统到单用户模式
关闭系统,停止Solaris OE,显示OK提示符
关闭系统并且关闭电源
关闭系统并且自动重启到多用户模式。
为做这些类型的系统关闭,root用户可用的命令包括:
/sbin/init(使用运行级别S,0,1,2,3,5,6)
/usr/sbin/shutdown(使用运行级别S,0,1,5,6)
/usr/sibin/halt
/usr/sbin/poweroff
/usr/sbin/reboot
/usr/sbin/init命令
你可以使用init命令用一个干净有序的习惯shut down,power off或reboot一个系统。它执行rc0 kill脚本。然而,这个命令并不警告登陆的用户系统正在被关闭,没有宽限期。
/usr/sbin/shutdown命令
shutdown命令是一个调用init守护进程shutdown,power off或reboot系统的脚本。为了关闭进程和应用,它执行rc0 kill脚本。但是,不象init命令那样,shutdown命令做下面的事情:
通知所有登陆用户,系统将要被关闭
默认延迟关闭60秒
让你能够包括一个可选描述信息,告之你的用户发生了什
命令格式:
shutdown –y –g grace-period –i init-state optional message
-y选项预答了最后关闭确认问题,以至于命令以一个非交互方式运行。
-g grace-period允许你改变默认60秒延时为你自己指定的时间grace-period
-i init-state指定init进程将要获得的运行级别,默认是S
注意——如果shutdown命令显示错误消息:“shutdown:'i' – unknown flag”它指出shell已经定位并执行了/usr/ucb/shutdown命令。使用它的全路径(例如,/usr/sbin/shutdown)重新执行这个命令,或者设置PATH变量确保/usr/sbin位于/usr/ucb前面。
/usr/sbin/halt命令
halt命令完成一个立即系统关闭。它并不执行rco kill脚本,它不通知登陆用户,也没有宽限期。
/usr/sbin/poweroff命令
poweroff命令完成一个立即系统关闭。它并不执行rco kill脚本,它不通知登陆用户,也没有宽限期。
/usr/sbin/reboot命令
reboot命令完成一个立即关闭并且重新初始化,并启动系统到默认的运行级别3。Reboot命令不同于init 6命令,因为它并不执行rc0 kill脚本。