systemd和systemctl

systemd和systemctl(centos7)    

Systemd是一种新的linux系统服务管理器。它替换了init系统,能够管理系统启动过程和一些系统服务,一旦启动起来,就将监管整个系统。在centos7系统中,PID 1被systemd所使用了:如下,在centos6中:

init─┬─NetworkManager

     ├─abrtd

     ├─acpid

     ├─atd

     ├─auditd─┬─audispd─┬─sedispatch

     │        │         └─{audispd}

     │        └─{auditd}

     ├─automount───4*[{automount}]

     ├─certmonger

     ├─crond

     ├─cupsd

     ├─dbus-daemon───{dbus-daemon}

     ├─dhclient

     ├─fcoemon

     ├─hald─┬─hald-runner─┬─hald-addon-acpi

     │      │             └─hald-addon-inpu

     │      └─{hald}

     ├─irqbalance

     ├─lldpad

     ├─master─┬─pickup

     │        └─qmgr

     ├─mcelog

     ├─6*[mingetty]

     ├─modem-manager

     ├─rpc.statd

     ├─rpcbind

     ├─rsyslogd───3*[{rsyslogd}]

     ├─sshd─┬─sshd───bash───pstree

     │      └─sshd───bash

     ├─udevd───2*[udevd]

     ├─wpa_supplicant

     └─xinetd

在centos7中

systemd─┬─abrt-watch-log

        ├─abrtd

        ├─agetty

        ├─atd

        ├─auditd───{auditd}

        ├─chronyd

        ├─crond

        ├─dbus-daemon───{dbus-daemon}

        ├─irqbalance

        ├─lsmd

        ├─lvmetad

        ├─master─┬─pickup

        │        └─qmgr

        ├─rngd

        ├─rsyslogd───2*[{rsyslogd}]

        ├─smartd

        ├─sshd───sshd───bash───pstree

        ├─systemd-journal

        ├─systemd-logind

        ├─systemd-udevd

        └─tuned───4*[{tuned}]

ststemd可以并行地启动系统服务进程,并且最初仅启动确实被依赖的服务,极大减少了系统的引导时间,这也就是为什么centos7系统启动速度比centos6快许多的原因了。

一、知识整理

1、systemd的管理体系里,以前的运行级别的概念被新的运行目标(target)所取代。tartget的命令类似于multi-user.target等这种形式,由于不再使用runlevel概念,所以/etc/inittab也不再被系统使用。而在systemd的管理体系里面,默认的target(相当于以前的默认运行级别)是通过软链接实现的:

[root@localhost system]# ll
总用量 8
drwxr-xr-x. 2 root root   30 7月  19 05:55 basic.target.wants
lrwxrwxrwx. 1 root root  41 9月 19 14:56 default.target -> /usr/lib/systemd/system/multi-user.target

在/lib/systemd/system下面定义runlevelX.target文件目的主要是为了能够兼容以前的运行级别,事实上/lib/systemd/system/runlevel3.target,同样是被链接到multi-user.target

2、systemd管理体系中,被管理的deamon(守护进程)称作unit(单元),对于单元的管理是通过命令systemctl来进行控制的。unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息。

3、systemd新特性:

系统引导时实现服务并行启动;

按需启动守护进程;

自动化的服务依赖关系

同时采用socket式与D-Bus总线式激活服务;

系统状态快照。

4、配置文件:

每个服务最主要的启动脚本设置,类似于之前的/etc/init.d/

[root@localhost system]# cd /usr/lib/systemd/system
[root@localhost system]# ls
abrt-ccpp.service      lvm2-lvmetad.socket                 smartd.service
abrtd.service            lvm2-lvmpolld.service               snmpd.service
abrt-oops.service        lvm2-lvmpolld.socket                snmptrapd.service
abrt-pstoreoops.service      lvm2-monitor.service                sockets.target

系统执行过程中所产生的服务脚本,比上面目录优先运行:

[root@localhost system]# cd /run/systemd/system/
[root@localhost system]# ls
session-1.scope  session-1.scope.d

管理员建立的执行脚本,类似于/etc/rc.d/rcN.d/SXX类的功能,比上面目录优先运行:

[root@localhost system]# cd /etc/systemd/system/
[root@localhost system]# ls
basic.target.wants  default.target.wants  multi-user.target.wants  sysinit.target.wants
default.target   getty.target.wants    sockets.target.wants     system-update.target.wants

5、unit类型:使用如下命令查看:

[root@localhost system]# systemctl -t help 
Available unit types:

service :文件扩展名为.service,用于定义系统服务

socket :用于标识进程间通信用的socket文件,也可在系统启动时,延迟启动服务,实现按需启动。

busname

target :用于模拟实现运行级别;

snapshot :.snapshot,管理系统快照;

device :.device,用于定义内核识别的设备;

mount :.mount,定义文件系统挂载点

automount :文件系统的自动挂载点

swap :.swap,用于标识swap设备;

timer

path :用于定义文件系统中的一个文件或者目录使用,常用于当文件系统变化时,延迟激活服务,如spool目录。

slice

scope

6、关键特性:

基于socket的激活机制,socket与程序分离;

基于bus的激活机制

基于device的激活机制

基于path的激活机制;

系统快照:保存个unit的当前状态信息与持久存储设备中;

向后兼容sysv init脚本,放在/etc/init.d/

不兼容:systemctl的命令是固定不变的;

非由systemd启动的服务,systemctl无法与之通信。

7、centos的系统启动:

设置内核参数,只影响当次启动:在选择内核界面按e。在linux16一行后添加:

systemd.unit= XXX.target|emergency.target|recure.target

当出现文件系统损坏、挂载文件损坏等情况后,进入emergency模式修复,此模式比rescue模式功能更少。

blob.png

修复grub2:修复配置文件:grub2-mkconfig > /boot/grub2/grub.cfg

grub2-mkconfig  -o  /boot/grub2/grub.cfg

修复grub:grub2-install /dev/sda BIOS环境

grub2-install UEFI环境

一、命令详解和事例

1、systemctl命令:

用法:systemctl [OPT] COMMAND [NAME]…

启动服务:service NAME start = systemctl start NAME.service

停止服务:service NAME stop = systemctl stop NAME.service

重启服务:service NAME restart = systemctl restart NAME.service

服务状态:service NAME status = systemctl status NAME.service

条件式重启,已启动才重启,否则不作操作:service NAME condrestart = systemctl try-restart NAME.service

重载或重启服务,先加载再启动:systemctl reload-or-restart NAME.service

重载或条件式重启:systemctl reload-or-try-restart NAME.service

禁止自动和手动启动:systemctl mask NAME.service

取消禁止:systemctl unmask NAME.service

查看某服务当前激活与否的状态:systemctl is-active NAME.service

查看所有已经激活的服务:systemctl list-unit –type|-t service

查看所有服务:systemctl list-units –type service –all|-a

chkconfig命令的对应关系:

设定某服务开机自启动:

chkconfig NAME on==>systemctl enable NAME.service

设定某服务开机禁止启动:

chkconfig NAME off==> systemctl disable NAME.service

查看所有服务的开机自启动状态:

chkconfig –list==> systemctl list-unit-files –type service

[root@localhost system]# systemctl enable httpd.service 
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.
[root@localhost system]# systemctl disable httpd.service
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
[root@localhost system]# systemctl mask httpd.service
Created symlink from /etc/systemd/system/httpd.service to /dev/null.
[root@localhost system]# systemctl unmask httpd.service
Removed symlink /etc/systemd/system/httpd.service.
[root@localhost system]# systemctl list-units --type service 
  UNIT                               LOAD   ACTIVE SUB     DESCRIPTION
  abrt-ccpp.service        loaded active exited  Install ABRT coredump hook
  abrt-oops.service        loaded active running ABRT kernel log watcher
  abrtd.service           loaded active running ABRT Automated Bug Reporting Tool
  atd.service            loaded active running Job spooling tools

列出该服务在哪些运行级别下启用和禁止:

chkconfig sshd -list==>ls /etc/systemd/system/*.wants/sshd.service

查看服务是否开机启动:systemctl is-enabled NAME.service

[root@localhost system]# systemctl is-enabled httpd.service 
disabled

其它命令:查看服务的依赖关系

systemctl list-dependencies NAME.service

杀掉进程:systemctl kill (进程名)

列出失败的任务:systemctl –failed –type=service

2、服务状态:

[root@localhost system]# systemctl list-units --type service --all
  UNIT                LOAD      ACTIVE   SUB     DESCRIPTION
  abrt-ccpp.service       loaded    active   exited  Install ABRT coredump hook
  abrt-oops.service       loaded    active   running ABRT kernel log watcher
  abrt-vmcore.service     loaded    inactive dead    Harvest vmcores for ABRT
  abrt-xorg.service       loaded    inactive dead    ABRT Xorg log watcher

loaded:unit配置文件已处理

active(running):一次或多次持续处理的运行

active(exited):成功完成一次性配置

active(waiting):运行中,等待一个事件

inactive:不运行

enable:开机启动

disable:开机不启动

static:开机不启动,但可以被另一个启用的服务激活。

3、运行级别:

0 :关机:poweroff.target

1 :单用户模式:rescue.target

2 :默认不启用NFS的多用户:multi-user.target

3 :完全的多用户:multi-user.target

4 :保留:mult-user.target

5 :图形:graphical.target

6 :重启:reboot.target

查看依赖性:

[root@localhost system]# systemctl list-dependencies graphical.target 
graphical.target
● ├─display-manager.service
● ├─network.service
● ├─systemd-update-utmp-runlevel.service
● └─multi-user.target
●   ├─abrt-ccpp.service
●   ├─abrt-oops.service
●   ├─abrt-vmcore.service

级别切换:systemctl isolate NAME.target;只有当/lib/systemd/system/*.target文件中AllowIsolate=yes才能切换(修改文件需执行systemctl deamon-reload才能生效)。

获取默认运行级别:systemctl get-default。

修改默认运行级别:systemctl set-default NAME.target

切换至救援模式:systemctl rescue

切换至紧急救援模式:systemctl emergency

关机:systemctl halt|poweroff

重启:systemctl reboot

挂起:systemctl suspend

休眠:systemctl hibernate

休眠并挂起:systemctl hybrid-sleep

4、Centos7引导顺序:

UEFI或BIOS初始化,运行POST开机自检

选择启动设备;

引导装载程序,centos7是grub2

加载装载程序的配置文件:/etc/grub.d/  /etc/default/grub  /boot/grub2/grub.cfg;

加载initramfs驱动模块;

加载内核选项;

内核初始化,centos7使用system代替init

执行initrd.target所有单元,包括挂载/etc/fstab

从initramfs根文件系统切换到磁盘根目录;

systemd执行默认target配置,配置文件为/etc/systemd/default.target  /etc/systemd/system

systemd执行sysinit.target初始化系统及basic.target准备操作系统;

systemd启动multi-user.target下的本机与服务器服务;

systemd执行multi-user.target下的/etc/rc.d/rc.local

systemd执行multi-user.target下的getty.target及登入服务;

systemd执行graphical需要的服务。

5、Unit文件格式:

/etc/systemd/system:系统管理员和用户使用;

/usr/lib/systemd/system:发行版打包者使用;

默认单位是秒;通常由三部分组成:

[Unit]:定义与unit类型无关的通用选项;用于提供unit的描述信息,unit行为及依赖关系;

常用的选项:Description:描述信息

After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与Before相反;

Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit即无法激活;

Wants:依赖到的其它units,弱依赖;

Conflicts:定义units间的冲突关系。

[Service]:与特定类型相关的专用选项;此处为service类型;

常用选项:Type:定义影响ExecStart及相关参数功能的unit进程启动类型;

simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内存中;

forking:由ExacStart启动的程序透过spawns延伸出其它子程序来作为此deamon的主要服务。原生父程序在启动结束后就会终止。

oneshot:与simple类似,不过这个程序在完成工作后就结束,不常驻内存;

dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续运作。因此通常也要同时设定BusName=才行;

notify:在启动完成后会发送一个通知消息。还需要配合NotifyAccess来让Systemd接收消息;

idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执行。这类的daemon通常是开机到最后才执行即可的服务。

EnvironmentFile:环境配置文件;

ExecStart:指明启动unit要运行命令或脚本的绝对路径;

ExecStartPre:在ExecStart之前运行;

ExecStartPost:在ExecStart之后运行;

ExecStop:指明停止unit要运行的命令或脚本;

Restart:当设定Restart=1时,则当次daemon服务意外终止后,会再次自动启动。

[Install]:定义由systemctl enable以及systemctl disable命令在实现服务启动或禁用时用到的一些选项。

Alias:别名,可使用systemctl command Alias.service

RequiredBy:被哪些units所依赖,强依赖;

WantedBy:被哪些units所依赖,弱依赖;

Also:安装本服务的时候还要安装别的相关服务。

二、课后练习

1、为编译安装的httpd服务,实现service unit文件。

编译安装,更改配置文件。在/etc/systemd/system中编辑配置文件:

[root@localhost system]# vim httpd.service
[Unit]
Description=apache2
Requires=atd.service
[Service]
Type=simple
ExecStart=/usr/local/bin/apachectl 
[Install]
WantedBy=multi-user.target

重载并启动:

[root@localhost system]# systemctl daemon-reload 
[root@localhost system]# systemctl start httpd
[root@localhost system]# netstat -tan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      
tcp        0      0 0.0.0.0:22        0.0.0.0:*           LISTEN     
tcp        0      0 127.0.0.1:25      0.0.0.0:*            LISTEN     
tcp        0     52 10.1.54.250:22      10.1.252.66:56929       ESTABLISHED
tcp        0      0 10.1.54.250:22     10.1.252.66:57750       ESTABLISHED
tcp6       0      0 :::80        :::*                LISTEN

2、破解centos7root口令:启动时按e进入编辑模式;在linux16行后添加参数rd.break

再按ctrl+x启动。启动后重新按照rw格式挂载sysroot;切换根,更改root密码。在根下创建.autorelabel空文件,使selinux强制检测文件。

blob.png

blob.png

blob.png

3、修改默认的启动内核

在centos7中最好不要修改grub2.cfg文件,先修改/etc/default/grub模板文件;

[root@localhost grub2]# cat /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

将GRUB_DEFAULT=saved一行改为0

最后使用grub2-mkconfig > /boot/grub2/grub.cfg命令重新生成grub2.cfg文件。

4、启动时临时禁用SELinux

[root@localhost system]# getenforce 
Enforcing
[root@localhost system]# setenforce 0
[root@localhost system]# getenforce 
Permissive

5、启动时进入emergency模式:

首先进入e模式:

blob.png

linux16后添加:systemd.unit= emergency.target

ctrl+x启动,进入:

blob.png

6、删除编译安装的新内核:

删除boot中生成的文件;

删除grub2/grub.cfg新内核相关几行;

删除/etc/modules中版本号相关文件;

删除编译安装包等文件。

原创文章,作者:SilencePavilion,如若转载,请注明出处:http://www.178linux.com/49806