Home sysV init 简要介绍
Post
Cancel

sysV init 简要介绍

sysV init介绍

经典的init启动程序。使用的相关命令 service ,chkconfig。目前主流linux发行版已经不用了,简单了解。 另外,systemd可以兼容sysV init的配置脚本。

优点
概念简单,只需要编辑脚本。启动顺序确定,严格按照启动数字的大小顺序执行,一个执行完毕再执行下一个,有益于错误排查。

缺点
启动时间长,init是串行启动,只有前一个进程启动完,才会启动下一个进程。启动脚本复杂,init只是执行启动脚本, 不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长很复杂。

文件目录
/etc/init.d/
存放服务启动脚本,对于支持 service 的程序,安装的时候,会自动的在 /etc/init.d 目录添加一个配置文件
/etc/inittab
默认运行级别配置文件,Ubuntu18.04已经不存在了
/etc/rcN.d
存放每个启动级别需要启动的服务

运行级别

  • 0 关机状态,系统默认运行级别不能设为0,否则不能正常启动
  • 1 单用户工作状态,root权限,用于系统维护,禁止远程登陆
  • 2 字符界面的多用户模式(不可访问网络,没有NFS)
  • 3 字符界面的完整多用户模式,大多数服务器主机运行此级别(有NFS)
  • 4 系统未使用,保留
  • 5 图形界面的多用户模式,提供了图形桌面操作环境
  • 6 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动

查看运行级别

1
$ runlevel  

打印之前和当前的运行级别,如果某个运行级别不能确定用 N 表示,如果使用systemd作为启动进程,则 runlevel软连接到systemctl

切换运行级别

1
$ init N

N代表运行级别,init 0 关机,init 6重启。

配置文件的位置
init进程的配置文件是/etc/inittab,各种服务的配置文件存放在/etc/sysconfig目录。 而现在的systemd配置文件主要存放在/lib/systemd目录,在/etc/systemd目录里面的修改可以覆盖原始设置。

运行级别对应的启动目录

1
2
3
# 有7个目录,对应7个运行级别
# rc,表示run command(运行程序),最后的d表示directory(目录)
rc0.d/ rc1.d/ rc2.d/ rc3.d/ rc4.d/ rc5.d/ rc6.d/ rcS.d/

每个目录下都是一些符号链接文件,指向/etc/init.d/目录下的脚本

命名规则为K+nn+服务名或S+nn+服务名, 其中nn为两位数字
对于以K (kill)开头的文件,系统将终止对应的服务
对于以S (start)开头的文件,系统将启动对应的服务
nn 表示启动顺序,数字小先执行
启动目录下使用符号链接,便于在不同的运行级别中统一管理启动脚本

sysV_service

系统会根据指定的运行级别进入对应的rcN.d目录,并按照文件名顺序检索目录下的链接文件。
runlevel S并不是直接给用户使用,而是用来为Single user mode作准备。嵌入式环境一般也会用到这个 七个Runlevel,可以按类分为:

  • Single-User Mode
  • Multi-User Mode without GUI
  • Multi-User Mode with GUI
  • Reboot/Halt Mode

启动过程
执行 /sbin/init程序,启动init进程(PID=1),是linux的父进程,其他所有进程都是它的子进程。
init 读取 /etc/inittab文件,获知设定的运行级别,init 根据运行级别,去对应的/etc/rcN.d目录, 启动目录下指定的程序(开机自启动)

服务管理工具
service, chkconfig

动作指令 
启动某服务service httpd start 
停止某服务service httpd stop 
重启某服务service httpd restart 
检查服务状态service httpd status 
删除某服务chkconfig –del httpd 
使服务开机自启动chkconfig –level 5 httpd on 
使服务开机不自启动chkconfig –level 5 httpd off 
显示所有已启动的服务chkconfig –list 
加入自定义开机自启服务chkconfig –add test 
查询某个服务是否开机自启chkconfig –listgrep xxx

添加开机启动服务
在/etc/init.d目录下添加启动脚本,赋予可执行权限。在对应运行级别的启动目录下创建符号链接, 指向/etc/init.d目录下的启动脚本

1
$ ln -s /etc/init.d/myservice /etc/rc5.d/S99myservice

或者执行

1
chkconfig --add xxx

ex: sysV_add_service

部分参考: https://blog.csdn.net/xhrc007/article/details/107939541

sysV init 切换到 systemd

注意 ‘service’ 和 ‘chkconfig’ 命令 这两条命令在 systemd 环境下依然可用,该教程目的在于告诉您如何使用原生 systemctl 替代品。

service

Sysvinit 命令Systemd 命令备注
service frobozz startsystemctl start frobozz.service用来启动一个服务 (并不会重启现有的)
service frobozz stopsystemctl stop frobozz.service用来停止一个服务 (并不会重启现有的)。
service frobozz restartsystemctl restart frobozz.service用来停止并启动一个服务。
service frobozz reloadsystemctl reload frobozz.service当支持时,重新装载配置文件而不中断等待操作。
service frobozz condrestartsystemctl condrestart frobozz.service如果服务正在运行那么重启它。
service frobozz statussystemctl status frobozz.service汇报服务是否正在运行。
ls /etc/rc.d/init.d/systemctl list-unit-files –type=service (推荐)或ls /lib/systemd/system/.service /etc/systemd/system/.service用来列出可以启动或停止的服务列表。
chkconfig frobozz onsystemctl enable frobozz.service在下次启动时或满足其他触发条件时设置服务为启用
chkconfig frobozz offsystemctl disable frobozz.service在下次启动时或满足其他触发条件时设置服务为禁用
chkconfig frobozzsystemctl is-enabled frobozz.service用来检查一个服务在当前环境下被配置为启用还是禁用。
chkconfig –listsystemctl list-unit-files –type=service (推荐)或 ls /etc/systemd/system/*.wants/输出在各个运行级别下服务的启用和禁用情况
chkconfig frobozz –listls /etc/systemd/system/*.wants/frobozz.service用来列出该服务在哪些运行级别下启用和禁用。
chkconfig frobozz –addsystemctl daemon-reload当您创建新服务文件或者变更设置时使用。

在 SysVinit,服务可以任意定义命令。例如 service iptables panic 或 service httpd graceful。原生 systemd 服务不具有此能力。 当编写原生 systemd 服务配置时,任何以这种方式定义了额外命令的服务需要定义其他、特定于服务的方式来完成此项任务。

runlevel

Systemd 引入一个概念:target。它的用途和运行级别类似,但是运行起来有一些不同。每一个目标使用名称而不是数字命名的,服务于一个特定的目的。 一些 target 通过继承另一个 target 然后添加其他额外服务来实现。也有一些 systemd target 模仿通常的 sysvinit 运行级别, 于是您依然可以通过熟悉的telinit RUNLEVEL 来切换 target。在纯净 Fedora 系统上运行级别 0, 1, 3, 5, 和 6; 与特定的 目标 之间存在 1:1 的映射关系。 遗憾的是,对于用户自定义运行级别 2 和 4 没法实现类似的转换。如果您使用了这些运行级别,建议您用 /etc/systemd/system/$YOURTARGET 的方式 创建一个新的 systemd 目标,并以一个已有的运行级别作为基础 (您可以查看 /lib/systemd/system/graphical.target 作为例子), 创建一个目录 /etc/systemd/system/$YOURTARGET.wants,然后符号链接您想要启用的额外服务到该目录下 (您符号链接的服务位于 /lib/systemd/system)。

Sysvinit 运行级别Systemd 目标备注
0runlevel0.target, poweroff.target关闭系统。
1, s, singlerunlevel1.target, rescue.target单用户模式。
2, 4runlevel2.target, runlevel4.target, multi-user.target用户定义/域特定运行级别。默认等同于 3。
3runlevel3.target, multi-user.target多用户,非图形化。用户可以通过多个控制台或网络登录。
5runlevel5.target, graphical.target多用户,图形化。通常为所有运行级别 3 的服务外加图形化登录。
6runlevel6.target, reboot.target重启
emergencyemergency.target紧急 Shell

改变运行级别

Sysvinit 命令Systemd 命令备注
telinit 3systemctl isolate multi-user.target (OR systemctl isolate runlevel3.target OR telinit 3)改变至多用户运行级别。
sed s/^id:.*:initdefault:/id:3:initdefault:/ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target设置在下一次启动时使用多用户运行级别。

参考: SysVinit_to_Systemd_Cheatsheet

This post is licensed under CC BY 4.0 by the author.