linux下系统自启动级别的分析

一、redhat 下添加自启动程序、服务

1、 有三种方法添加自启动服务

     ln -s 在/etc/rc.d/rc*.d目录中建立/etc/init.d/服务的软链接(*代表0~6七个运行级别之一);

  chkonfig 命令行运行级别设置;

  ntsysv 伪图形运行级别设置;

第一种方法多用于自己常见的脚本,第二种方法多用于系统已经存在的服务。这里只介绍第一种方法。

在Linux中有7种运行级别(可在/etc/inittab文件设置),每种运行级别分别对应着/etc/rc.d/rc[0~6].d这7个目录;/etc/rc[0~6].d其实是/etc/rc.d/rc[0~6].d的软连接,主要是为了保持和Unix的兼容性才做此策;

这7个目录中,每个目录分别存放着对应运行级别加载时需要关闭或启动的服务;

由详细信息可以知道,其实每个脚本文件都对应着/etc/init.d/目录下具体的服务;

K开头的脚本文件代表运行级别加载时需要关闭的,S开头的代表需要执行。

因此,当我们需要开机启动自己的脚本时,只需要将可执行脚本丢在/etc/init.d目录下,然后在/etc/rc.d/rc*.d中建立软链接即可;

  [root@localhost ~]# ln -s /etc/init.d/sshd /etc/rc.d/rc3.d/S100ssh;

  此处sshd是具体服务的脚本文件,S100ssh是其软链接,S开头代表加载时自启动;

  如果需要在多个运行级别下设置自启动,则需建立多个软链接;

  这种方式比较繁琐,适用于自定义的服务脚本;

  如果系统中已经存在某些服务(比如安装apache时就会有httpd服务项),可以使用下面的两种方式。

2、ubuntu下创建开机自启动脚本的方法

1)将你的启动脚本复制到 /etc/init.d目录下
以下假设你的脚本文件名为 test。
2) 设置脚本文件的权限
$ sudo chmod 755 /etc/init.d/test
3) 执行如下命令将脚本放到启动脚本中去:
$ cd /etc/init.d
$ sudo update-rc.d test defaults 95
注:其中数字95是脚本启动的顺序号,按照自己的需要相应修改即可。在你有多个启动脚本,而它们之间又有先后启动的依赖关系时你就知道这个数字的具体作用了。该命令的输出信息参考如下:
update-rc.d: warning: /etc/init.d/test missing LSB information
update-rc.d: see <http://wiki.debian.org/LSBInitScripts>
  Adding system startup for /etc/init.d/test ...
    /etc/rc0.d/K95test -> ../init.d/test
    /etc/rc1.d/K95test -> ../init.d/test
    /etc/rc6.d/K95test -> ../init.d/test
    /etc/rc2.d/S95test -> ../init.d/test
    /etc/rc3.d/S95test -> ../init.d/test
    /etc/rc4.d/S95test -> ../init.d/test
    /etc/rc5.d/S95test -> ../init.d/test
卸载启动脚本的方法:
$ cd /etc/init.d
$ sudo update-rc.d -f test remove
命令输出的信息参考如下:
Removing any system startup links for /etc/init.d/test ...
    /etc/rc0.d/K95test
    /etc/rc1.d/K95test
    /etc/rc2.d/S95test
    /etc/rc3.d/S95test
    /etc/rc4.d/S95test
    /etc/rc5.d/S95test
    /etc/rc6.d/K95test

3、六个运行级别分析

linux下/etc/rc[S 0-6]目录下的文件都是/etc/init.d/下面可执行文件或脚本的链接。
如果对ARM有些了解,可能会发现一点:ARM的绝对地址0x00000000处的那几个中断表,其处理方式与Linux对系统的不同状态的处理有点相似之处。比如ARM遇到reset信号之后就会去执行reset中断向量(其实也是一个编号),而linux遇到切换级别的信号(关机,halt,重启等信号),也会去执行/etc/rc[0-6].d/目录下的动作。由此,软硬件设计可以相通相互借鉴。现在简略讲讲linux的运行级别相关知识。
除此之后,一般/etc下可能还有/etc/rc.local,/etc/rc.sysinit文件,一般/etc/rc.local默认并不做什么实事,可能是系统留下的一个接口,供用户添加系统启动时执行的动作,它一般会执行在/etc/init.d/的后面,所以比较靠后。/etc/rc.sysinit在Redhat9.0里做的事比较多,有点类似执行/etc/rcS.d/下面的动作。
系统执行完init之后,会首先执行/etc/rcS/下面的以S[0-9][0-9]init_script为命名的初始化(如果改为以K开头,便不会被执行了),执行顺序以S后面的两位数字的由小到大的顺序;
之后会去找/etc/inittab定义系统运行级别的配置文件,根据initdefault指定的默认运行级别,而执行/etc/rc[0-6].d/下的初始化。
ubuntu则没有采用Linux传统的这种方式,而换了另外一种方法,在执行完/etc/rcS/下面的初始化后,会去/etc/event.d/rc-default里找运行级别,这个脚本首先判断从启动内核的参数命令行中寻找类似single的字串,如果找到,则定义运行级别1,否则再去找/etc/inittab,没有的话,则定义默认级别为2(可能是因为ubuntu主要是面向个人PC的桌面电脑,所以没有开启全功能多用户级别)。
添加一个服务:sudo update-rc.d srv_name defaults 99
删除一个服务 :sudo update-rc.d srv_name remove
临时重启一个服务:/etc/init.d/srv_name restart
临时关闭一个服务:/etc/init.d/srv_name stop
临时启动一个服务:/etc/init.d/srv_name start
当一个用户从(例如)运行级别 2 切换到运行级别 3 的时候,/etc/rd2.d/S[0-9][0-9]init_file_name会首先按字母顺序、然后以“stop”为第一个参数执行运行级别 3 的所有 K 脚本(/etc/rc3.d/K[0-9][0-9]init_script),再以“start”为第一个参数执行运行级别 3 的所有 S 脚本(/etc/rc3.d/S[0-9][0-9]init_script)。
可以通过runlevel命令查看系统当前的运行级别,telinit命令更改运行级别。

4、启动级别0、1、2、3、4、5、6的分析

0:停机
1:单用户形式,只root进行维护
2:多用户,不能使用net file system
3:完全多用户
5:图形化
4:安全模式
6:重启
其实,可以通过查看/etc/rc.d/中的rc*.d的文件来对比理解。。
init 0,对应的系统会运行,/etc/rc.d/rc0.d里指定的程序。我们来看下名称。 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值