起因是在Centos 7上设置一个开机自启动脚本,查询资料时发现,linux发行版引入systemd后,导致目前网上关于服务管理方面的知识相对比较杂乱,所以在此做以整理,如有错误之处,烦请指正。
Linux服务管理命令
Linux服务分类
在学习Linux服务管理命令前,需要对Linux的服务有一定的了解。目前Linux服务的具体分类方式如下表:
RPM、Deb包默认安装的服务
RPM包是红帽子(Redhat)下发行版使用的软件安装包,如Centos;Deb包是Debian下发行版使用的软件安装包,如Ubuntu。
他们的安装目录
/etc | 配置文件安装目录 |
---|---|
/usr/bin | 可执行的命令安装目录 |
/usr/lib | 程序使用的函数库保存位置 |
/usr/share/doc | 基本的软件使用手册保存位置 |
/usr/share/man | 帮助文件保存位置 |
独立的服务
独立启动的守护进程:stand-alone,每个特定服务都有单独的守护进程,这个处理单一服务的始终存在的进程就是独立启动的守护进程。
服务始终处于后台内存中,等待被调用。可以自行启动,不需要依赖其他的管理服务。优点是客户端请求访问时,独立服务的响应更快速响应速度快,缺点是耗费资源。
目前大多数服务都是独立的服务。
基于xinetd的服务
超级守护进程:多个服务统一由一个进程管理,该进程可以管理多个服务。
即服务不能独立启动,必须依靠管理服务(xinetd)来调用这种服务。优点是当有客户端发起请求时,先请求xinetd服务,由xinetd服务去唤醒响应的服务,占用的资源相对较少,缺点是响应速度较慢。
目前较新的linux发行版已经很少用xinetd服务,如需使用要手动安装:
sudo yum -y install xinetd
sudo apt -y install xinetd
源码包安装的服务
源码包一般由用户手动下载源码,解压编译,安装在指定的位置中,一般是/usr/local/目录或/opt/目录,根据用户习惯选择。
关于软件包和源码包的具体区别此处不做赘述,想进一步了解的自行查找相关资料
在服务管理方面的区别主要是:
rpm/deb安装的服务可以用系统服务管理命令(service、systemcal、chkconfig)进行管理
源码包安装的服务一般不能被服务管理命令识别(注:有办法实现)
Linux服务管理
Linux服务启动经历过很长的一段时间发展,可以简化为三个阶段,即:
运行级别说明
运行级别 | 说明 | systemV init命令 | systemd命令 |
---|---|---|---|
0 | 关机状态,使用该级别将会关机 | init 0 | poweroff |
1 | 系统救援模式,多用于系统维护 | init 1 | systemctl isolate rescue.target |
2 | 字符界面的多用户模式(不可访问网络) | init 2 | systemctl isolate mutil-user.target |
3 | 字符界面的完整多用户模式,大多数服务器主机运行此级别 | init 3 | systemctl isolate mutil-user.target |
4 | 未分配使用 | init 4 | systemctl isolate mutil-user.target |
5 | 图形界面的多用户模式,提供了图形桌面操作环境 | init 5 | systemctl isolate graphical.target |
6 | 重新启动主机 | init 6 | reboot |
查看运行级别:
- runlevel : 显示切换前的运行级别 和当前运行级别 (systemV init & systemd)
- systemctl get-default : 显示当前运行级别 (systemd)
永久设置开机模式:
- systemctl set-default multi-user.target 开机默认为文本模式
- systemctl set-default graphical.target 开机默认为图形模式
- 修改 /etc/inittab 默认运行级别配置文件
systemV init
Linux启动流程
init进程启动过程
- 读取配置文件 /etc/inittab
- 调用执行/etc/rc.d/rc.sysinit
启动交换分区;检查磁盘;设置主机名;检查并挂载文件系统;加载并初始化硬件模块. - 执行缺省的运行级别模式
inittab文件会告诉init进程要进入什么运行级别,在哪里可以找到该运行级别的配置文件. - 执行/etc/rc.d/rc.local脚本文件
在非systemV init启动的Linux发行版中,没有rc.d目录。
读取inittab文件会提示:
Init 进程的配置文件
参数 | 说明 |
---|---|
/etc/init.d/ | 服务启动脚本配置文件存放目录 |
/etc/inittab | 默认运行级别配置文件 |
/etc/init/rcS.conf | 系统初始化配置文件 |
/etc/init/rc.conf | 各运行级别初始化的配置文件 |
/etc/init/rcS-sulogin.conf | 单用户模式启动 /sbin/sushell 环境的配置文件 |
/etc/init/control-alt-delete.conf | 终端下的 ctrl+alt+del 热键操作的配置文件 |
/etc/sysconfig/init | tty终端的配置文件 |
/etc/init/start-ttys.conf | 配置tty终端的开启数量、设备文件 |
/etc/init/tty.conf 或 /etc/init/serial.conf | 控制tty终端的开启 |
独立服务的启动方式:
/etc/init.d/独立服务名 start|stop|status|restart
service 独立服务名 start|stop|status|restart
chkconfig 命令:
chkconfig --list [name] 服务列表[可根据实际需要,停掉不用服务]
chkconfig --add [name] 服务添加[如缺省,则从缺省的init脚本自动建立]
chkconfig --del [name] 服务删除[并把相关符号连接从/etc/rc[0-6].d删除]
chkconfig --level name <on|off|reset>
on 服务在改变运行级时的启动
off 服务在改变运行级时的停止
reset 指初始化服务信息
level 指运行级别;比如235表示运行级别为2、3、5
在 service 管理下,程序安装的时候,会自动的在 /etc/init.d 目录添加一个配置文件。当我们使用 service 控制程序时,实际是在/etc/init.d/ 配置文件中去寻找次程序的可执行文件。
比如执行开启http的服务:service apache2 start 。此时service 就会开启 /etc/init.d/apache2 配置文件里面指向的 /usr/sbin/httpd 的可执行文件。
查看这个文件发现:
Init存在的问题
- 启动时间长。init是串行启动,只有前一个进程启动完,才会启动下一个进程,
- 启动脚本复杂。Init进程只是执行启动脚本,脚本需要自己处理各种情况,导致脚本内容变得很长。如apacha启动脚本共355行
- 无法处理服务之间的依赖关系。例如A依赖B,那么B启动之前需要先启动A,如果A无法启动,B也不应该启动,但由于 SysVinit 是顺序执行的,即使配置了先启动 A再启动B,A启动失败,B依然会被启动,从而导致服务异常。
Upstart
基于以上问题和其他种种原因,Ubuntu的开发人员重新设计并开发了一款全新的服务管理系统,即Upstart。
UpStart采用事件驱动模型,基于事件机制。Upstart 不仅能在运行级别改变的时候启动或终止服务,也能在接收到系统发生其他改变的信息的时候启动或终止服务。这些系统的改变就是“事件”
由于Debian已经决定使用systemd,所以对于Upstart这里不做详细介绍,如果想要详细了解Upstart具体流程,可以参考: 这篇文章.
Systemd
Linux启动流程
Systemd进程的启动过程
- systemd 执行默认target 配置
- systemd 执行启动所依赖的目标basic.target和sysinit.target初始化系统
- systemd 启动multi-user.target 下的本机与服务器服务
- systemd 执行multi-user.target 下的/etc/rc.d/rc.local
systemd通过rc-local.service来实现兼容。在启动时会判断/etc/rc.local是否存在并且是可执行的,如果满足条件,会把rc-local.service服务加入到default.target中
Systemd进程的配置文件
参数 | 说明 |
---|---|
/etc/systemd/system/default.target | 取代/etc/inittab文件配置,通常符号链接到 /lib/systemd/system/graphical.target |
/run/systemd/system/ | 系统执行过程中所产生的服务脚本所在目录 |
/etc/systemd/system/ | 里面存放着不同级别的开启自启服务 |
/usr/lib/systemd/system/ 和 /lib/systemd/system/ (lib是/usr/lib的软链接 ) | 每个服务最主要的启动脚本设置,类似于之前的 /etc/init.d/ |
独立服务的启动方式
systemctl 独立服务名 start|stop|status|restart
systemd 的一些常用命令:
列出所有可用单元 : systemctl list-unit-files
列出所有运行的单元: systemctl list-unit-files | grep enabled
列出所有可用服务: systemctl list-unit-files --type=service
列出所有运行的服务: systemctl list-unit-files --type=service | grep enabled
屏蔽httpd服务:systemctl mask httpd
在 systemd管理下,程序在安装的时候,会自动的在 /usr/lib/systemd/system 目录添加一个配置文件,并将其链接到/etc/systemd/system/multi-user.target.wants中。当使用 systemctl 控制该程序时,实际是在**/etc/systemd/system/multi-user.target.wants/**配置文件中去寻找程序的可执行文件。
比如执行开启apache2服务:systemctl start apache2.service , systemctl 就会开启 apache2.service 配置里面指向的 /usr/sbin/httpd 可执行文件
可见,程序链接到lib/systemd/system下的service文件
查看apach2.service文件,其指向/usr/sbin下的可执行文件
systemctl命令管理systemd的资源Unit
systemd的Unit放在目录/usr/lib/systemd/system或/etc/systemd/system
.mount文件
.mount文件定义了一个挂载点,[Mount]节点里配置了What,Where,Type三个数据项等同于以下命令:
mount -t hugetlbfs /dev/hugepages hugetlbfs
.service文件
.service文件定义了一个服务,分为[Unit],[Service],[Install]三个小节
[Unit]
Description:描述,
After:在network.target,auditd.service启动后才启动
ConditionPathExists: 执行条件
[Service]
EnvironmentFile:变量所在文件
ExecStart: 执行启动脚本
Restart: fail时重启
[Install]
Alias:服务别名
WangtedBy: 多用户模式下需要的
.target文件
.target定义了一些基础的组件,供.service文件调用
.wants文件
.wants文件定义了要执行的文件集合,每次执行,.wants文件夹里面的文件都会执行
xinetd服务启动方式
在/etc/xinetd.d中创建相关服务文件,如:
vim /etc/xinetd.d/telnet
重启xinetd服务
源码包服务启动方式
使用绝对路径,调用启动脚本启动(通常在安装软件时,可查看安装说明)
/usr/loacl/nginx/bin/nginx start|stop
注:可以通过创建软连接的方式,将启动文件链接到service或chkconfig或systemctl相关目录,从而被其识别,但一般不推荐使用,所以本文不做赘述。如有需要可自行查找资料。