总第79篇

本文将详细梳理Linux系统的初始化进程systemd 。通过对此进程的理解,你将对系统的初始化有一个深入的理解,从而更好地理解其它的操作。

Linux系统的开机过程是这样的:从BIOS开始,进入Boot Loader,再加载内核系统,进行内核初始化,最后启动初始化进程。以前Linux的启动一直是采用init进程的,启动服务的方式如下:

$sudo /etc/init.d/apache2 start
或者
$service apache2 start 

这种启动方式有两个缺点:一是启动时间长,init进程是串行启动,只有前一个进程启动完成,才会启动下一个进程;二是启动脚本复杂,init进程只执行启动脚本,不管其它事情,脚本需要处理各种情况,从而使得脚本变得很长。

1.systemd概述

根据Linux惯例,字母d是守护进程(daemon)的缩写systemd的含义是它要守护整个系统。 systemd是为了解决initd的缺点问题而诞生的, 它为系统的启动和管理提供了一套完整的解决方案。

使用systemd就不再需要initd了,它成了系统的第一个进程(PID= 1),其它进程都是它的子进程。systemd初始化进程服务采用并发启动机制,开机速度得到了很大的提升。可以用命令$ systemctl --version命令 查看systemd的版本。

systemd的优点是功能强大,使用方便,其缺点是体系庞大,非常复杂,与操作系统的其它部分强耦合,下图是systemd的体系架构图。

2. systemd对系统的管理

systemd并不是一个命令,而是一组命令,涉及到对系统各方面的管理。

  • systemctlsystemd的主命令,用于管理系统。其常用的操作如下:
# 重启系统
$ sudo systemctl reboot# 关闭系统,切断电源
$ sudo systemctl poweroff# CPU停止工作
$ sudo systemctl halt# 暂停系统
$ sudo systemctl suspend# 让系统进入冬眠状态
$ sudo systemctl hibernate# 让系统进入交互式休眠状态
$ sudo systemctl hybrid-sleep# 启动进入救援状态(单用户状态)
$ sudo systemctl rescue

  • systemd-analyze命令用于查看启动时的耗时。其常用的操作如下:
# 查看启动耗时
$ systemd-analyze                                                                                       # 查看每个服务的启动耗时
$ systemd-analyze blame# 显示瀑布状的启动过程流
$ systemd-analyze critical-chain# 显示指定服务的启动流
$ systemd-analyze critical-chain atd.service

  • hostnamectl命令用于查看当前主机的信息。其常用的操作如下:
# 显示当前主机的信息
$ hostnamectl# 设置主机名。
$ sudo hostnamectl set-hostname rhel8

  • localectl命令用于查看本地化设置。其常用的操作如下:
# 查看本地化设置
$ localectl# 设置本地化参数。
$ sudo localectl set-locale LANG=en_GB.utf8
$ sudo localectl set-keymap en_GB

  • timedatectl命令用于查看当前时区设置。其常用的操作如下:
 # 查看当前时区设置
$ timedatectl# 显示所有可用的时区
$ timedatectl list-timezones                                                                                   # 设置当前时区
$ sudo timedatectl set-timezone America/New_York
$ sudo timedatectl set-time YYYY-MM-DD
$ sudo timedatectl set-time HH:MM:SS

  • loginctl命令用于查看当前登录用户的相关信息。其常用的操作如下:
# 列出当前session
$ loginctl list-sessions# 列出当前登录用户
$ loginctl list-users# 列出显示指定用户的信息
$ loginctl show-user wujitao

3. 资源单位Unit

systemd可以管理所有的系统资源,不同的资源统称为UnitLinux系统中Unit可以分为12种,列表如下:

uUnit 说明
Service Unit 系统服务
Target Unit 多个Unit构成一个组
Device Unit 硬件设备
Mount Unit 文件系统的挂载点
Automount Unit 自动挂载点
Path Unit 文件或路径
Scope Unit 不是由systemd启动的外部进程
Slice Unit 进程组
Snapshot Unit systemd快照,可以切回某个快照
Socket Unit 进程间通信的socket
Swap Unit swap文件
Timer Unit 定时器

systemctl list-units命令可以查看当前系统的所有Unit。其常用的操作如下:

# 列出正在运行的 Unit
$ systemctl list-units# 列出所有Unit,包括没有找到配置文件的或者启动失败的
$ systemctl list-units --all# 列出所有没有运行的 Unit
$ systemctl list-units --all --state=inactive# 列出所有加载失败的 Unit
$ systemctl list-units --failed# 列出所有正在运行的、类型为 service 的 Unit
$ systemctl list-units --type=service

可以用systemctl status命令查看系统状态和单个Unit的状态。其常用操作如下:

# 显示系统状态
$ systemctl status# 显示单个 Unit 的状态
$ sysystemctl status bluetooth.service# 显示远程主机的某个 Unit 的状态
$ systemctl -H root@rhel8.redhat.com status httpd.service# 显示某个 Unit 是否正在运行
$ systemctl is-active application.service# 显示某个 Unit 是否处于启动失败状态
$ systemctl is-failed application.service# 显示某个 Unit 服务是否建立了启动链接
$ systemctl is-enabled application.service

对一用户来说,最常用的操作就是启动或停止Unit(主要是service)。下面列出一常用的操作:

# 立即启动一个服务
$ sudo systemctl start apache.service# 立即停止一个服务
$ sudo systemctl stop apache.service# 重启一个服务
$ sudo systemctl restart apache.service# 杀死一个服务的所有子进程
$ sudo systemctl kill apache.service# 重新加载一个服务的配置文件
$ sudo systemctl reload apache.service# 重载所有修改过的配置文件
$ sudo systemctl daemon-reload# 显示某个 Unit 的所有底层参数
$ systemctl show httpd.service# 显示某个 Unit 的指定属性的值
$ systemctl show -p CPUShares httpd.service# 设置某个 Unit 的指定属性
$ sudo systemctl set-property httpd.service CPUShares=500

Unit之间存在依赖关系,比如A依赖于B,这意味着在systemd启动A时,会同时去启动B。可以用$ systemctl list-dependencies命令列出一个Unit的所有依赖,如下所示:

#列出蓝牙服务的所有依赖资源
$ systemctl list-dependencies --all bluetooth.service
#-all参数用来展开target,若不想展开,则可去掉

4. Unit的配置文件

每个Unit都有一个配置文件,告诉systemd如何启动这个Unitsystemd默认从目录/etc/systemd/system中读取配置文件,但这个目录中大部分是软链接文件,真正的配置文件存放在目录/usr/lib/systemd/system/中。

配置文件的后缀名,表明就是该Unit的种类,若无后缀名,则用默认后缀名.service

可以用systemctl enablesystemctl disable命令在两个目录间建立或取消符号链接,如下示例:

#建立符号链接
$ sudo systemctl enable atd.service
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/atd.service' '/etc/systemd/system/atd.service'#取消符号链接
$ sudo systemctl disable atd.service

可以用systemctl list-unit-files命令列出所有的配置文件,如下图所示:

可以看到每个配置文件的状态,其状态含义如下:

  • enabled:已建立启动链接;
  • disabled:未建立启动链接;
  • static:该配置文件没有install部分,只能作为其它配置文件的依赖;

注意,仅从配置文件状态还无法看出此Unit是否正在运行,必须执行systemctl status命令才可以。

对于目录下的配置文件,一旦修改,就必须让systemd重新加载配置文件,并重新启动,否则修改不会生效,其操作步骤如下:

#如修改了httpd的配置文件,要先重载,再重启
$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service

配置文件就是普通的文本文件,可用systemctl cat命令查看配置文件的内容。 配置文件的完整字段清单可以参考官方文档

5. Target

systemdtarget代替了传统init启动模式里面的运行级别的概念。每个target中包含多个Unit,这样启动某个target就会启动里面所有的Unit,从这个意义上说,target相当于一个“状态点”,启动某个target就启动至某种状态。

注意,传统的运行级别是互斥的,不可能多个RunLevel同时启动,但是多个target可以同时启动。其常用的几个操作如下:

# 查看当前系统的所有 Target
$ systemctl list-unit-files --type=target# 查看一个 Target 包含的所有 Unit
$ systemctl list-dependencies multi-user.target# 查看启动时的默认 Target
$ systemctl get-default# 设置启动时的默认 Target
$ sudo systemctl set-default multi-user.target# 切换 Target 时,默认不关闭前一个 Target 启动的进程,
# systemctl isolate 命令改变这种行为,
# 关闭前一个 Target 里面所有不属于后一个 Target 的进程
$ sudo systemctl isolate multi-user.target

target与传统RunLevel的对应关系如下图所示:

若想要将系统默认的运行目标修改为“多用户无图形”模式,可直接用符号即可,命令如下:

$ sudo ln -sf /usr/lib/systemd/system/multi-user.target  /etc/systemd/system/default.target

6. 日志管理

systemd统一管理所有Unit的启动日志,带来的好处是,可以只用journalctl一个命令查看所有日志(包括内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf

journalctl的功能非常强大,其常用的操作如下示例:

# 查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl# 查看内核日志(不显示应用日志)
$ sudo journalctl -k# 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0# 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1# 查看指定时间的日志
$ sudo journalctl --since="2020-10-01 18:18:18"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2019-01-10" --until "2020-01-11 00:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"# 显示尾部的最新10行日志
$ sudo journalctl -n# 显示尾部指定行数的日志
$ sudo journalctl -n 20# 实时滚动显示最新日志
$ sudo journalctl -f# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd# 查看指定进程的日志
$ sudo journalctl _PID=1# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash# 查看指定用户的日志
$ sudo journalctl _UID=33 --since today# 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f# 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today# 查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b# 日志默认分页输出,--no-pager 改为正常的标准输出
$ sudo journalctl --no-pager# 以 JSON 格式(单行)输出
$ sudo journalctl -b -u nginx.service -o json# 以 JSON 格式(多行)输出,可读性更好
$ sudo journalctl -b -u nginx.serviceqq-o json-pretty# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years

7.systemd应用操作实战

若想设置某个服务在开机时启动,可以输入如下命令:

#设置开机启动httpd.service
$ sudo systemctl enable httpd

设置开机启动以后,服务并不会立即启动,必须等下一次开机,如果现在就想运行此服务,可用:

$ sudo systemctl start httpd

执行此命令后,服务也有可能启动失败,可用如下命令查看一下服务的状态:

$ sudo systemctl status httpd

若你想终止正在运行的服务,可以执行如下命令:

$ sudo systemctl stop httpd.service

当然有时可能此命令没有响应,服务也没有停下来,这时候不得不杀进程了,可用如下命令:

$ sudo systemctl kill httpd.service

也可以重启服务:

$sudo systemctl restart httpd.service

本文到此结束!下篇继续!

如果对你有帮助,请随手 点赞赞赏!关注本专栏,更多干货与你分享。

=======================================================

欢迎【关注、私信 @武三郎。我们一起交流一起进步。

linux 修改时区_【003】一文全面掌握Linux初始化进程(超详细)相关推荐

  1. linux 修改时区_如何在 Ubuntu 20.04 上设置或者修改时区

    本文最先发布在: 如何在 Ubuntu 20.04 上设置或者修改时区​www.itcoder.tech 使用正确的时区,对于系统相关的任务和进程来说,是最基本的.例如,cron 守护进程,使用系统时 ...

  2. linux 修改时区_教你在Centos8中更改时区

    对于许多与系统相关的任务和进程,使用正确的时区是必不可少的.例如,cron守护进程使用系统的时区执行cron作业,日志文件中的时间戳基于同一系统的时区. 环  境 CentOS 8 检查现在的时区 t ...

  3. linux java时区_教大家几种在Linux系统中查看时区的方法

    前言 在这篇短文中,我们将向你简单介绍几种 Linux 下查看系统时区的简单方法.在 Linux 机器中,尤其是生产服务器上的时间管理技能,是在系统管理中一个极其重要的方面. 好,我们一起来看几种查看 ...

  4. linux修改时间_技术干货||基于Centos8的Linux简单入门学习笔记

    很基础 以后不想记笔记了 最后分享一次

  5. Linux修改时区和时间

    Linux修改时区和时间 修改时区: 1> 找到相应的时区文件 /usr/share/zoneinfo/Asia/Shanghai  用这个文件替换当前的/etc/localtime文件.  或 ...

  6. debian linux 修改时区

    1. UTC时区切换到CST 时区 # echo "export TZ='Asia/Shanghai'" >> /etc/profile # cat /etc/prof ...

  7. [转帖]Linux修改时区

    公司一台国产服务器的时间总是错的 我用 date -R 出来的结果 是 +7.0 修改办法就是 这个文档来里面的 https://www.cnblogs.com/royfans/p/8056270.h ...

  8. Linux修改时区(tzselect) 【例子:修改时区 为 中国 东8区 的时间】

    文章连接:https://blog.csdn.net/sxzlc/article/details/115792270 ======= 扩展: 使用Linux的tzselect功能,查看各个洲都有哪些国 ...

  9. Linux 修改时区和时间

    时区文件 CentOS 和 Ubuntu 的时区文件是 /etc/localtime , 但是在 CentOS7 以后 localtime 以及变成了一个链接文件 : # ll /etc/localt ...

最新文章

  1. HTTP协议详解(真的很经典)
  2. jmeter mysql plugin_安装一个jmeter的插件--实现监控事务响应时间、tps等功能
  3. halcon 形状匹配
  4. python编程界面怎么打开-为Python程序添加图形化界面的教程
  5. iOS 开发 需要的版本管理工具,UI图,bug管理工具等
  6. jsp中未登录用户也可以浏览页面的功能实现代码
  7. KubeSphere 3.1.0 GA:混合多云走向边缘,让应用无处不在
  8. Swoole 源码分析——Server模块之初始化
  9. 线段树动态开点区间加区间求和
  10. 单元测试原来是这样的呼
  11. python copy
  12. Linux arm 下载程序,arm-linux—gcc如何下载安装
  13. 计算机音乐深海少女,深海少女 MIDI File Download :: MidiShow
  14. 网络电话坐享iOS10红利 iphone7免费通话
  15. java中listview_需要高效的数据映射在Android /Java中进行ListVIEW钻孔的例子
  16. OSPF多区域配置实例
  17. 通信原理中的erf/erfc函数
  18. 使用rimraf一秒删除node_modules文件夹【亲测有用】
  19. 目前最精准的Android开源计步器
  20. 张爱玲经典爱情语录大全

热门文章

  1. MATLAB三维曲面绘图你不得不知道的...
  2. MATLAB 查看程序执行内存最大使用值
  3. 【Python刷题】_1
  4. Adaboost方法分类新闻数据
  5. [WARNING] Using platform encoding (GBK actually) to copy filtered resources, i.e. build is platform
  6. spring Transaction Management --官方
  7. java实现迷宫算法--转
  8. 基于迁移学习的反欺诈方法研究
  9. Spring Boot实战系列《六》:人事管理系统的登录设计
  10. 再理解RankNet算法