Linux bootloader squeue AND runlevel info(rc.d init.d daemons S K difference ) RUNLEVEL

来源:互联网 发布:冒险岛2网络延迟 编辑:程序博客网 时间:2024/05/19 10:56

1)一个 Linux 系统的引导过程可以分为几个阶段。
本文并不会解释所有的不同阶段,因为我们所关心只是当内核加载后的那一个阶段。您可以运行 /sbin/runlevel 命令来确定您的系统当前的运行级;当内核被加载并开始运行时会调用 /sbin/init 程序(/etc/init.d/*filename*)。这个程序以 root 身份运行,并且在开始引导时按照要求设定为"运行级"。


2)init如何初始化系统 
init 通过一个ASCII配置文件(/etc/inittab)来确定运行级。通常,init 会根据这个配置文件去运行/etc/rc.d/rc 脚本(/etc/rc*.d/"softlink filename"),并将运行级数字传递给这一脚本。 在本文看来,正是从运行 rc 脚本开始,事情才变得有趣;

备注:
rc.sysinit 脚本
在 Red Hat 系统中,在运行 rc 脚本之前,init 将首先运行 /etc/rc.d/rc.sysinit 脚本,这个脚本执行那些必需的底层设置任务,比如设置系统时钟,检查磁盘错误,然后挂载文件系统。
eg:
[root@chenxin rc.d]# ls /etc/rc.sysinit -al
lrwxrwxrwx 1 root root 15 Nov 6 2007 /etc/rc.sysinit -> rc.d/rc.sysinit,
其实/etc/rc.sysinit文件是指向/etc/rc.d/rc.sysinit文件的;同时,/etc/rc.d/rc3.d/下的启动脚本和/etc/rc3.d/下的没有区别,都是指向/etc/init.d/目录下的scripts的;

 服务程序在哪里? 
可选的服务程序目录:在一些 Linux 系统中,服务程序有时候是在 /etc/init.d 目录下-FEDORA10是这样的。通常在 /etc/rc.d/init.d/ 目录下可以找到服务程序(FEDORA中是在/etc/init.d/目录下)。如果你浏览一下这个目录,你就会发现相当多的(如果不是全部都是的话)服务程序实际上都是shell 脚本,用于调用其他程序完成实际的工作。 

 rc 脚本如何知道在每个运行级下去运行哪些脚本? 
回顾一下,如果我们不希望在某个运行级下运行某个脚本,我们如何告诉系统这样去做?答案是在 /etc/rc.d/ 目录下,在这个目录下,除了我们已经讨论过的 init.d/ 目录以外,还有一组目录,每一个目录对应一个运行级(/etc/rc.d/rc3.d/和/etc/rc3.d是相同的,没有区别,但为什么FEDORA中设置两个相同的软连接目录呢?是为了方便系统管理员管理系统用的吗?难道提供给不同平台下的管理员都可以用这些脚本吗?答案是/etc/rc3.d/目录是软链接到/etc/rc.d/rc3.d/目录的)。这些目录以 rc<runlevel>.d 的形式来命名,比如,对应运行级5的目录为 /etc/rc.d/rc5.d/ 。在这些rc.d目录中,每一个目录下都有一组符号链接,指向 /etc/rc.d/init.d(也可能是/etc/init.d/目录)中的真正的服务程序。实际上,后边我们会发现,每个服务事实上有两个符号链接(为什么是用两个呢?以后考证后再列出吧)。 

 
服务链接名(K S 标记的 Scripts文件,启动顺序和KS的执行顺序):
这些指向实际服务程序的符号链接的名字很重要,它们遵循严格的命名约定,这样 rc 脚本就知道如何处理它们。 为了便于标识,每个链接的名字都以它们所指向的服务的名字做为后缀。前缀由两部分构成:一个大写字母,紧跟着是一个两位的十进制数。前缀中的大写字母是"S"(表示"启动"),或者"K"(表示"杀死",或者停止)。两位数的大小范围是自00到99。 

启动和停止服务:
如果我们决定让 Linux 机器引导到图形模式(运行级5),当 init 调用 rc 脚本并传递给它运行级数字时,rc 
脚本将到 /etc/rc.d/rc5.d/ 中查找,并且去运行它所能找到的所有符号链接(也就是说,它将运行每个链接指向的程序/脚本)。它将在两个截然不同的阶段来运行这些链接;首先它会执行所有以"K"开头的链接,同时传递给它们参数"stop"。执行完以后,所有这些链接指向的服务都被停止。 
当 rc 脚本把所有需要停止的服务都停止后,它将去执行所有以"S"开头的链接,同时传递给它们参数"start"。执行完以后,所以这些链接指向的服务都被启动。rc 脚本也把参数"start"传递给每一个程序。
rc 把参数"tart"或者"stop"传递给每一个服务程序,这样做是为了只用一个服务程序可以启动或停止那个服务

——服务程序根据传递给它的参数值分辨系统是正在引导还是正在关闭。
[root@chenxin rc.d]# more /etc/init.d/sshd
#!/bin/bash
#
# Init file for OpenSSH server daemon
#
# chkconfig: 2345 55 25
# description: OpenSSH server daemon
#
# processname: sshd
# config: /etc/ssh/ssh_host_key
# config: /etc/ssh/ssh_host_key.pub
# config: /etc/ssh/ssh_random_seed
# config: /etc/ssh/sshd_config
# pidfile: /var/run/sshd.pid

# source function library
. /etc/rc.d/init.d/functions
#其实,在/etc/init.d/目录下的SCRIPTS和/etc/rc.d/init.d/下的是相同的(FEDORA10);

# pull in sysconfig settings
[ -f /etc/sysconfig/sshd ] && . /etc/sysconfig/sshd

RETVAL=0
prog="sshd"

# Some functions to make the below more readable
KEYGEN=/usr/bin/ssh-keygen
SSHD=/usr/sbin/sshd
RSA1_KEY=/etc/ssh/ssh_host_key
RSA_KEY=/etc/ssh/ssh_host_rsa_key
DSA_KEY=/etc/ssh/ssh_host_dsa_key
PID_FILE=/var/run/sshd.pid
......

start()
{
  # Create keys if necessary
  do_rsa1_keygen
  do_rsa_keygen
  do_dsa_keygen

  echo -n $"Starting $prog:"
  initlog -c "$SSHD $OPTIONS" && success || failure
  RETVAL=$?
  [ "$RETVAL" = 0 ] && touch /var/lock/subsys/sshd
  echo
}

stop()
{
  ......
}

reload()
{
  ......
}

case "$1" in
  start)
  start
  ;;
  stop)
  stop
  ;;
  restart)
  stop
  start
  ;;
  reload)
  reload
  ;;
  condrestart)
  if [ -f /var/lock/subsys/sshd ] ; then
  do_restart_sanity_check
  if [ "$RETVAL" = 0 ] ; then
  stop
  # avoid race
  sleep 3
  start
  fi
  fi
  ;;
  status)
  status $SSHD
  RETVAL=$?
  ;;
  *)
  echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
  RETVAL=1
esac
exit $RETVAL

有一个重要的方面我还没有解释——链接名的数字部分。在"S"或者"K"之后的两位十进制数是 rc 脚本用来确定启动链接(就是链接指向的服务)的 顺序的。数字较小(比如00,01,等等)的链接在数字较大(99是最大的)链接之前运行。我们会在本文后边的内容中再次提到这一重点问题。 
这看起来好象是非常复杂的系统,但实际上它提供了极好的灵活性,因为如果您想临时禁止某个特定运行级中的服务,只要把适当的符号链接删除即可。不过,手工管理这些链接可能会让人感觉厌烦,并且容易出错(尤其当您累了的时候),所以可以采用一个相对好一些的方法,使用 chkconfig 命令。

如何找出激活的服务:
想查看您已经激活了多少服务,运行这个命令: 
/sbin/chkconfig --list 

激活服务与运行服务的对比:
有时服务会由于某种原因无法启动,用下面这个命令查看当前有哪些服务正在运行: 
/sbin/service --status-all 
这个命令将为每个服务输出一行或多行,指出每个服务是否在运行,如果在运行,则列出服务的一些特定的输出,比如服务运行的PID(进程号)。service 命令没有手册页,但是您可以在运行这个命令时使用--help 选项,您就可以得到有关它的操作的一些帮助信息

(或许一个很明显的加快服务启动速度的方法是并行地启动所有的服务,这样它们就可以同时启动。不幸的是,虽然这听起来很吸引人,却不可行。原因是各个服务之间存在依赖的关系。Linux没有把这些依赖关系完全显式地表示出来,但是事实上这些依赖关系是存在的。还记得我们先前讨论的关于链接名字格式的问题吗?在"S"和"K"之后的两位数决定了链接(也就是它们指向的服务)的运行顺序。这些数字确定了一个硬性的顺序,这样一定程度上也强化了服务之间的依赖关系。)


关于作者
  James Hunt 是 英国 IBM Hursley 实验室的一名软件工程师。他不是一名赛车手,他的汽车也显然不是赛车。James 自己公开承认是一个Linux 迷,他一有机会就向其他的人来讲述相关的话题,并以此度过了很多美好的时光。他的工作内容是分布式平台(AIX,HP-UX,Linux,OS/400,Solaris和Windows)上的 WebSphere MQ 产品。他曾经做过 UNIX 系统管理员、数据库的管理和编程。他对 Linux 的文件系统和编译器感兴趣,并且他可能是现在仅有的 Perl 编码标准文档的作者。James 是一个古怪的人,喜欢写技术文档。在他的业余时间,他弹吉他,学瑜珈,开游艇,虽然他还未能设法把这些活动并行化。

 

http://chenxin6676.blog.163.com/blog/static/28950876200922031827758/

原创粉丝点击