CentOS 7 巨大变动之systemd取代System V init

转自:http://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html, 少有改动。 1 systemd是什么 首先systmed是一个用户空间的程序,属于应用程序,不属于Linux内核范畴,Linux内核的主要特征在所有发行版中是统一的,厂商可以自由改变的是用

转自:http://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html,少有改动。

1 systemd是什么

首先systmed是一个用户空间的程序,属于应用程序,不属于Linux内核范畴,Linux内核的主要特征在所有发行版中是统一的,厂商可以自由改变的是用户空间的应用程序。

Linux内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于/sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:

(1)以Ubuntu为代表的Linux发行版采用upstart。

(2)以7.0版本之前的CentOS为代表的System V init。

(3)CentOS7.0版本的systemd。

下面是CentOS6.5和CentOS7两个版本初始化进程的信息截图。

CentOS6.5采用的是systemV init

CentOS 7 巨大变动之systemd取代System V initCentOS 7 巨大变动之systemd取代System V init#inittabisnolongerusedwhenusingsystemd. # #ADDINGCONFIGURATIONHEREWILLHAVENOEFFECTONYOURSYSTEM. # #Ctrl-Alt-Deleteishandledby/etc/systemd/system/ctrl-alt-del.target # #systemduses'targets'insteadofrunlevels.Bydefault,therearetwomaintargets: # #multi-user.target:analogoustorunlevel3 #graphical.target:analogoustorunlevel5 # #Tosetadefaulttarget,run: # #ln-sf/lib/systemd/system/<targetname>.target/etc/systemd/system/default.target

这说明,在systemd掌权后,inittab不再起作用,也没有了“运行级”的概念。现在起作用的配置文件是/etc/systemd/system/default.target这个文件了。此文件的内容如下:

#Thisfileispartofsystemd.
#
#systemdisfreesoftware;youcanredistributeitand/ormodifyit
#underthetermsoftheGNULesserGeneralPublicLicenseaspublishedby
#theFreeSoftwareFoundation;eitherversion2.1oftheLicense,or
#(atyouroption)anylaterversion.

[Unit]
Description=Multi-UserSystem
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.servicerescue.target
After=basic.targetrescue.servicerescue.target
AllowIsolate=yes

[Install]
Alias=default.target

systemd的配置文件后缀根据配置单元类型的不同而不同,主要有.service,.target等。

3 Systemd运行原理

3.1 systemd的基本概念

(1)配置单元unit

系统初始化要做很多工作,如挂在文件系统,启动sshd服务,配置交换分区,这都可以看做是一个配置单元,systemd安装功能不同把配置单元分成多种类型。

  • service 后代服务进程,如httpd,mysqld等

  • soket 对应一个套接字,之后对应到一个service,类似于xinetd的功能

  • device 对应udev规则标记的一个设备

  • mount 系统中的一个挂载点,systemd据此进行自动挂载,为了与SystemV兼容,目前systemd自动处理/etc/fstab并转化为mount

  • automount 自动挂载点

  • swap 配置交换分区

  • target 配置单元的逻辑分组,包含多个相关的配置单元,可以当成是SystemV中的运行级。

  • timer 定时器。用来定时触发用户定义的操作,它可以用来取代传统的atd,crond等。

  • snapshot 与target类似,表示当前的运行状态

每一个配置单元都有一个对应的配置文件,系统管理员的任务就是编写和维护这写不同的配置文件,比如一个MySql服务对应一个mysql.service文件。

(2)依赖关系

systemd并不能完全解除各个单元之间的依赖关系,如物理设备单元准备就绪之前,不可能执行挂载单元。为此需要定义各个单元之间的依赖关系。有依赖的地方就会有出现死循环的可能,比如A依赖于B,B依赖于C,C依赖于A,那么导致死锁。systemd为此提供了两种不同程度的依赖关系,一个是require,一个是want,出现死循环时,systemd会尝试忽略want类型的依赖,如仍不能解锁,那么systemd报错。

(3)Target和runlevel

前面说过,systemd使用target取代了systemV的运行级的概念。

表 1. Sysvinit 运行级别和 systemd 目标的对应表

3.2 systemd并行启动原理

如前所述,在 Systemd 中,所有的服务都并发启动,比如 Avahi、D-Bus、livirtd、X11、HAL 可以同时启动。乍一看,这似乎有点儿问题,比如 Avahi 需要 syslog 的服务,Avahi 和 syslog 同时启动,假设 Avahi 的启动比较快,所以 syslog 还没有准备好,可是 Avahi 又需要记录日志,这岂不是会出现问题?

Systemd 的开发人员仔细研究了服务之间相互依赖的本质问题,发现所谓依赖可以分为三个具体的类型,而每一个类型实际上都可以通过相应的技术解除依赖关系。

并发启动原理之一:解决 socket 依赖

绝大多数的服务依赖是套接字依赖。比如服务 A 通过一个套接字端口 S1 提供自己的服务,其他的服务如果需要服务 A,则需要连接 S1。因此如果服务 A 尚未启动,S1 就不存在,其他的服务就会得到启动错误。所以传统地,人们需要先启动服务 A,等待它进入就绪状态,再启动其他需要它的服务。Systemd 认为,只要我们预先把 S1 建立好,那么其他所有的服务就可以同时启动而无需等待服务 A 来创建 S1 了。如果服务 A 尚未启动,那么其他进程向 S1 发送的服务请求实际上会被 Linux 操作系统缓存,其他进程会在这个请求的地方等待。一旦服务 A 启动就绪,就可以立即处理缓存的请求,一切都开始正常运行。

那么服务如何使用由 init 进程创建的套接字呢?

Linux 操作系统有一个特性,当进程调用 fork 或者 exec 创建子进程之后,所有在父进程中被打开的文件句柄 (file descriptor) 都被子进程所继承。套接字也是一种文件句柄,进程 A 可以创建一个套接字,此后当进程 A 调用 exec 启动一个新的子进程时,只要确保该套接字的 close_on_exec 标志位被清空,那么新的子进程就可以继承这个套接字。子进程看到的套接字和父进程创建的套接字是同一个系统套接字,就仿佛这个套接字是子进程自己创建的一样,没有任何区别。

这个特性以前被一个叫做 inetd 的系统服务所利用。Inetd 进程会负责监控一些常用套接字端口,比如 Telnet,当该端口有连接请求时,inetd 才启动 telnetd 进程,并把有连接的套接字传递给新的 telnetd 进程进行处理。这样,当系统没有 telnet 客户端连接时,就不需要启动 telnetd 进程。Inetd 可以代理很多的网络服务,这样就可以节约很多的系统负载和内存资源,只有当有真正的连接请求时才启动相应服务,并把套接字传递给相应的服务进程。

和 inetd 类似,systemd 是所有其他进程的父进程,它可以先建立所有需要的套接字,然后在调用 exec 的时候将该套接字传递给新的服务进程,而新进程直接使用该套接字进行服务即可。

并发启动原理之二:解决 D-Bus 依赖

D-Bus 是 desktop-bus 的简称,是一个低延迟、低开销、高可用性的进程间通信机制。它越来越多地用于应用程序之间通信,也用于应用程序和操作系统内核之间的通信。很多现代的服务进程都使用D-Bus 取代套接字作为进程间通信机制,对外提供服务。比如简化 Linux 网络配置的 NetworkManager 服务就使用 D-Bus 和其他的应用程序或者服务进行交互:邮件客户端软件 evolution 可以通过 D-Bus 从 NetworkManager 服务获取网络状态的改变,以便做出相应的处理。

D-Bus 支持所谓”bus activation”功能。如果服务 A 需要使用服务 B 的 D-Bus 服务,而服务 B 并没有运行,则 D-Bus 可以在服务 A 请求服务 B 的 D-Bus 时自动启动服务 B。而服务 A 发出的请求会被 D-Bus 缓存,服务 A 会等待服务 B 启动就绪。利用这个特性,依赖 D-Bus 的服务就可以实现并行启动。

并发启动原理之三:解决文件系统依赖

系统启动过程中,文件系统相关的活动是最耗时的,比如挂载文件系统,对文件系统进行磁盘检查(fsck),磁盘配额检查等都是非常耗时的操作。在等待这些工作完成的同时,系统处于空闲状态。那些想使用文件系统的服务似乎必须等待文件系统初始化完成才可以启动。但是 systemd 发现这种依赖也是可以避免的。

Systemd 参考了 autofs 的设计思路,使得依赖文件系统的服务和文件系统本身初始化两者可以并发工作。autofs 可以监测到某个文件系统挂载点真正被访问到的时候才触发挂载操作,这是通过内核 automounter 模块的支持而实现的。比如一个 open()系统调用作用在”/misc/cd/file1″的时候,/misc/cd 尚未执行挂载操作,此时 open()调用被挂起等待,Linux 内核通知 autofs,autofs 执行挂载。这时候,控制权返回给 open()系统调用,并正常打开文件。

作者: dawei

【声明】:永州站长网内容转载自互联网,其相关言论仅代表作者个人观点绝非权威,不代表本站立场。如您发现内容存在版权问题,请提交相关链接至邮箱:bqsm@foxmail.com,我们将及时予以处理。

为您推荐

联系我们

联系我们

0577-28828765

在线咨询: QQ交谈

邮箱: xwei067@foxmail.com

工作时间:周一至周五,9:00-17:30,节假日休息

返回顶部