默认教学计划
931人加入学习
(20人评价)
Linux运维基础
价格 ¥ 599.00
该课程属于 高校公益行 | 网络安全实践训练营 请加入后再学习

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

[展开全文]

授课教师

课程特色

视频(102)
下载资料(1)