替换 init 的另外一种选择是 upstart,它使用的方法与 initng 使用的方法稍有不同。 upstart 是一个基于事件的 init 的替代程序,这意味着服务的启动和停止都基于事件的通信。 upstart 正在由 Scott James Remnant 进行开发,用于 Ubuntu 发行版,不过它想要成为任何 Linux 发行版上 init
的通用替代程序。
1,upstart 的工作原理
Upstart 要求您更新初始化脚本来支持基于事件的操作模式。upstart 维护自己的在系统启动时启动的 init 进程(对于所有其他方法也是如此)。 首先,init 会发出 startup 事件 —— 这是两个核心事件之一。事件 startup 是由 init 在系统启动时发出的,事件 shutdown 则是在系统关闭时发出的。其他核心事件包括 ctrlaltdel,它说明您按下了 Ctrl-Alt-Delete,或 kbdrequest,它用来说明您按下了 Alt-Up(向上箭头)键组合。
您可以为其他用法创建新事件。例如,您可以创建一个名为 myevent 的任意事件,并使用 echo 命令表示该事件的接收。请使用下面这个简短的作业:
on myevent
exec echo myevent received
console output
这段代码指定在接收到 myevent 事件时将触发该作业。然后代码执行指定的操作(向控制台发出文本)。使用 upstart 配置(/etc/event.d)中给出的文件,可以使用 initctl 工具触发它:
initctl emit myevent
upstart 使用的脚本文件的工作方式类似与传统的 rc init 文件,它们是基于异步事件自发操作的。清单 3 提供了一个简单的样例脚本,它可以接收 3 个事件: startup,启动作业;shutdown 和 runlevel-3,停止作业。shell 执行作业的 script 部分的内容(使用 -e 选项来结束出错脚本)。
清单 3.
sysvinit rc 2 脚本的简化 upstart 脚本
start on startup
stop on shutdown
stop on runlevel-3
script
set $(runlevel --set 2 || true)
exec /etc/init.d/rc 2
end script
initctl 工具提供了类似于 telinit 的功能,不过增加了一些特定于 upstart 的特性。正如您前面看到的一样,您可以使用 initctl 和 emit 选项为 upstart 生成一个事件。list 选项让您可以通过标识作业状态来深入了解系统操作。它告诉您目前正在等待哪些服务,以及哪些服务目前是活动的。initctl 工具还可以显示用于调试而接收的事件。
Upstart 是 init的一个有趣的替代程序,并且具有一些独特的优点。实际上已经不存在什么理由再使用运行级别了,因为系统将充分利用硬件进行引导。任何没有给出的硬件都不会触发需要它的任务。Upstart 也可以很好地处理热插拔设备。例如,如果在完成系统引导很长时间以后插入了一块 PCMCIA 网卡,那就会生成 network-interface-added 事件。这个事件会引起动态主机配置协议(Dynamic Host Configuration Protocol,DHCP)作业来对这个网卡进行配置,生成一个 network-interface-up 事件。当为这个新接口分配一个默认路由时,会生成一个 default-route-up 事件。此时,需要网络接口的作业(例如邮件服务器或 Web服务器)就可以自动启动(如果接口消失,这些服务将会自动停止)。
2,使用 upstart
编译和安装 upstart 非常简单,并且遵循典型的 configure、make 和 make install 模式。
Upstart 提供了一组示例作业,它们与典型的 init 配置兼容。与 initng 类似,新应用程序必须要根据需求编写自己的作业(可能还需要添加新事件)。不管怎样,部署新的 init 系统都会有一些风险。不过 upstart 的优点当然值得去冒这些风险并执行其他必要的操作。
正如上面介绍的一样,initctl 工具提供了人们对 telinit 所期望的功能。不过 initctl 也为跟踪和调试提供了附加功能。
阅读(15842) | 评论(0) | 转发(1) |