CentOS 7 学习笔记(二)systemd

sysVinit启动原理
在我们打开Linux电脑的电源后第一个启动的进程就是init。分配给init进程的PID是1。它是系统其他所有进程的父进程。当一台Linux电脑启动后,处理器会先在系统存储中查找BIOS,之后BIOS会检测系统资源然后找到第一个引导设备,通常为硬盘,然后会查找硬盘的主引导记录(MBR),然后加载到内存中并把控制权交给它,以后的启动过程就由MBR控制。
主引导记录会初始化引导程序(Linux上有两个著名的引导程序,GRUB和LILO,80%的Linux系统在用GRUB引导程序),这个时候GRUB或LILO会加载内核模块。内核会马上查找/sbin下的“init”程序并执行它。从这里开始init成为了Linux系统的父进程。init读取的第一个文件是/etc/inittab,通过它init会确定我们Linux操作系统的运行级别。它会从文件/etc/fstab里查找分区表信息然后做相应的挂载。然后init会启动/etc/init.d里指定的默认启动级别的所有服务/脚本。所有服务在这里通过init一个一个被初始化。在这个过程里,init每次只启动一个服务,所有服务/守护进程都在后台执行并由init来管理。
关机过程差不多是相反的过程,首先init停止所有服务,最后阶段会卸载文件系统。

理解Systemd
开发Systemd的主要目的就是减少系统引导时间和计算开销。Systemd(系统管理守护进程),最开始以GNU GPL协议授权开发,现在已转为使用GNU LGPL协议,它是如今讨论最热烈的引导和服务管理程序。如果你的Linux系统配置为使用Systemd引导程序,它取替传统的SysV init,启动过程将交给systemd处理。Systemd的一个核心功能是它同时支持SysV init的后开机启动脚本。

Systemd引入了并行启动的概念,它会为每个需要启动的守护进程建立一个套接字,这些套接字对于使用它们的进程来说是抽象的,这样它们可以允许不同守护进程之间进行交互。Systemd会创建新进程并为每个进程分配一个控制组(cgroup)。处于不同控制组的进程之间可以通过内核来互相通信。systemd处理开机启动进程的方式非常漂亮,和传统基于init的系统比起来优化了太多。让我们看下Systemd的一些核心功能。

1 和init比起来引导过程简化了很多
2 Systemd支持并发引导过程从而可以更快启动
3 通过控制组来追踪进程,而不是PID
4 优化了处理引导过程和服务之间依赖的方式
5 支持系统快照和恢复
6 监控已启动的服务;也支持重启已崩溃服务
7 包含了systemd-login模块用于控制用户登录
8 支持加载和卸载组件
9 低内存使用痕迹以及任务调度能力
10 记录事件的Journald模块和记录系统日志的syslogd模块
Systemd同时也清晰地处理了系统关机过程。它在/usr/lib/systemd/目录下有三个脚本,分别叫systemd-halt.service,systemd-poweroff.service,systemd-reboot.service。这几个脚本会在用户选择关机,重启或待机时执行。在接收到关机事件时,systemd首先卸载所有文件系统并停止所有内存交换设备,断开存储设备,之后停止所有剩下的进程。

Systemd是一种新的linux系统服务管理器,它替换了init系统,能够管理系统的启动过程和一些系统服务,一旦启动起来,就将监管整个系统。
为了减少系统启动时间,systemd 的目标是:
尽可能启动更少的进程
尽可能将更多进程并行启动

Systemd配置目录:
/usr/lib/systemd/
/etc/systemd/

查看进程树:

[[email protected] ~]# pstree
systemd─┬─NetworkManager─┬─dhclient
        │                └─3*[{NetworkManager}]
        ├─abrt-watch-log
        ├─abrtd
        ├─atd
        ├─auditd───{auditd}
        ├─avahi-daemon───avahi-daemon
        ├─chronyd
        ├─crond
        ├─dbus-daemon───{dbus-daemon}
        ├─firewalld───{firewalld}
        ├─iprdump
        ├─iprinit
        ├─iprupdate
        ├─irqbalance
        ├─login───bash
        ├─lsmd
        ├─lvmetad
        ├─master─┬─pickup
        │        └─qmgr
        ├─polkitd───5*[{polkitd}]
        ├─rsyslogd───2*[{rsyslogd}]
        ├─smartd
        ├─sshd─┬─sshd───bash
        │      └─sshd───bash───pstree
        ├─systemd-journal
        ├─systemd-logind
        ├─systemd-udevd
        └─tuned───4*[{tuned}]

查看系统服务启动时间:

[[email protected] ~]# systemd-analyze
Startup finished in 1.503s (kernel) + 3.193s (initrd) + 23.967s (userspace) = 28.664s
[[email protected] ~]# systemd-analyze blame
          8.874s firewalld.service
          7.682s tuned.service
          4.308s avahi-daemon.service
          4.001s systemd-logind.service
          2.559s rsyslog.service
          2.433s systemd-udev-settle.service
          2.242s iprupdate.service
          2.130s kdump.service
          2.083s postfix.service
          1.872s iprinit.service

systemctl 的基本用法:
systemctl - 列出所有单元(UNIT)以及它们的状态(这里的 UNIT 指的就是系统上的 job 和 service)
systemctl list-units - 列出所有 UNIT
systemctl start [NAME...] - 启动一项或多项 UNIT
systemctl stop [NAME...] - 停止一项或多项 UNIT
systemctl disable [NAME...] - 将 UNIT 设置为开机不启动
systemctl list-unit-files - 列出所有已安装的 UNIT,以及它们的状态
systemctl --failed - 列出开机启动失败的 UNIT
systemctl --type=mount - 列出某种类型的 UNIT,类型包含:service, mount, device, socket, target
systemctl enable debug-shell.service - 将一个 shell 脚本设置为开机启动,用于调试

systemctl status httpd.service
systemctl start httpd.service
systemctl stop httpd.service
systemctl restart httpd.service
systemctl try-restart httpd.service
systemctl reload httpd.service
systemctl enable httpd.service
systemctl disable httpd.service

systemctl 实现转换运行级别、重启系统和关闭系统的功能:

systemctl isolate graphical.target - 切换到运行级别5,就是有桌面的运行级别
systemctl isolate multi-user.target - 切换到运行级别3,没有桌面的运行级别
systemctl reboot - 重启系统
systemctl poweroff - 关机
所有命令,包括切换到其他运行级别的命令,都可以在普通用户的权限下执行。

systemctl日志:

journalctl --all - 显示系统上所有日志,以及它的用户
journalctl -f - 监视系统日志的变化(类似 tail -f /var/log/messages 的效果)
journalctl -b - 显示系统启动以后的日志
journalctl -k -b -1 - 显示上一次(-b -1)系统启动前产生的内核日志
journalctl -b -p err - 显示系统启动后产生的“ERROR”日志
journalctl --since=yesterday - 当系统不会经常重启的时候,这条命令能提供比 -b 更短的日志记录
journalctl -u cron.service --since=‘2014-07-06 07:00‘ --until=‘2014-07-06 08:23‘ - 显示 cron 服务在某个时间段内打印出来的日志
journalctl -p 2 --since=today - 显示优先级别为2以内的日志,包含 emerg、alert、crit三个级别。所有日志级别有: emerg (0), alert (1), crit (2), err (3), warning (4), notice (5), info (6), debug (7)
journalctl > yourlog.log - 将二进制日志文件复制成文本文件并保存到当前目录

[[email protected] log]# journalctl -xn
-- Logs begin at 四 2015-05-21 22:29:27 CST, end at 五 2015-05-22 00:01:04 CST. --
5月 22 00:00:01 limt01 CROND[3894]: (root) CMD (/usr/lib64/sa/sa1 1 1)
5月 22 00:01:04 limt01 systemd[1]: Starting Session 19 of user root.
-- Subject: Unit session-19.scope has begun with start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit session-19.scope has begun starting up.
5月 22 00:01:04 limt01 systemd[1]: Started Session 19 of user root.
-- Subject: Unit session-19.scope has finished start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit session-19.scope has finished starting up.

利用 systemd 分析系统启动过程:
systemd-analyze - 显示本次启动系统过程中用户态和内核态所花的时间
systemd-analyze blame - 显示每个启动项所花费的时间明细
systemd-analyze critical-chain - 按时间顺序打印 UNIT 树
systemd-analyze dot | dot -Tsvg > systemd.svg - 为开机启动过程生成向量图(需要安装 graphviz 软件包)
systemd-analyze plot > bootplot.svg - 产生开机启动过程的时间图表

systemd 与 sysVinit 管理对比图:

时间: 2024-08-28 13:34:42

CentOS 7 学习笔记(二)systemd的相关文章

CentOS 7学习笔记(二)之Nginx安装

说明: 1.这篇学习记录的目的是如何在CentOS 7上面安装Nginx,包括两种安装方式,yum源安装和源代码编译安装: 2.CentOS 7初学者,某些观点带有猜测之意,文中不足之处,还请批评指正,定会虚心受教. 第一部分 yum源安装 yum源安装相对比较容易,不必处理复杂的依赖关系.初次安装,我就先采用yum安装方式.根据nginx的wiki上面的安装介绍. 第一步 添加yum源 为了获得最新版的nginx,nginx安装说明建议直接从nginx官网下载,需要新建一个源.新建文件 /et

linux学习笔记二:硬盘信息查询

在linux管理中,硬盘管理是很重要的一部分.包括阵列,分区,逻辑卷等操作,在对硬盘操作前,需要充分的了解硬盘的信息.常用的硬盘查询有以下几种: 1.df  查看文件系统空间使用情况: linux-lszd-db:~ # dfFilesystem     1K-blocks     Used Available Use% Mounted on/dev/sda6      809262496 37615092 770825244   5% /udev             8076412    

Caliburn.Micro学习笔记(二)----Actions

Caliburn.Micro学习笔记(二)----Actions 上一篇已经简单说了一下引导类和简单的控件绑定 我的上一个例子里的button自动匹配到ViewModel事件你一定感觉很好玩吧 今天说一下它的Actions,看一下Caliburn.Micro给我们提供了多强大的支持 我们还是从做例子开始 demo的源码下载在文章的最后 例子1.无参数方法调用 点击button把textBox输入的文本弹出来 如果textbox里没有文本button不可点,看一下效果图 看一下前台代码 <Stac

2. 蛤蟆Python脚本学习笔记二基本命令畅玩

2. 蛤蟆Python脚本学习笔记二基本命令畅玩 本篇名言:"成功源于发现细节,没有细节就没有机遇,留心细节意味着创造机遇.一件司空见惯的小事或许就可能是打开机遇宝库的钥匙!" 下班回家,咱先来看下一些常用的基本命令. 欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/48092873 1.  数字和表达式 看下图1一就能说明很多问题: 加法,整除,浮点除,取模,幂乘方等.是不是很直接也很粗暴. 关于上限,蛤蟆不太清楚

小猪的数据结构学习笔记(二)

小猪的数据结构学习笔记(二) 线性表中的顺序表 本节引言: 在上个章节中,我们对数据结构与算法的相关概念进行了了解,知道数据结构的 逻辑结构与物理结构的区别,算法的特性以及设计要求;还学了如何去衡量一个算法 的好坏,以及时间复杂度的计算!在本节中我们将接触第一个数据结构--线性表; 而线性表有两种表现形式,分别是顺序表和链表;学好这一章很重要,是学习后面的基石; 这一节我们会重点学习下顺序表,在这里给大家一个忠告,学编程切忌眼高手低,看懂不代表自己 写得出来,给出的实现代码,自己要理解思路,自己

JavaScript--基于对象的脚本语言学习笔记(二)

第二部分:DOM编程 1.文档象模型(DOM)提供了访问结构化文档的一种方式,很多语言自己的DOM解析器. DOM解析器就是完成结构化文档和DOM树之间的转换关系. DOM解析器解析结构化文档:将磁盘上的结构化文档转换成内存中的DOM树 从DOM树输出结构化文档:将内存中的DOM树转换成磁盘上的结构化文档 2.DOM模型扩展了HTML元素,为几乎所有的HTML元素都新增了innerHTML属性,该属性代表该元素的"内容",即返回的某个元素的开始标签.结束标签之间的字符串内容(不包含其它

马哥学习笔记二十四——分布式复制快设备drbd

DRBD: 主从 primary: 可执行读.写操作 secondary: 文件系统不能挂载 DRBD: dual primay, 双主(基于集群文件系统的高可用集群) 磁盘调度器:合并读请求,合并写请求: Procotol:drbd数据同步协议 A: Async, 异步  数据发送到本机tcp/ip协议栈 B:semi sync, 半同步  数据发送到对方tcp/ip协议 C:sync, 同步  数据到达对方存储设备 DRBD Source: DRBD资源 资源名称:可以是除了空白字符外的任意

【Unity 3D】学习笔记二十八:unity工具类

unity为开发者提供了很多方便开发的工具,他们都是由系统封装的一些功能和方法.比如说:实现时间的time类,获取随机数的Random.Range( )方法等等. 时间类 time类,主要用来获取当前的系统时间. using UnityEngine; using System.Collections; public class Script_04_13 : MonoBehaviour { void OnGUI() { GUILayout.Label("当前游戏时间:" + Time.t

Spring Batch学习笔记二

此系列博客皆为学习Spring Batch时的一些笔记: Spring Batch的架构 一个Batch Job是指一系列有序的Step的集合,它们作为预定义流程的一部分而被执行: Step代表一个自定义的工作单元,它是Job的主要构件块:每一个Step由三部分组成:ItemReader.ItemProcessor.ItemWriter:这三个部分将执行在每一条被处理的记录上,ItemReader读取每一条记录,然后传递给ItemProcessor处理,最后交给ItemWriter做持久化:It

angular学习笔记(二十八)-$http(6)-使用ngResource模块构建RESTful架构

ngResource模块是angular专门为RESTful架构而设计的一个模块,它提供了'$resource'模块,$resource模块是基于$http的一个封装.下面来看看它的详细用法 1.引入angular-resource.min.js文件 2.在模块中依赖ngResourece,在服务中注入$resource var HttpREST = angular.module('HttpREST',['ngResource']); HttpREST.factory('cardResource