一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的

起因是在Centos 7上设置一个开机自启动脚本,查询资料时发现,linux发行版引入systemd后,导致目前网上关于服务管理方面的知识相对比较杂乱,所以在此做以整理,如有错误之处,烦请指正。

Linux服务管理命令

Linux服务分类

在学习Linux服务管理命令前,需要对Linux的服务有一定的了解。目前Linux服务的具体分类方式如下表:

Linux服务分类 RPM/Deb包安装的默认服务 独立的服务 基于xinet服务:现在很少用到,只做了解 源码包安装的服务

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服务启动经历过很长的一段时间发展,可以简化为三个阶段,即:

Linux服务启动 systemV init 传统的init,大多数的linux发行版都会兼容 管理命令为:service\chkconfig Upstart ubuntu曾经使用的init Systemd 新出现的init,很多linux发行版都已经或者计划转向Systemd 管理命令为:systemd

运行级别说明

运行级别 说明 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启动流程

开机自检 MBR引导 GRUB菜单 加载内核 init进程初始化

init进程启动过程

  1. 读取配置文件 /etc/inittab
  2. 调用执行/etc/rc.d/rc.sysinit
    启动交换分区;检查磁盘;设置主机名;检查并挂载文件系统;加载并初始化硬件模块.
  3. 执行缺省的运行级别模式
    inittab文件会告诉init进程要进入什么运行级别,在哪里可以找到该运行级别的配置文件.
  4. 执行/etc/rc.d/rc.local脚本文件

在非systemV init启动的Linux发行版中,没有rc.d目录。
读取inittab文件会提示:一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的

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 的可执行文件。
一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的
查看这个文件发现:
一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的

Init存在的问题

  • 启动时间长。init是串行启动,只有前一个进程启动完,才会启动下一个进程,
  • 启动脚本复杂。Init进程只是执行启动脚本,脚本需要自己处理各种情况,导致脚本内容变得很长。如apacha启动脚本共355行
    一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的
  • 无法处理服务之间的依赖关系。例如A依赖B,那么B启动之前需要先启动A,如果A无法启动,B也不应该启动,但由于 SysVinit 是顺序执行的,即使配置了先启动 A再启动B,A启动失败,B依然会被启动,从而导致服务异常。

Upstart

基于以上问题和其他种种原因,Ubuntu的开发人员重新设计并开发了一款全新的服务管理系统,即Upstart。

UpStart采用事件驱动模型,基于事件机制。Upstart 不仅能在运行级别改变的时候启动或终止服务,也能在接收到系统发生其他改变的信息的时候启动或终止服务。这些系统的改变就是“事件”

由于Debian已经决定使用systemd,所以对于Upstart这里不做详细介绍,如果想要详细了解Upstart具体流程,可以参考: 这篇文章.

Systemd

Linux启动流程

开机自检 MBR引导 GRUB2菜单 加载内核 Systemd进程初始化

Systemd进程的启动过程

  1. systemd 执行默认target 配置
  2. systemd 执行启动所依赖的目标basic.target和sysinit.target初始化系统
  3. systemd 启动multi-user.target 下的本机与服务器服务
  4. 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 可执行文件

一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的可见,程序链接到lib/systemd/system下的service文件

一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的查看apach2.service文件,其指向/usr/sbin下的可执行文件

systemctl命令管理systemd的资源Unit

systemd的Unit放在目录/usr/lib/systemd/system或/etc/systemd/system

.mount文件

一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的.mount文件定义了一个挂载点,[Mount]节点里配置了What,Where,Type三个数据项等同于以下命令:

mount -t hugetlbfs /dev/hugepages hugetlbfs

.service文件

一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的

.service文件定义了一个服务,分为[Unit],[Service],[Install]三个小节

[Unit]
Description:描述,
After:在network.target,auditd.service启动后才启动
ConditionPathExists: 执行条件
[Service]
EnvironmentFile:变量所在文件
ExecStart: 执行启动脚本
Restart: fail时重启
[Install]
Alias:服务别名
WangtedBy: 多用户模式下需要的

.target文件

一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的.target定义了一些基础的组件,供.service文件调用

.wants文件

一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的.wants文件定义了要执行的文件集合,每次执行,.wants文件夹里面的文件都会执行

xinetd服务启动方式

在/etc/xinetd.d中创建相关服务文件,如:

vim /etc/xinetd.d/telnet

重启xinetd服务
一篇文章搞定Linux服务管理问题,了解在Linux下服务是怎样启动的

源码包服务启动方式

使用绝对路径,调用启动脚本启动(通常在安装软件时,可查看安装说明)

/usr/loacl/nginx/bin/nginx start|stop

注:可以通过创建软连接的方式,将启动文件链接到service或chkconfig或systemctl相关目录,从而被其识别,但一般不推荐使用,所以本文不做赘述。如有需要可自行查找资料。

上一篇:如何在linux上手动连接到互联网


下一篇:ubuntu 16.04配置journalctl