CentOS 6和之前版本采用SysVinit的系统启动进程管理体系,一般用户都可通过在/etc/inittab文件的配置,来个性化自己的系统启动序列。但也经常会由于特殊环境的硬件等关系问题,造成其串行的启动进程控制流,因为可能任务的阻塞而影响启动过程。
CentOS 7开始使用SystemD,所以我们必须要了解SystemD.
详细介绍请参阅: RedHat 产品文档
使用systemd管理服务: Chapter 6. Managing Services with systemd:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/chap-Managing_Services_with_systemd.html
一、 SystemD起源
SystemD是Linux下的一种init软件,由Lennart Poettering带头开发,并在LGPL 2.1及其后续版本许可证下开源发布。Lennart是redhat员工,但SystemD不是redhat项目。其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,同时达到降低Shell的系统开销的效果,最终代替现在常用的System V与BSD风格init程序。
SystemD这一名字源于Unix中的一个惯例:在Unix中常以“d”作为系统守护进程(英语:daemon,亦称后台进程)的后缀标识。除此以外,SystemD亦是借代英文术语D体系,而这一术语即是用于描述一个人具有快速地适应环境并解决困难的能力。
SystemD被设计用来改进SysVinit的缺点,与Ubuntu的upstart形成技术竞争。SystemD的很多概念来源于苹果的launchd。目标是尽可能启动更少进程;尽可能将更多进程并行启动(这是性能优于SysVinit的理念基础)。SystemD尽可能减少对Shell脚本的依赖。传统SysVinit使用inittab来决定运行哪些Shell脚本,大量使用Shell脚本被认为是效率低下无法并行的原因。SystemD使用了Linux专属技术,不再顾及POSIX兼容,只要能满足社会变革的需要,突破一些可能过时的技术约束,这也是当今创信理念的需要,相信市场会给出评判。
与多数发行版使用的System V风格init相比,SystemD采用了以下新技术:
采用Socket激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能;
用cgroups代替PID来追踪进程,因此即使是两次fork之后生成的守护进程也不会脱离systemd的控制。
从设计构思上说,由于SystemD使用了cgroup与fanotify等组件以实现其特性,所以只适用于Linux。有鉴于此,基于kFreeBSD分支的软件源无法纳入SystemD。
二、 SystemD 的工具
用SystemD初始化工具(init tool)来启动系统。SystemD 含了自己的配置和诊断工具,在使用它处理系统启动问题时用到的技巧不同于SysVinit。
SystemD初始化工具虽面世不久,却已成为一些发行版中默认使用的初始化工具;一些其他的发行版把它包含进来,作为upstart和SysVinit的替代品。由于它与upstart和SysVinit的兼容特性,在使用这两个初始化工具的发行版里面熟悉的命令与技巧也适用于SystemD。但是,为了能够真正利用好这个新的初始化系统的功能,系统管理员也需要了解SystemD的工具与参数。
给SystemD传达命令的主要工具是systemctl,它是一个命令行程序。该工具在改变配置文件或重新启动后台程序时需要root权限,但即使是非root用户也能下达一些诊断的命令。如果在启动该命令时不加任何参数,会看到一个系统启动时执行任务的“单位(unit)”列表,包括挂载及检测磁盘、启动后台服务及配置硬件。
服务(service)单位是最重要的一类单位之一,因它管理着后台服务,而在使用SysVinit的发行版里则一般使用初始化脚本来启动这些服务。
挂载(mount)与自动挂载(automount)单位用来挂载文件系统。
套接字(socket)单位用来创建套接字,并在访问套接字后,立即利用依赖关系间接地启动另一单位。
可使用参数让systemctl只列出某个类型的单位,如所有的服务单位:
systemctl –type=service
SystemD自动将其输出结果递交给less显示,列表中:
第一栏是单位的名字;
第二栏则表示该单位的定义是否已由SystemD正确加载。
第三栏则为该单位是否正在运行。如果使用了-a参数,那么该程序将仅显示非正在运行的单位,即已安装但并未在启动时使用的单位,同时也包含引导系统未能正常加载的单位文件。
第四栏则给出了当前状态:“exited”表示该进程已经无任何错误地完成,这种情况适用于,诸如进程在启动后并不在后台继续运行的情况,例如,在系统启动时由于考虑到兼容性因素执行在SysVinit里面常用的/etc/rc.d/rc.local文件的服务单位。“Running”表示正在后台运行的服务,如cron、dbus、sshd和udev。
第五栏是对该单位的描述。标有“LSB”或“SYSV”的单位已由systemd自动创建以管理传统启动脚本。
不能启动或启动后崩溃的服务在第四栏中用红色标为“failed”。可用如下命令来察看该服务是何时崩溃的以及在服务程序结束后提供了什么错误代码:
systemctl status ntpd.service
systemctl会列出包含文本终端的登录进程(agetty)的服务型单位。因为SystemD不同于Sysvinit,它会像管理普通的后台服务一样以服务单位的形式对这些进程进行管理。
1. SystemD服务管理
systemctl is-enabled .service #查询服务是否开机启动
sudo systemctl enable .service #开机运行服务
sudo systemctl disable .service #取消开机运行
sudo systemctl start .service #启动服务
sudo systemctl stop .service #停止服务
sudo systemctl restart .service #重启服务
sudo systemctl reload .service #重新加载服务配置文件
systemctl status .service #查询服务运行状态
systemctl –failed #显示启动失败的服务
2. 开机模块加载
/etc/modules-load.d/.conf,相当于原rc.conf中的MODULES变量
模块黑名单仍在/etc/modprobe.d/下,如blacklist.conf:
3. Locale
/etc/locale.conf,相当于原rc.conf中的LOCALE
4. 日志服务
systemd自带日志服务,参考systemd Journal
可以删除syslog-ng了
5. 主机名
/etc/hostname,相当于原来rc.conf中的HOSTNAME变量
6. 网络
还是用NetworkManager工具
三、 单位文件与目标(target)
1. 单位的处理
创建单位用的系统配置文件位于/lib/systemd/system/,但/etc/systemd/system目录下的同名文件会优先于前者。
单位文件的定义通常比传统的SysVinit脚本要短得多。例如,用于通过NTP来同步网络时间的服务只有短短几行:
1 [Unit]
2 Description=Network Time Service
3
4 [Service]
5 ExecStart=/usr/bin/ntpd -n -u ntp:ntp -g
6
7 [Install]
8 WantedBy=multi-user.target
所有的单位文件都包含由[Unit]开头的一节,其中包含一般设置与简短介绍。
[Service]一节含有针对该服务要进行的任务的指定设置。
[Install]一节包含了SystemD在(反)安装时要解释的说明。
2. 目标
“目标”单位的概念与SysVinit的运行级别相似;实际上,为考虑兼容性,SystemD甚至能够识别与目标对应的运行级别名称。所以,可在引导装载程序中的kernel一行中加入single这个参数;SystemD就会激活rescue.target,提供一个相当于单用户模式的最小化界面。
在SystemD中,多用户模式(即非图形化登录启动系统的模式)由multi-user.target表示,可以通过下面这个链接来将其设为默认启动目标:
ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target
如果此后确实需要默认启动图形化登录界面,可用同样的方式来将graphical.target设为默认目标。这等同于传统初始化工具的运行级别5。也可以在引导装载程序中为kernel指定想要启动的目标单位:
systemd.unit=multi-user.target
如想在操作过程中激活一个不同的目标单位,可用systemctl的isolate命令(需要root权限):
systemctl isolate rescue.target
切换为rescue目标对于管理任务来说很有用,SystemD这时会停止所有的用户登录与后台服务,只有系统服务在运行。有时,甚至这些服务也需要停止并重新安装,这时可使用emergency.target来进入紧急模式(emergency mode),这时只有命令提示符的进程以及内核线程在运行。
3. 运行级别
SystemD用target替代了runlevel的概念,提供了更大的灵活性,如可以继承一个已有的target,并添加其它服务,来创建自己的target。
sudo systemctl list-units –type=target #查询当前target
sudo systemctl isolate graphical.target #改变当前target,重启无效
sudo systemctl enable multi-user.target #改变启动时默认target
sudo systemctl enable kdm.service #graphical是默认target,指定使用的display manager
4. 其他
sudo systemctl reboot #systemctl还有系统关机、重启、挂起等功能sudo systemctl suspend