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 表示启动顺序,数字小先执行
启动目录下使用符号链接,便于在不同的运行级别中统一管理启动脚本
系统会根据指定的运行级别进入对应的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 –list | grep xxx |
添加开机启动服务
在/etc/init.d目录下添加启动脚本,赋予可执行权限。在对应运行级别的启动目录下创建符号链接, 指向/etc/init.d目录下的启动脚本
1
$ ln -s /etc/init.d/myservice /etc/rc5.d/S99myservice
或者执行
1
chkconfig --add xxx
部分参考: https://blog.csdn.net/xhrc007/article/details/107939541
sysV init 切换到 systemd
注意 ‘service’ 和 ‘chkconfig’ 命令 这两条命令在 systemd 环境下依然可用,该教程目的在于告诉您如何使用原生 systemctl 替代品。
service
Sysvinit 命令 | Systemd 命令 | 备注 |
---|---|---|
service frobozz start | systemctl start frobozz.service | 用来启动一个服务 (并不会重启现有的) |
service frobozz stop | systemctl stop frobozz.service | 用来停止一个服务 (并不会重启现有的)。 |
service frobozz restart | systemctl restart frobozz.service | 用来停止并启动一个服务。 |
service frobozz reload | systemctl reload frobozz.service | 当支持时,重新装载配置文件而不中断等待操作。 |
service frobozz condrestart | systemctl condrestart frobozz.service | 如果服务正在运行那么重启它。 |
service frobozz status | systemctl 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 on | systemctl enable frobozz.service | 在下次启动时或满足其他触发条件时设置服务为启用 |
chkconfig frobozz off | systemctl disable frobozz.service | 在下次启动时或满足其他触发条件时设置服务为禁用 |
chkconfig frobozz | systemctl is-enabled frobozz.service | 用来检查一个服务在当前环境下被配置为启用还是禁用。 |
chkconfig –list | systemctl list-unit-files –type=service (推荐)或 ls /etc/systemd/system/*.wants/ | 输出在各个运行级别下服务的启用和禁用情况 |
chkconfig frobozz –list | ls /etc/systemd/system/*.wants/frobozz.service | 用来列出该服务在哪些运行级别下启用和禁用。 |
chkconfig frobozz –add | systemctl 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 目标 | 备注 |
---|---|---|
0 | runlevel0.target, poweroff.target | 关闭系统。 |
1, s, single | runlevel1.target, rescue.target | 单用户模式。 |
2, 4 | runlevel2.target, runlevel4.target, multi-user.target | 用户定义/域特定运行级别。默认等同于 3。 |
3 | runlevel3.target, multi-user.target | 多用户,非图形化。用户可以通过多个控制台或网络登录。 |
5 | runlevel5.target, graphical.target | 多用户,图形化。通常为所有运行级别 3 的服务外加图形化登录。 |
6 | runlevel6.target, reboot.target | 重启 |
emergency | emergency.target | 紧急 Shell |
改变运行级别
Sysvinit 命令 | Systemd 命令 | 备注 |
---|---|---|
telinit 3 | systemctl 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 | 设置在下一次启动时使用多用户运行级别。 |