http://www.ibm.com/developerworks/cn/linux/1407_liuming_init2/
http://www.ibm.com/developerworks/cn/linux/1407_liuming_init1/index.html
近年来,Linux 系统的 init 进程经历了两次重大的演进,传统的 sysvinit 已经淡出历史舞台,新系统 UpStart 和 systemd 各有特点,而越来越多的 Linux 发行版采纳了 systemd。本文简要介绍了这三种 init 系统的使用和原理,每个 Linux 系统管理员和系统软件开发者都应该了解它们,以便更好地管理系统和开发应用。本文是系列的第二部分,主要讲述 UpStart 的特点和使用。
sysvinit
不同的 Linux 发行版在这些 sysvinit 的基本工具基础上又开发了一些辅助工具用来简化 init 系统的管理工作。比如 RedHat 的 RHEL 在 sysvinit 的基础上开发了 initscripts 软件包,包含了大量的启动脚本 (如 rc.sysinit) ,还提供了 service,chkconfig 等命令行工具,甚至一套图形化界面来管理 init 系统。其他的 Linux 发行版也有各自的 initscript 或其他名字的 init 软件包来简化 sysvinit 的管理。
sysvinit-tools-2.87-5.dsf.el6.x86_64 原始包
initscripts-9.03.40-2.el6.centos.x86_64 红帽开发的包 service命令
chkconfig-1.3.49.3-2.el6_4.1.x86_64 红帽开发的包 chkconfig命令
Sysvinit 的优点是概念简单。Service 开发人员只需要编写启动和停止脚本,概念非常清楚;将 service 添加/删除到某个 runlevel 时,只需要执行一些创建/删除软连接文件的基本操作;这些都不需要学习额外的知识或特殊的定义语法(UpStart 和 Systemd 都需要用户学习新的定义系统初始化行为的语言)。
其次,sysvinit 的另一个重要优点是确定的执行顺序:脚本严格按照启动数字的大小顺序执行,一个执行完毕再执行下一个,这非常有益于错误排查。UpStart 和 systemd 支持并发启动,导致没有人可以确定地了解具体的启动顺序,排错不易。
但是串行地执行脚本导致 sysvinit 运行效率较慢,在新的 IT 环境下,启动快慢成为一个重要问题。此外动态设备加载等 Linux 新特性也暴露出 sysvinit 设计的一些问题。针对这些问题,人们开始想办法改进 sysvinit,以便加快启动时间,并解决 sysvinit 自身的设计问题。
Upstart 是第一个被广泛应用的新一代 init 系统。我们在接下来的第二部分介绍 UpStart。
systemV systemd bsd upstart
/usr/sbin/asterisk -f -vvvg -c
/etc/rc.d/init.d/asterisk
/bin/sh /usr/sbin/safe_asterisk
/usr/sbin/httpd
/etc/rc.d/init.d/httpd
/usr/sbin/apachectl
/usr/sbin/snmpd -LS0-6d -Lf /dev/null -p /var/run/snmpd.pid
/etc/rc.d/init.d/snmpd
/sbin/rsyslogd -i /var/run/syslogd.pid -c 5
/etc/rc.d/init.d/rsyslog
auditd
/etc/rc.d/init.d/auditd
http://blog.csdn.net/kumu_linux/article/details/7653802
systemd是Linux下的一种init软件,由Lennart Poettering(英语:Lennart Poettering)带头开发并在LGPL 2.1及后续版本许可证下开源发布。其开发目标是提供更优秀的框架以表示系统服务(英语:Service (systems architecture))间的依赖关系,并以此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销(英语:Computational overhead)的效果,最终代替现在常用的System V与BSD风格init程序。systemd 是 Linux 下一个与 SysV 和 LSB 初始化脚本兼容的系统和服务管理器。systemd 使用 socket 和 D-Bus 来开启服务,提供基于守护进程的按需启动策略,保留了 Linux cgroups 的进程追踪功能,支持快照和系统状态恢复,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有前卫的并行性能。systemd 无需经过任何修改便可以替代 sysvinit 。systemd已纳入众多Linux发行版的软件源中,Fedora 15及后续版本都采用的systemd作为Linux下的默认init程序。(在 Fedora 14 的特性中,systemd 是作为一个技术预览。在 Fedora 15 中替代 Upstart 作为默认管理器,具体可参见fedora官方文档说明点击打开链接 )
SysVinit守护进程(sysvinit软件包)是一个基于运行级别的系统,它使用运行级别(单用户、多用户以及其他更多级别)和链接(位于/etc /rc?.d目录中,分别链接到/etc/init.d中的init脚本)来启动和关闭系统服务。Upstart init守护进程(upstart软件包)则是基于事件的系统,它使用事件来启动和关闭系统服务。
最近剛好將某個過去架設的 Heroku-like server,用 Upstart 將傳統的 System V 替換掉,在此做個筆記,這篇文章不會教你怎麼寫啟動腳本,就只是個簡介。
Upstart 早在 Ubuntu 6.10 的時候首次出現,以取代傳統的 sysvinit。結果因為好評不斷,Fedora 9、Debian、Google Chrome OS 也相繼使用。其中一個最大的原因在啟動程序時採用了異步啟動(asynchronously)的方式。即便如此,鑑於不是所有的程式都有 upstart 的格式,最新的 Ubuntu 版本仍然保留了傳統的 sysvinit 啟動方式。
System V
若遵循古法,當希望某程式能在 Linux 啟動的時候執行,會放個腳本在 /etc/init.d,(通常能在 /etc/init.d/skeleton 找到範例),同時用 update-rc.d(在 RedHat 家族是 chkconfig)決定是否啟用該服務。這個指令會根據 /etc/init.d/ 產生一堆軟連結(symbolic links)在 /etc/rc#.d/。內容物大概長的像 K##foo 或 S##bar,用以決定 kill 或 start 的順序。
但是系統要啟動的時候,由於程序是乖乖的依序一個個執行(即便沒有相依關係),這將大大降低啟動的速度。為了改善這個問題,Upstart 誕生了。
Upstart
Upstart 是一個事件驅動的啟動工具,根據 job definition files(/etc/init/*.conf),定義哪些服務應該在何時、何種情境下被執行,有別於 System V 的依序啟動,Upstart 的程序是異步執行的,好處是可以有效的利用系統資源,讓系統更快速的啟動(例如網路正在初始化的時候可以同時啟動一些硬碟或處理器相關的服務)。此外比起 System V 格式的腳本,*.conf 的腳本更易於閱讀使用。
linux或unix有两种方式的启动模式:System V和BSD
最大的不同就是:System V能够为不同的运行级别定义启动哪些服务,比如:
# 0 - 停机(千万不要把initdefault设置为0 )
# 1 - 单用户模式
# 2 - 多用户,但是没有NFS
# 3 - 完全多用户模式(无界面的黑框框)
# 4 - 没有用到
# 5 - X11(图形界面)
# 6 - 重新启动(千万不要把initdefault设置为6 )
采用System V的启动模式,可以灵活的定义在 3 的运行级别下开机启动 FTP 服务,而在 5 的运行级别下开机不启动 FTP 服务。
采用BSD没有运行级别的概念。
启动脚本的不同:
BSD启动方式:在/etc/rc.d和/usr/local/etc/rc.d中存放启动服务的脚本,在/etc/rc.conf中设置xxx_enable="YES"或xxx_enable="NO"随系统启动启动或关闭服务,该文件是/etc/defaults/rc.conf的一个子集。BSD启动方式没有运行级别,简单,但缺乏多样性。
System V启动方式:也就是linux采用的启动方式,启动服务的脚本放在/etc/rc.d/init.d下面,你能够在/etc/rc.d目录下面看到很多类似 rc0.d或rc2.d这样的目录,这就是为每个不同的运行级别定义启动哪些服务的目录,数字0 1 2就代表运行级别,进入这些目录,能看到很多链接文件,以S或K开头的这样文件分别表示在当前运行级别下是否开启这个服务,这些文件分别链接到/etc/rc.d/init.d/下面的很多可执行文件。
需要注意的是:在一些System V启动模式的操作系统上(如 RedHat9),除了有/etc/rc.d/init.d/这个目录,还有/etc/init.d/这个目录,其实 ls -l 一下可以看到,/etc/init.d/这个目录 本来就是链接到/etc/rc.d/init.d/的一个链接目录。
System V启动脚本启动的服务
/etc/rc.d/init.d/目录下的内容如下:这些常用的服务器都是System v的服务,要控制System V 的服务,我们可以使用以下命令
#/etc/rc.d/init.d/script {start|stop|restart|reload|condrestart|status}
stop:停止这个服务。
restart:先停止,再启动,也就是重新启动的意思。
reload:重新加载设定档,这个参数只有在服务已经启动的状况下才能使用。
condrestart:有条件的重新启动,这个服务必须是已经启动的,才会被重新启
动;如果这个服务尚未启动,则无须启动之。
status:察看目前服务的启动状态。
也可以使用service命令来执行脚本,例如 #service network {start|stop|restart|reload|condrestart|status}
System V的服务在不同级别下的默认开关可以不相同。我们还可以用两种方法来控制默认情况下,开机是否开启某些服务,使用chkconfig和ntsysv(图形方式,默认只能定义当前级别,不过可以增加参数来实现如# ntsysv –level 23)来控制。
#chkconfig --list //查看系统system v服务所有级别下的开关情况。
#chkconfig sshd on|off //更改sshd服务2-5级别的默认开关情况
#chkconfig sendmail off //所有级别关闭sendmail服务
#chkconfig --level 23 sendmail off //在2、3级别关闭sendmail服务
http://tonytonyjan.net/2013/06/26/system-v-and-upstart/
http://linux.chinaunix.net/docs/2007-01-08/3610.shtml SysV和BSD启动风格的比较
http://www.linuxsir.org/bbs/thread61525.html 中英双语 SysV和BSD启动风格的比较
Slackware版本:Slackware 7.0及以上
Slackware 使用BSD风格的init脚本,而很多别的发行版使用System V风格的init脚本。SysV和BSD脚本都是能让人读懂的,即它们都是shell脚本,而不是已编译的程序。主要的区别在于脚本是如何设计的。
SysV脚本倾向于接受诸如start、stop、restart之类的参数,依它所启动的程序而定。所以你可以用 /etc/init.d/bind start 这样的命令来启动BIND,并用 /etc/init.d/bind stop 来停止BIND。 内容来自dedecms
SysV的启动还倾向于使用符号链接来组织启动进程,例如在 /etc/rc.d/rc.4/中,可能会有指向别的目录中的真正的脚本的各种各样的符号链接。这些链接的命令会像是 S10network、S25xdm之类,其中的S表示启动(start)该项服务(如果是K,则表示kill),而数字指定了脚本执行的顺序。
SysV风格的启动脚本的主要优点在于能够设置成自动配置许多东西。例如,若你进入runlevel 6,你可以建立一个链接叫K75bind来终止BIND,前提是链接所指向的文件已经设置好来做这件事。
SysV风格脚本的主要缺点是太过弯弯绕。假如我想增加一个服务,我要先写一个SysV风格的脚本(不是容易的事),它至少要处理“start(还可能有“stop)。然后,我必须确保在每个要运行这个服务的runlevel中正确地设置好符号链接。如果恰好这个服务需要在已经连续编号的两个脚本之间运行,我就需要做一些对符号链接重新编号的工作(例如,S10xxx和S11yyy已经存在,而我想让zzzz在它们之间运行,我就需要对前两者之一重新建立符号链接来把zzzz挤进去)。 dedecms.com
想暂时改变SysV的启动进程也是非常痛苦的事情。假如我不想在下次启动时运行xxx服务,最简单的办法是删除S10xxx这个链接,不算难吧?但如果我想在每个runlevel中都去掉它,我就需要从每个有关目录中删除S10xxx这个链接。然后,假如我改了主意,想重新运行xxx,我需要手工重新建立所有的符号链接。
这样子无疑是在已经很复杂的启动进程上叠床架屋,而Slackware是不会这么做的:它用BSD风格的启动脚本。
BSD风格的脚本是直接了当的shell脚本,它们倾向于顺序运行,而不需要start或stop之类参数。只要系统进入了它们的runlevel就会执行,就这么简单。
BSD风格的主要缺点是你需要一些其他方法来控制后台服务。例如,若我要停止BIND,我要先用命令 ps ax|grep named 找出 named的PID,然后kill这个PID(或者用这个pid的文件名)。但是我不能简单地下个命令 /etc/init.d/bind stop (除非我已经写了个这样的SysV脚本)。
BSD风格脚本的主要优点是它们非常容易阅读和编辑。例如,若我想增加一个服务zzzz,我可以在 /etc/rd.d/rc.local中增加一行 /usr/local/bin/zzzz,这样只要是执行rc.local的runlevel,zzzz就会随之运行。假如我只想在runlevel 4执行zzzz,我可以把它放在 /etc/rc.d/rc.4 (不是目录,而是一个脚本)中。如果我要改变执行顺序,我只要把zzzz放在适当的服务之间,多数编辑器都支持在文件中间插入文本(就算ed都支持)。还有,你可以用注释的方式停止一个服务,然后去掉注释让它重新运行。 copyright dedecms
因此,当多数发行版采用SysV风格时,Slackware采用了BSD风格。对于许多Slackware用户,BSD风格的易用性胜过SysV风格的强大功能。当然,你可以有自己的意见。
与普遍的观点相反,从一种风格转到另一种并不那么困难,只要把inittab和rc文件从一个系统拷贝到另一个系统即可。init程序自身没有改变,所谓“风格多是在inittab和它所调用的脚本中设置的。
译注:现在slackware为了提高兼容性,在/etc/rc.d/提供了rc.sysvinit脚本以适应某些基于SysV启动过程的商业程序的需要。另外,在许多设置服务的脚本中,也接受start、stop、restart这一类参数,例如rc.sendmail、rc.sshd等。
RHEL 6通过将System V替换为Upstart加快了其启动速度。采用了这项新服务,红帽仍然可以向下兼容地保持以前的管理方式,这就意味着,你仍可以使用原来的方式来管理服务。
/etc/inittab 只用来配置系统默认运行级别,所有先前由/etc/inittab来设定的条目,现在都在/etc/init/目录中以单个文件的形式存在。
/etc/init/rcS.conf 通过启动大部分的基本服务来对系统进行初始化的设定
/etc/init/rc.conf 对启动各自的运行级别(runlevel)的设定
/etc/init/control-alt-delete.conf 定义当用户按“control-alt-delete”三个键时的系统行为
/etc/init/tty.conf、/etc/init/serial.conf 定义系统处理终端登录
另外/etc/sysconfig/init 中ACTIVE_CONSOLES决定了虚拟控制台的创建,AUTOSWAP是否自动检测交换分区,SINGLE单用户模式下的root使用的SHELL,默认为/sbin/sushell,另外/sbin/sulogin会在单用户模式启动之前弹出登录提示。
service --status-all这个命令参数的作用是循环/etc/init.d/下的服务
按照alpha顺序列出,但是显示的格式不统一,是由服务所决定,例如
Stopped
Firewall is not running
Usage:
netconsole module is not loaded
还有就是chkconfig --list列出的服务也是按照alpha顺序列出的