systemd
是一个系统和服务管理器,它的主进程的默认进程ID
是1。systemd
主进程是系统所有进程的起点。Linux
系统在完成内核引导以后就开始运行systemd
程序。systemd
的主要功能包括:
在System V
系统中,系统服务被赋予了不同的优先级。系统启动时,System V
的主进程init
会按优先级依次启动服务,即按优先级排序,优先级高的先启动,启动完成后再启动优先级较低的服务。System V
的启动过程类似于串行队列处理系统,排在队伍前面的先启动,前面的启动完成再启动后面的服务。这样做的好处是能解决服务之间的依赖性问题,例如需要使用网络的服务必须等待网络启动后才能启动。坏处是服务总是排队处理,效率太低。
System V
的另一个问题是,启动系统时会将可能用到的所有服务都启动。有些服务可能从未使用过,例如打印服务CUPS
、蓝牙服务Bluetooth
等,这些服务虽未被使用过,但却一直运行在系统中消耗着系统资源。
为了解决这些问题,systemd
采取了两项技术:
System V
的init
进程不仅需要启动服务,还要能跟踪和管理服务进程的生命周期,这项工作非常有难度。服务进程通常在后台运行,有时服务进程会多次派生,其难度在于要准确获得派生进程的PID
才能完整关闭服务。
Cgroup
是Linux
内核的特性,主要用来实现系统资源配额管理。当进程创建子进程时,子进程会自动继承父进程的Cgroup
。因此无论进程如何派生子进程,它们的Cgroup
都是一样的。systemd
正是利用了Linux
内核的Cgroup
特性来跟踪进程的,当服务停止后,systemd
只需要遍历查询指定的Cgroup
,就可以找到所有子进程,然后一一结束即可。
systemd
还针对性地重新设计了系统的日志服务journald
,其主要是针对正在使用的syslog
的一些缺点。syslog
的缺点主要存在两方面:其一是日志不安全,进程在产生日志消息时,消息的内容均由进程自主产生,任何进程都可以互相冒充,因为syslog
并不会验证消息的来源是否属实;其二是日志消息没有严格的格式,这使得自动化处理日志变得困难、低效。
journald
进行了重新设计,不再使用文本格式存放日志,而使用二进制文件存放日志;同时还有可移植性高、资源消耗少、结构简单、可扩展、安全性高等优点。
systemd
配置文件被称为单元,根据类型不同,以不同的扩展名结尾。系统初始化需要做的事情非常多,需要启动后台服务,比如启动sshd
服务;需要做配置工作,比如挂载文件系统。这个过程中的每一步都被systemd
抽象为一个配置单元,即单元unit
。可以认为一个服务是一个配置单元;一个挂载点是一个配置单元;一个交换分区的配置是一个配置单元。systemd
将配置单元归纳为一些不同的类型。
在systemd
中,服务、设备、挂载等资源统一被称为单元,所以systemd
中有许多单元类型。服务单元文件的扩展名是.service
,同Shell
脚本的功能相似。
systemd
单元文件放置位置有以下路径:
# systemctl -t help