systemctl --version
,查看版本。
whereis systemctl
,查看位置。
systemctl list-unit-files
,列出所有可用单元(服务)。
systemctl list-units
,列出所有运行中的单元。
systemctl --failed
,列出所有失败的单元。
systemctl list-unit-files | grep enable
,查看自启动的软件。
systemctl is-enabled mysqld.service
,查看某个单元是否开机启动。
systemctl status mysqld.service
,查看某个单元的状态。
systemctl start mysqld.service
,启动某个单元。
systemctl restart mysqld.service
,重启某个单元。
systemctl stop mysqld.service
,停止某个单元。
systemctl daemon-reload
,修改了某个单元的配置文件后,重载配置文件。
systemctl reload mysqld.service
,重载某个单元。
systemctl enable mysqld.service
,设置开机自启动。
systemctl disable mysqld.service
,关闭开机自启动。
systemctl kill mysqld
,杀死单元。
systemd简介
CentOS7已不再使用chkconfig管理启动项,而是使用systemd。
一、为什么是systemd
- Linux系统从启动到提供服务的过程是这样,先是机器加电,然后通过MBR或者UEFI加载GRUB,再启动内核,内核启动服务,然后开始对外服务。
SysV init UpStart systemd主要是解决服务引导管理的问题。
提示:关于systemd的拼写,官方的说法就是systemd,既不是Syetemd,也是不systemD。 - SysV init是最早的解决方案,依靠划分不同的运行级别,启动不同的服务集,服务依靠脚本控制,并且是顺序执行的。
SysV init方案的优点是:
原理简单,易于理解;
依靠shell脚本控制,编写服务脚本门槛比较低。
缺点是:
服务顺序启动,启动过程比较慢;
不能做到根据需要来启动服务,比如通常希望插入U盘的时候,再启动USB控制的服务,这样可以更好的节省系统资源。 - 为了解决系统服务的即插即用,UpStart应运而生,在CentOS6系统中,SysV init和UpStart是并存的,UpStart主要解决了服务的即插即用。服务顺序启动慢的问题,UpStart的解决办法是把相关的服务分组,组内的服务是顺序启动,组之间是并行启动。
- SysV init服务启动慢,在以前并不是一个问题,尤其是Linux系统以前主要是在服务器系统上,常年也难得重启一次。有的服务器光硬件检测都需要5分钟以上,相对来说系统启动已经很快了。
但是随着移动互联网的到来,SysV init服务启动慢的问题显得越来越突出,许多移动设备都是基于Linux内核,比如安卓。移动设备启动比较频繁,每次启动都要等待服务顺序启动,显然难以接受,systemd就是为了解决这个问题诞生的。
systemd的设计思路是:
尽可能的快速启动服务;
尽可能的减少系统资源占用。 - systemd使用并行的方法启动服务,不像SysV init是顺序执行的,所以大大节省了系统启动时间。
使用并行启动,最大的难点是要解决服务之间的依赖性,systemd的解决办法是使用类似缓冲池的办法。比如对TCP有依赖的服务,在启动的时候会检查依赖服务的TCP端口,systemd会把对TCP端口的请求先缓存起来,当依赖的服务器启动之后,在将请求传递给服务,使两个服务通讯。同样的进程间通讯的D-BUS也是这样的原理,目录挂载则是先让服务以为目录被挂载了,到真正访问目录的时候,才去真正操作。
二、SysV init
-
SystemV,曾经也被称为AT&T SystemV,是Unix操作系统众多版本中的一支。它最初由AT&T开发,在1983年第一次发布。一共发行了4个SystemV的主要版本:版本1、2、3和4。SystemV Release4,或者称为SVR4,是最成功的版本,成为一些UNIX共同特性的源头,例如”SysV初始化脚本“(/etc/init.d),用来控制系统启动和关闭,SystemV Interface Definition(SVID)是一个SystemV如何工作的标准定义。
-
SysV init用术语runlevel来定义"预订的运行模式"。SysV init检查'/etc/inittab'文件中是否含有'initdefault'项。来告诉init系统是否有一个默认运行模式。如果没有默认的运行模式,那么用户将进入系统控制台,手动决定进入何种运行模式。
SysV init中运行模式描述了系统各种预订的运行模式。通常会有8种运行模式,即运行模式0到6和S或者s。
每种Linux发行版对运行模式的定义都不太一样。但0,1,6却得到了大家的一致赞同:
0关机
1单用户模式
6重启
通常在/etc/inittab文件中定义了各种运行模式的工作范围。比如RedHat定义了runlevel3和5。运行模式3将系统初始化为字符界面的shell模式;运行模式5将系统初始化为GUI模式。无论是命令行界面还是GUI,运行模式3和5相对于其他运行模式而言都是完整的正式的运行状态,计算机可以完成用户需要的任务。而模式1,S等往往用于系统故障之后的排错和恢复。
很显然,这些不同的运行模式下系统需要初始化运行的进程,需要进行的初始化准备都是不同的。比如运行模式3不需要启动X系统。用户只需要指定需要进入哪种模式,SysV init负责执行所有该模式所必须的初始化工作。 -
SysV init巧妙地用脚本,文件命名规则和软链接来实现不同的runlevel。首先,SysV init需要读取/etc/inittab文件。分析这个文件的内容,它获得以下一些配置信息:
系统需要进入的runlevel;
捕获组合键的定义;
定义电源fail/restore脚本;
启动getty和虚拟控制台;
得到配置信息后,SysV init顺序地执行以下这些步骤,从而将系统初始化为预订的runlevelX:
/etc/rc.d/rc.sysinit
/etc/rc.d/rc和/etc/rc.d/rcX.d/(X代表运行级别0-6)
/etc/rc.d/rc.local
XDisplayManager(如果需要的话)1).rc.sysinit脚本功能:
激活udev和selinux;
设置定义在/etc/sysctl.conf中的内核参数;
设置系统时钟;
加载keymaps;
激活交换分区;
设置主机名(hostname);
根分区检查和remount;
激活RAID和LVM设备;
开启磁盘配额;
检查并挂载所有文件系统;
清除过期的locks和PID文件;2).rc.d脚本
根据不同的runlevel,rc脚本将打开对应runlevel的rcX.d目录(X就是runlevel),找到并运行存放在该目录下的所有启动脚本。每个runlevelX都有一个这样的目录,目录名为/etc/rc.d/rcX.d在这些目录下存放着很多不同的脚本。文件名以S开头的脚本就是启动时应该运行的脚本,S后面跟的数字定义了这些脚本的执行顺序。在/etc/rc.d/rcX.d目录下的脚本其实都是一些软链接文件,真实的脚本文件存放在/etc/init.d目录下,当所有的初始化脚本执行完毕。SysV init运行/etc/rc.d/rc.local脚本。rc.local是Linux留给用户进行个性化设置的地方。可以把自己私人想设置和启动的东西放到这里,一台LinuxServer的用户一般不止一个,所以才有这样的考虑。
3).SysV init和系统关闭
SysV init不仅需要负责初始化系统,还需要负责关闭系统。在系统关闭时,为了保证数据的一致性,需要小心地按顺序进行结束和清理工作。比如应该先停止对文件系统有读写操作的服务,然后再umount文件系统。否则数据就会丢失。这种顺序的控制这也是依靠/etc/rc.d/rcX.d/目录下所有脚本的命名规则来控制的,在该目录下所有以K开头的脚本都将在关闭系统时调用,字母K之后的数字定义了它们的执行顺序。
4).SysV init的管理和控制功能
此外,在系统启动之后,管理员还需要对已经启动的进程进行管理和控制。SysV init软件包包含了一系列的控制启动,运行和关闭所有其他程序的工具。halt停止系统。init就是SysV init本身的init进程实体,以pid1身份运行,是所有用户进程的父进程。最主要的作用是在启动过程中使用/etc/inittab文件创建进程。killall5就是System V的killall命令。向除自己的会话(session)进程之外的其它进程发出信号,所以不能杀死当前使用的shell。
last回溯/var/log/wtmp文件(或者-f选项指定的文件),显示自从这个文件建立以来,所有用户的登录情况。
lastb作用和last差不多,默认情况下使用/var/log/btmp文件,显示所有失败登录企图。
mesg控制其它用户对用户终端的访问。pidof找出程序的进程识别号(pid),输出到标准输出设备。
poweroff等于shutdown-h–p,或者telinit0。关闭系统并切断电源。
reboot等于shutdown–r或者telinit6。重启系统。
runlevel读取系统的登录记录文件(一般是/var/run/utmp)把以前和当前的系统运行级输出到标准输出设备。
shutdown以一种安全的方式终止系统,所有正在登录的用户都会收到系统将要终止通知,并且不准新的登录。
sulogin当系统进入单用户模式时,被init调用。当接收到启动加载程序传递的-b选项时,init也会调用sulogin。
telinit实际是init的一个连接,用来向init传送单字符参数和信号。
utmpdump以一种用户友好的格式向标准输出设备显示/var/run/utmp文件的内容。
wall向所有有信息权限的登录用户发送消息。
不同的Linux发行版在这些SysV init的基本工具基础上又开发了一些辅助工具用来简化init系统的管理工作。比如RedHat的RHEL在SysV init的基础上开发了initscripts软件包,包含了大量的启动脚本(如rc.sysinit),还提供了service,chkconfig等命令行工具,甚至一套图形化界面来管理init系统。其他的Linux发行版也有各自的initscript或其他名字的init软件包来简化SysV init的管理。
只要理解了SysV init的机制,在一个最简的仅有SysV init的系统下,可以直接调用脚本启动和停止服务,手动创建inittab和创建软连接来完成这些任务。因此理解SysV init的基本原理和命令是最重要的。甚至也可以开发自己的一套管理工具。
1.init程序的功能介绍
init程序是当系统内核启动后,加载完根文件系统,然后就由内核加载了init程序,并将后续用户空间其他程序的启动和管理工作交由init程序进行管理,除非有需要进行内核特权级别操作时,内核才会被用户空间的各个系统调用,完成一些内核级别的操作
在CentOS5、6上,init初始化用户空间的启动流程为:/sbin/init程序主要是通过读取/etc/inittab文件来完成一定的任务,完成的任务有:
定义默认运行级别(/etc/inittab)
运行系统初始化脚本(/etc/rc.d/rc.sysinit)完成系统初始化
关闭指定运行级别下的各服务,启动指定级别下需要开启的各服务
启动mingetty虚拟终端,调用login程序,显示登录提示符,让终端进行登录
init程序的类型:
centos5:SysV init
其配置文件:/etc/inittab
centos6: Upstart
其配置文件:/etc/inittab和/etc/init/*.conf
centos7:Systemd
其配置文件:/usr/lib/systemd/system/、/etc/systemd/system/
2、systemd的新特性:
<1>系统引导时实现服务并行启动(前提是并行启动的服务之间没有依赖关系)
<2>按需激活进程(进程在没有访问时是不会被启动的,但是服务仍然处于半活动状态,只是服务没有启动)
<3>系统状态快照,自我保存某一时刻进程用户空间状态的快照,可以回滚到某一个时刻
<4>基于依赖关系定义的服务控制逻辑
3、systemd的关键特性:
<1>基于socket的激活机制:socket与程序分离,可以在系统启动时,先把某个服务的socket分配给该服务,但该服务可以事先不用启动
<2>基于bus的激活机制:基于总线的激活
<3>基于device的激活机制:当某个设备接入时,systemd可以自动的去激活诸如device unit、mount unit、automount unit对设备进行识别和挂载等
<4>基于path的激活机制:系统可以自动监控某个目录存不存在,文件存不存在,并根据此判断,来激活别的服务、进程等
<5>系统快照:能够保存各unit的当前状态信息于持久存储设备中;从而实现了回滚机制
<6>能向后兼容sysv init脚本:在centos5、6系统上/etc/init.d/目录下的服务脚本,systemd也能够对其进行管理
不兼容的地方:
1):systemctl的命令是固定不变的,也就是说像在centos6上的各类服务脚本的start、stop这类我们可以通过修改服务脚本,去实现service 命令使用的时候后面的参数的变化。但是systemctl控制的时候,则无法通过修改服务脚本去实现systemctl后面参数的变化
2):不是由systemd启动的服务,systemctl无法与之通信,也就是无法对其进行控制。在centos6上,利用服务脚本自身启动时,利用service依然能够对其进行管理,但是centos7上,如果服务脚本自身启动,而不是通过systemctl进行启动,则systemctl就无法对服务做出管理
4、systemd的核心概念:unit
unit由其相关的配置文件进行标识、识别和配置,也就是说一个unit到底定义与否,由其配置文件进行标识。这类配置文件中主要包含了几个类别:系统服务,监听的socket、保存的快照以及其他与init相关的信息,这些配置文件中主要保存在:
/usr/lib/systemd/system/ 每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/
/run/systemd/system/ 系统执行过程中所产生的服务脚本,比上面目录优先运行
/etc/systemd/system/ 管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行
unit的常见类型:
service unit:这类unit的文件扩展名为.service,主要用于定义系统服务(其扮演了在centos6上/etc/init.d/目录下的服务脚本的作用)
target unit:这类unit的文件扩展名为.target,主要用于模拟实现"运行级别"的概念
device unit:这类unit文件扩展名为.device,用于定义内核识别的设备,然后udev利用systemd识别的硬件,完成创建设备文件名
mount unit:这类unit文件扩展名为.mount,主要用于定义文件系统挂载点
socket unit:这类unit文件扩展名为.socket,用于标识进程间通信用到的socket文件
snapshot unit:这类unit文件扩展名为.snapshot,主要用于实现管理系统快照
swap unit:这类unit文件扩展名为.swap,主要用于标识管理swap设备
automount unit:这类unit文件扩展名为.automount,主要用于文件系统自动挂载设备
path unit:这类unit文件扩展名为.path,主要用于定义文件系统中的文件或目录
第二章 systemd如何管理系统上的各个服务
1、systemd对服务的管理(service类unit的管理)
主要是依靠service类型的unit文件进行管控的完成的
systemctl命令:
语法:systemctl [OPTIONS…] COMMAND [SERVICE_NAME.service…]
<1>启动:service SERVICE_NAME start ==> systemctl start SERVICE_NAME.service
<2>停止:service SERVICE_NAME stop ==> systemctl stop SERVICE_NAME.service
<3>重启:service SERVICE_NAME restart ==> systemctl restart SERVICE_NAME.service
<4>状态:service SERVICE_NAME status ==> systemctl status SERVICE_NAME.service
centos7里面状态信息里显示的loaded 表示是否加入到systemctl可管理的列表中(类似centos6中chkconfig –add的概念,如果是loaded,表示已经添加到列表中,后面disabled表示没有开机自动启动)
<5>条件式重启:(相当于如果服务之前启动了,则对服务进行重启,如果服务之前没启动,则不执行任何操作)
service SERVICE_NAME condrestart ==> systemctl tryrestart SERVICE_NAME.service
<6>重载或重启服务:(相当于如果服务支持不重启而重载配置文件,就进行重载,如果服务不支持重载配置文件,就重启服务)
cenntos6不支持
systemctl reload-or-restart SERVICE_NAME.service
<7>重载或条件是重启:(相当于如果服务支持不重启而重载配置文件,就进行重载,如果服务不支持重载配置文件,就重启服务,但重启的前提是该服务之前是开启的)
cenntos6不支持
systemctl reload-or-try-restart SERVICE_NAME.service
<8>查看某服务当前是否激活:
centos6不支持
systemctl is-acive SERVICE_NAME.service
<9>查看所有已激活的服务:
systemctl list-unit –type|-t service
<10>查看所有的服务,也就是所有已经装载load的服务,包含已激活和未激活的:
chkconfig –list ==> systemctl list-unit -t service -a
显示出来的信息的含义:
loaded:Unit配置文件已处理
active(running):一次或多次持续处理的运行
active(exited):成功完成一次性的配置
active(waiting):运行中,等待一个事件
inactive:不运行
enabled:开机启动
disabled:开机不启动
static:开机不启动,但可被另一个启用的服务激活
<11>设置服务可以开机自动启动:
chkconfig SERVICE_NAME on ==> systemctl enable SERVICE_NAME.service
<12>禁止服务开机自动启动:
chkconfig SERVICE_NAME off ==> systemctl disable SERVICE_NAME.service
<13>查看某服务是否能够开机自启动:
chkconfig –list SERVICE_NAME ==> systemctl is-enabled SERVICE_NAME.service
<14>禁止某服务设定为开机自启:
systemctl mask SERVICE_NAME.service
<15>取消上述禁止:
systemctl unmask SERVICE_NAME.service
<16>查看服务的依赖关系:
systemctl list-dependencies SERVICE_NAME.service
2、systemd对target类unit的管理(类似于运行级别的管理)
运行级别的对应关系:
0 ==> runlevel0.target 或 poweroff.target
1 ==> runlevel1.target 或 rescue.target
2 ==> runlevel2.target 或 multi-user.target
3 ==> runlevel3.target 或 multi-user.target
4 ==> runlevel4.target 或 multi-user.target
5 ==> runlevel5.target 或 graphical.target
6 ==> runlevel6.target 或 reboot.target
<1>级别切换:
init 数字 ==> systemctl isolate NAME.target
<2>查看当前运行级别:
runlevel ==> systemctl –list-unit -t target
<3>查看所有装载的target:
systemctl –list-unit -t target -a
<4>查看默认运行级别:
systemctl get-default
<5>设定默认运行级别:
systemctl set-default NAME.target
centos6修改/etc/inittab文件
<6>切换至紧急救援模式:
systemctl rescue
<7>切换至紧急emergency模式:比紧急救援模式加载的东西更加少,紧急救援模式还会执行系统初始化脚本/etc/rc.d/rc.sysinit系统初始化脚本,但emergency不会执行系统初始化脚本,通常用于当装了某些硬件驱动后无法正常启动时,才进入该模式。
systemctl emergency
3、systemd相关的其他常用命令:
关机:systemctl halt、systemctl poweroff
重启:systemctl reboot
挂起:systemctl suspend
快照:systemctl hibernate
快照并挂起:systemctl hybrid-sleep
4、CentOS6与CentOS7上对服务的管理方式对比总结
4、CentOS7的启动流程详解
<1>UEFi或BIOS初始化,运行POST开机自检
<2>选择启动设备
<3>引导装载程序, centos7是grub2
<4>加载装载程序的配置文件: /etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
<5>加载initramfs驱动模块
<6>加载内核选项
<7>内核初始化, centos7使用systemd代替init
<8>执行initrd.target所有单元,包括挂载/etc/fstab
<9>从initramfs根文件系统切换到磁盘根目录
<10>systemd执行默认target配置,配置文件/etc/systemd/default.target /etc/systemd/system/
<11>systemd执行sysinit.target初始化系统及basic.target准备操作系统
<12>systemd启动multi-user.target下的本机与服务器服务
<13>systemd执行multi-user.target下的/etc/rc.d/rc.local
<14>systemd执行multi-user.target下的getty.target及登入服务
<15>systemd执行graphical需要的服务
Linux 引导方式systemd upstart sysV http://www.linuxidc.com/Linux/2014-01/95555.htm
为什么systemd会被如此迅速的采用? http://www.linuxidc.com/Linux/2014-08/105789.htm
systemd 与 sysVinit 彩版对照表 http://www.linuxidc.com/Linux/2014-09/106455.htm
Linux Systemd——在RHEL/CentOS 7中启动/停止/重启服务 [http://www.linuxidc.com/Linux/2014-08/105975.htm](
来源:https://www.cnblogs.com/luthon/p/12037385.html