systemd特性
1.平行处理所有服务,加速开机流程:旧的init启动脚本是一项一项任务依序启动的模式,因此不相依的服务也是得要一个一个的等待.systemd可以让所有的服务同时启动,因此系统启动的速度变快了
2.一经要求就回应的on-demand启动方式:systemd全部就是仅有一只systemd服务搭配systemctl指令来处理,无须其他额外的指令来支援.不像systemV还要init,chkconfig,service...等等指令.此外,systemd由于常驻存储器,因此任何要求(on-demand)都可以立即处理后续的daemon启动的任务.
3.服务依赖性的自我检查:由于systemd可以自订服务相依性的检查,因此如果B服务是架构在A服务上面启动的,那当你在没有启动A服务的情况下仅手动启动B服务时,systemd会自动帮你启动A服务!
4.按照daemon功能分类:systemd管理的服务非常多,首先systemd先定义所有的服务为一个服务单位(unit),并将该unit归类到不同的服务类型(type)去.systemd将服务单位(unit)区分为service,socket,target,path,snapshot,timer等多种不同的类型(type),方便管理员的分类与记忆.
5.将多个daemons集合成为一个群组:如同systemV的init里头有个runlevel的特色,systemd亦将许多的功能集合成为一个所谓的target项目,这个项目主要在设计操作环境的建置,所以是集合了许多的daemons,也就是执行某个target就是执行好多个daemon的意思!
6.向下兼容旧有的init服务脚本:基本上,systemd是可以兼容于init的启动脚本的,因此,旧的init启动脚本也能够通过systemd来管理,只是更进阶的systemd功能就没有办法支援了.
7.systemd有些地方无法完全取代init!包括:在runlevel的对应上,大概仅有runlevel1,3,5有对应到systemd的某些target类型而已,没有全部对应;
8.全部的systemd都用systemctl这个管理程序管理,而systemctl支援的语法有限制,不像/etc/init.d/daemon就是纯脚本可以自订参数,systemctl不可自订参数.;
几个重要概念:
Systemctl是一个systemd工具,主要负责控制systemd系统和服务管理器.
Systemd是一个系统管理守护进程、工具和库的集合,用于取代SystemV初始进程.Systemd的功能是用于集中管理和配置类UNIX系统.
在Linux生态系统中,Systemd被部署到了大多数的标准Linux发行版中,只有为数不多的几个发行版尚未部署.Systemd通常是所有其它守护进程的父进程,但并非总是如此.
CentOS7启动流程:
# lsinitrd /boot/initramfs-3.10.0-514.el7.x86_64.img //查看虚根文件系统
其中init链接到 /usr/lib/systemd/systemd 程序
在内核载入完毕、进行完硬件侦测与驱动程序载入后,内核会启动第一个进程systemd, systemd 最主要的功能就是准备软件执行的环境,包括系统的主机名称、网络设定、语言设置、文件系统及其他服务的启动。 而所有的动作都会通过 systemd 的预设启动服务集合/etc/systemd/system/default.target设定。 另外, systemd 已经舍弃沿用多年的 system V 的 runlevel!
常见的操作环境 target 与兼容于 runlevel 的等级可以作为预设的操作环境 (default.target) 的主要项目有: multi-user.target 以及 graphical.target 这两个。当然还有rescue.target, emergency.target, shutdown.target 等等,以及 initrd.target!但是过去的 systemV 使用的是一个称为 runlevel (执行等级) 的概念来启动系统的,systemd 为了兼容于旧式的 systemV 操作行为, 所以也将 runlevel 与操作环境做个结合!你可以使用底下的方式来查询两者间的对应关系
# ll -d /usr/lib/systemd/system/runlevel*.target
# yum -y install bash-completion //补齐参数或选项
# systemctl list-dependencies graphical.target //查看启动依赖关系
# systemctl list-dependencies mutli-user.target //查看字符界面启动依赖关系
sysinit.target完成的功能:
1.特殊文件系统装置的挂载:包括 dev-hugepages.mount dev-mqueue.mount 等挂载服务,主要在挂载跟巨量存储器分页使用与讯息队列的功能。 挂载成功后,会在 /dev 底下建立 /dev/hugepages/, /dev/mqueue/ 等目录;
2.特殊文件系统的启用:包括磁碟阵列、网络磁碟 (iscsi)、LVM 档案系统、档案系统对照服务 (multipath) 等等,也会在这里被侦测与使用到!
3.开机过程的讯息传递与动画执行:使用 plymouthd 服务搭配 plymouth 指令来传递动画与讯息
4.日志式登录档的使用:就是 systemd-journald 这个服务的启用啊!
5.载入额外的核心模块:透过 /etc/modules-load.d/*.conf 档案的设定,让核心额外载入管理员所需要的核心模块!
6.载入额外的核心参数设定:包括 /etc/sysctl.conf 以及 /etc/sysctl.d/*.conf 内部设定!
7.启动系统的随机数产生器:随机数产生器可以帮助系统进行一些密码加密演算的功能
8.设定终端机 (console) 字形
9.启动动态装置管理员:就是udev
basic.target完整的功能:
1.载入 alsa 音效驱动程序;
2.载入 firewalld 防火墙:CentOS 7.x 以后使用 firewalld 取代 iptables 的防火墙设定,虽然最终都是使用 iptables 的架构, 不过在设定上面差很多。
3.载入 CPU 的微指令功能;
4.启动与设定 SELinux 的安全上下文
5.将目前的开机过程所产生的开机信息写入到 /var/log/dmesg 当中
6.由 /etc/sysconfig/modules/*.modules 及 /etc/rc.modules 载入管理员指定的模块!
7.载入 systemd 的 timer 功能;
systemd 启动 multi-user.target 下的服务:
启动服务设定的脚本目录:
/usr/lib/systemd/system (系统预设的服务启动脚本设定)
/etc/systemd/system (管理员自己开发与设定的脚本设定)
而使用者针对主机的本机服务与服务器网络服务的各项 unit 若要 enable 的话,就是将它放到 /etc/systemd/system/multi-user.target.wants/ 这个目录底下做个链接,这样就可以在开机的时候去启动他。
与sys V兼容的rc.local操作:
# chmod +x /etc/rc.d/rc.local
# systemctl start rc-local
# systemctl enable rc-local
unit分类:
.service:一般服务类型(serviceunit):主要是系统服务,包括服务器本身所需要的本机服务以及网络服务
.socket:套接字(socketunit):主要是IPC(Inter-processcommunication)的传输讯息(socketfile)功能.这种类型的服务通常在监控讯息传递的套接字,当有透过此套接字传递讯息来说要连结服务时,就依据当时的状态将该用户的要求传送到对应的daemon,若daemon尚未启动,则启动该daemon后再传送用户的要求.
.target:执行环境类型(targetunit)
.mount:文件系统挂载相关的服务(automountunit/mountunit):例如来自网络的自动挂载、NFS档案系统挂载等与档案系统相关性较高的程序管理.
.path:侦测特定档案或目录类型(pathunit):某些服务需要侦测某些特定的目录来提供队列服务,例如最常见的打印服务,就是透过侦测打印队列目录来启动打印功能!
.timer:循环执行的服务(timerunit):这个东西有点类似anacrontab!不过是由systemd主动提供的,比anacrontab更加有弹性!
与systemd的daemon运作过程相关的目录简介:
1;/usr/lib/systemd/system/:使用CentOS官方提供的软件安装后,预设的启动脚本设定档都放在这里
2./run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比/usr/lib/systemd/system/高!
3./etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx之类的功能!执行优先序又比/run/systemd/system/高!
4./etc/sysconfig/*:几乎所有的服务都会将初始化的一些选项设定写入到这个目录下,举例来说,mandb所要更新的manpage索引中,需要加入的参数就写入到此目录下的man-db当中!而网络的设定则写在/etc/sysconfig/network-scripts/这个目录内.
5./var/lib/:一些会产生资料的服务都会将他的资料写入到/var/lib/目录中.举例来说,数据库管理系统Mariadb的数据库预设就是写入/var/lib/mysql/这个目录下!
6./run/:放置了好多daemon的暂存档,包括lockfile以及PIDfile等等.
systemctl项目简介:
#cat /usr/lib/systemd/system/sshd.service
.service大概能够将整个设定分为三个部份,就是:
[Unit]:unit本身的说明,以及与其他相依赖daemon的设定,包括在什么服务之后才启动此unit之类的设定值;
[Service],[Socket],[Timer],[Mount],[Path]..:不同的unittype就得要使用相对应的设定项目.我们拿的是sshd.service来当模板,所以这边就使用Service来设定.这个项目内主要在规范服务启动的脚本、环境设定档档名、重新启动的方式等等.
[Install]:这个项目就是将此unit安装到哪个target里面去的意思!
至于设定档内有些设定规则还是得要说明一下:
设定项目通常是可以重复的,例如我可以重复设定两个After在设定档中,不过,后面的设定会取代前面的!因此,如果你想要将设定值归零,可以使用类似『After=』的设定,亦即该项目的等号后面什么都没有,就将该设定归零了(reset).
如果设定参数需要有『是/否』的项目(布尔值,boolean),你可以使用1,yes,true,on代表启动,用0,no,false,off代表关闭!
空白行、开头为#或;的那一行,都代表注解!
Unit部分说明:
Description:服务的描述信息
Documentation:提供给管理员的一些帮助文档!提供的文件可以是如下的格式:Documentation=http://www....Documentation=man:sshd(8)Documentation=file:/etc/ssh/sshd_config
After:说明此unit是在哪个daemon启动之后才启动的意思!基本上仅是说明服务启动的顺序而已,并没有强制要求里头的服务一定要启动后此unit才能启动.以sshd.service的内容为例,该服务提到After后面有network.target以及sshd-keygen.service,但是若这两个unit没有启动而强制启动sshd.service的话,那么sshd.service应该还是能够启动的!这与Requires的设定是有差异的!
Before:与After的意义相反,是在什么服务启动前最好启动这个服务的意思.不过这仅是规范服务启动的顺序,并非强制要求的意思.
Requires:明确的定义此unit需要在哪个daemon启动后才能够启动!就是设定依赖服务啦!如果在此项设定的前面服务没有启动,那么此unit就不会被启动!
Wants:与Requires刚好相反,规定的是这个unit之后最好还要启动什么服务比较好的意思!不过,并没有明确的规定就是了!主要的目的是希望建立让使用者比较好操作的环境.因此,这个Wants后面接的服务如果没有启动,其实不会影响到这个unit本身!
Conflicts:代表冲突的服务!也就是这个项目后面接的服务如果有启动,那么我们这个unit本身就不能启动!我们unit有启动,则此项目后的服务就不能启动!
[Service]部分说明:
Type:说明这个daemon启动的方式,会影响到ExecStart!一般来说,有底下几种类型
simple:预设值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于存储器中.
forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的主要服务.原生的父程序在启动结束后就会终止运作.传统的unit服务大多属于这种项目,例如httpd这个WWW服务,当httpd的程序因为运作过久因此即将终结了,则systemd会再重新生出另一个子程序持续运作后,再将父程序删除.
oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在存储器中.
dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作! 因此设定这个项目时,通常也要设定BusName=才行!
idle:与simple类似,意思是,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执 行.这类的daemon通常是开机到最后才执行即可的服务!
比较重要的项目大概是 simple, forking 与 oneshot 了!毕竟很多服务需要子程序 (forking),而有更多的动作只需要在开机的时候执行一次(oneshot),例如文件系统的检查与挂载啊等等的。
EnvironmentFile:可以指定启动脚本的shell环境!例如 sshd.service 的设定档写入到 /etc/sysconfig/sshd 当中!你也可以使用 Environment= 后面接多个不同的 Shell 变量来给予设定!
ExecStart:就是实际执行此 daemon 的指令或脚本程序。你也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之后) 两个设定项目来在实际启动服务前,进行额外的指令行为。 但需要特别注意的是,指令串仅接受『指令 参数 参数...』的格式,不能接受 <, >, >>, |, & 等特殊字符,很多的 bash 语法也不支援喔! 所以,要使用这些特殊的字符时,最好直接写入到指令脚本里面去!不过,上述的语法也不是完全不能用,亦即,若要支援比较完整的 bash 语法,那你得要使用 Type=oneshot 才行喔! 其他的 Type 才不支持这些字符。
ExecStop:与 systemctl stop 的执行有关,关闭此服务时所进行的指令。
Restart:当设定 Restart=1 时,则当此 daemon 服务终止后,会再次的启动此服务。举例来说,如果你在 tty2 使用文字界面登入,操作完毕后登出,基本上,这个时候 tty2 就已经结束服务了。 但是你会看到荧幕又立刻产生一个新的 tty2 的登入画面等待你的登入!那就是 Restart 的功能!除非使用 systemctl 强制将此服务关闭,否则这个服务会源源不绝的一直重复产生!
RemainAfterExit:当设定为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序都终止之后,此服务会再尝试启动。这对于 Type=oneshot 的服务很有帮助!
TimeoutSec:若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利『正常启动或正常结束』的情况下,则我们要等多久才进入『强制结束』的状态!
KillMode:可以是 process, control-group, none 的其中一种,如果是 process 则 daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串指令),如果是 control-group 时, 则由此 daemon 所产生的其他 control-group 的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭喔!
RestartSec:与 Restart 有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要 sleep 多少时间再重新启动的意思。预设是 100ms (毫秒)。
Install部分说明:
WantedBy:这个设定后面接的大部分是 *.target unit !意思是,这个 unit 本身是附挂在哪一个 target unit 底下的!一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 底下!
Also:当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思!也就是具有相依性的服务可以写在这里呢!
Alias:进行一个连结的别名的意思!当 systemctl enable 相关的服务时,则此服务会进行连结档的建立!以 multi-user.target 为例,这个家伙是用来作为预设操作环境 default.target 的规划, 因此当你设定用成 default.target 时,这个 /etc/systemd/system/default.target 就会链接到 /usr/lib/systemd/system/multi-user.target !
systemctl命令详细使用说明:
1.首先检查你的系统中是否安装有systemd并确定当前安装的版本
#systemd--version
2.检查systemd和systemctl的二进制文件和库文件的安装位置
# whereis systemd
# whereis systemctl
3.检查systemd是否运行
# ps-eaf | grepsystemd
注意:systemd是作为父进程(PID=1)运行的.在上面带(-e)参数的ps命令输出中,选择所有进程,(-a)选择除会话前导外的所有进程,并使用(-f)参数输出完整格式列表(即-eaf).
4.分析systemd启动进程
# systemd-analyze
5.分析启动时各个进程花费的时间
# systemd-analyze blame
6.分析启动时的关键链
# systemd-analyze critical-chain
7.列出所有可用单元
# systemctl list-unit-files
8.列出所有运行中单元
# systemctl list-units
9.列出所有失败单元
# systemctl --failed
10.检查某个单元(如cron.service)是否开机自启
#systemctl is-enabled crond.service
11.检查某个单元或服务是否运行
# systemctl status firewalld.service
使用Systemctl控制并管理服务
12.列出所有服务(包括启用的和禁用的)
#systemctl list-unit-files --type=service
13.Linux中如何启动、重启、停止、重载服务以及检查服务(如httpd.service)状态
#systemctl start httpd.service
#systemctl restart httpd.service
#systemctl stop httpd.service
#systemctl reload httpd.service
#systemctl status httpd.service
注意:当我们使用systemctl的start,restart,stop和reload命令时,我们不会从终端获取到任何输出内容,只有status命令可以打印输出.
14.如何激活服务并在启动时启用或禁用服务(即系统启动时自动启动服务)
# systemctl is-active httpd.service
# systemctl enable httpd.service
# systemctl disable httpd.service
15.如何屏蔽(让它不能启动)或显示服务(如httpd.service)
#systemctl mask httpd.service
#systemctl unmask httpd.service
16.使用systemctl命令杀死服务
# systemctl kill httpd
# systemctl statu shttpd
使用Systemctl控制并管理挂载点
17.列出所有系统挂载点
#systemctl list-unit-files --type=mount
18.挂载、卸载、重新挂载、重载系统挂载点并检查系统中挂载点状态
#systemctl start tmp.mount
#systemctl stop tmp.mount
#systemctl restart tmp.mount
#systemctl reload tmp.mount
#systemctl status tmp.mount
19.在启动时激活、启用或禁用挂载点(系统启动时自动挂载)
#systemctl is-active tmp.mount
#systemctl enable tmp.mount
#systemctl disable tmp.mount
20.在Linux中屏蔽(让它不能启用)或可见挂载点
# systemctl mask tmp.mount
#s ystemctl unmask tmp.mount
使用Systemctl控制并管理套接口
21.列出所有可用系统套接口
#systemctl list-unit-files --type=socket
22.在Linux中启动、重启、停止、重载套接口并检查其状态
#systemctl start cups.socket
#systemctl restart cups.socket
#systemctl stop cups.socket
#systemctl reload cups.socket
#systemctl status cups.socket
23.在启动时激活套接口,并启用或禁用它(系统启动时自启动)
#systemctl is-active cups.socket
#systemctl enable cups.socket
#systemctl disable cups.socket
24.屏蔽(使它不能启动)或显示套接口
#systemctl mask cups.socket
#systemctl unmask cups.socket
服务的CPU利用率(分配额)
25.获取当前某个服务的CPU分配额(如httpd)
# systemctl show -p CPUShares httpd.service
注意:各个服务的默认CPU分配份额=1024,你可以增加/减少某个进程的CPU分配份额.
26.将某个服务(httpd.service)的CPU分配份额限制为2000CPUShares/
#systemctl set-property httpd.service CPUShares=2000
#systemctl show -p CPUShares httpd.service
CPUShares=2000
注意:当你为某个服务设置CPUShares,会自动创建一个以服务名命名的目录(如httpd.service),里面包含了一个名为90-CPUShares.conf的文件,该文件含有CPUShare限制信息,你可以通过以下方式查看该文件:
# vim /etc/systemd/system/httpd.service.d/50-CPUShares.conf
[Service]
CPUShares=2000
27.检查某个服务的所有配置细节
#systemctl show httpd
28.分析某个服务(httpd)的关键链
#systemd-analyze critical-chain httpd.service
29.获取某个服务(httpd)的依赖性列表
#systemctl list-dependencies httpd.service
30.按等级列出控制组
# systemd-cgls
31.按CPU、内存、输入和输出列出控制组
# systemd-cgtop
控制系统运行等级
32.启动系统救援模式
#systemctl rescue
33.进入紧急模式
# systemctl emergency
34.列出当前使用的运行等级
# systemctl get-default
35.启动运行等级5,即图形模式
#systemctl isolate runlevel5.target
或
#systemctl isolate graphical.target
36.启动运行等级3,即多用户模式(命令行)
#systemctl isolate runlevel3.target
或
#systemctl isolate multiuser.target
36.设置多用户模式或图形模式为默认运行等级
#systemctl set-default runlevel3.target
#systemctl set-default runlevel5.target
37.重启、停止、挂起、休眠系统或使系统进入混合睡眠
#systemctl reboot
#systemctl halt