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模式功能更少。
修复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、破解centos7的root口令:启动时按e进入编辑模式;在linux16行后添加参数rd.break;
再按ctrl+x启动。启动后重新按照rw格式挂载sysroot;切换根,更改root密码。在根下创建.autorelabel空文件,使selinux强制检测文件。
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模式:
在linux16后添加:systemd.unit= emergency.target
ctrl+x启动,进入:
6、删除编译安装的新内核:
删除boot中生成的文件;
删除grub2/grub.cfg新内核相关几行;
删除/etc/modules中版本号相关文件;
删除编译安装包等文件。
原创文章,作者:SilencePavilion,如若转载,请注明出处:http://www.178linux.com/49806