system V与systemd

system V与systemd

system V体系

发展到今天,大多数基于Linux的操作系统,使用的是System-V风格的init守护进程,换句话说,它们的启动处理由init进程管理,其管理功能在一定程度上继承了基于System V 的Unix操作系统。该守护进程根据运行级别(run level)的原则,系统的运行级别表示当前计算机的状态。

system V 7个运行级别含义

runlevel0: 系统停机状态,系统默认运行级别不能设置为0,否则不能正常启动,机器关闭。
runlevel1:单用户工作状态,root权限,用于系统维护,禁止远程登陆,就像Windows下的安全模式登录。
runlevel2:多用户状态,没有NFS支持。
runlevel3:完整的多用户模式,有NFS,登陆后进入控制台命令行模式。
runlevel4:系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
runlevel5:X11控制台,登陆后进入图形GUI模式,XWindow系统。
runlevel6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动。运行init 6机器就会重启。标准的Linux运行级别为3或5

system V运行原理

  1. linux系统类似于window系统一样可以自启动和禁止一些服务程序,在system V管理体系中,这些服务脚本程序存在于/etc/init.d文件夹下,在etc文件夹下,存在rc0,rc1 …rc6等目录,顾名思义,这些目录下的文件即为不同的运行级别需要启动或者禁止的服务,实际上,这些目录下的文件只是一些符号链接文件,指向init.d下相应的服务。
  2. linux系统init进程会根据inittab配置文件确定当前运行级别并执行相应级别rc目录的服务脚本程序,rc目录下存在两种文件,一种以S打头代表启动服务,一种以K打头禁止服务,字母后两位数字代表执行顺序,按从小到大顺序执行。
  3. 我们可用runlevel命令查看当前系统运行级别,init X(0~6)切换其它运行级别,若需要设置默认启动的运行级别,需要修改inittab文件id:2:initdefault:这一行,改后reboot即可默认级别生效。

system V基本工具

system V主要用chkconfig,sevice update-rc.d命令管理服务,在使用这些命令操作服务前,需要将相应服务脚本放入/etc/init.d目录中。
chkconfig基本命令如下:
- 添加服务 chkconfig –add servicename
- 使服务自动启动 chkconfig –level 2345 servicename on
- 使服务自动禁止 chkconfig –level 2345 servicename off
- 删除服务 chkconfig –del servicename
- 检查服务状态 chkconfig servicename status
- 显示所有已启动的服务 chkconfig –list
service基本命令如下:
- 启动某服务 service servicename start
- 停止某服务 service servicename stop
- 重启某服务 service servicename restart
update-rc.d基本命令如下:
- 删除服务 update-rc.d -f servicename remove
- 使服务在指定级别自动启动或禁止 update-rc.d service start 启动序号 2 3 4 5 . stop 禁止序号 0 1 6 .上述又等价于 update-rc.d servicename defaults 启动序号 禁止序号

systemd体系

systemd是Linux下的一种init软件,Systemd目的是要取代Unix时代以来一直在使用的init系统,兼容SysV和LSB的启动脚本,而且够在进程启动过程中更有效地引导加载服务。
在systemd的管理体系里面,以前的运行级别(runlevel)的概念被新的运行目标(target)所取代。tartget的命名类似于multi-user.target等这种形式,比如原来的运行级别3(runlevel3)就对应新的多用户目标(multi-user.target),run level 5就相当于graphical.target。
由于不再使用runlevel概念,所以/etc/inittab也不再被系统使用 — 无怪乎在新版本ubuntu上找不到inittab文件了。
而在systemd的管理体系里面,默认的target(相当于以前的默认运行级别)是通过软链来实现。如:
ln -s /lib/systemd/system/runlevel3.target /etc/systemd/system/default.target
在/lib/systemd/system/ 下面定义runlevelX.target文件目的主要是为了能够兼容以前的运行级别level的管理方法。 事实上/lib/systemd/system/runlevel3.target,同样是被软连接到multi-user.target。

systemd基本工具

systemd使用systemctl命令管理。
使用systemctl命令需事先将xxx.service脚本放入/etc/systemd/system目录中

  • 使服务自启动 systemctl enable xxx.service
  • 使服务自动禁止 systemctl disable xxx.service
  • 检查服务状态 systemctl status xxx.service
  • 启动某服务 systemctl start xxx.service
  • 停止某服务 systemctl stop xxx.service
  • 重启某服务 systemctl restart xxx.service

    每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install],我写的这个服务用于开机运行Node.js项目,具体内容如下:

[Unit]
Description=xiyoulibapi
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/node.js/pid
ExecStart=/usr/local/bin/forever start /node.js/xiyoulib/bin/www
ExecReload=/usr/local/bin/forever restart /node.js/xiyoulib/bin/www
ExecStop=/usr/local/bin/forever stop /node.js/xiyoulib/bin/www
PrivateTmp=true

[Install]
WantedBy=multi-user.target

[Unit]部分主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别

[Service]部分是服务的关键,是服务的一些具体运行参数的设置,这里Type=forking是后台运行的形式,PIDFile为存放PID的文件路径,ExecStart为服务的具体运行命令,ExecReload为重启命令,ExecStop为停止命令,PrivateTmp=True表示给服务分配独立的临时空间,注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!

[Install]部分是服务安装的相关设置,可设置为多用户的

推荐阅读