Linux引导过程与故障排除|第4章:systemd管理系统启动过程和服务

  • 原创
  • Madman
  • /
  • /
  • 0
  • 2211 次阅读

systemd-min.jpg

Synopsis: systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器,运行为 PID 1 并负责启动其它程序。功能包括:支持并行化任务;同时采用 socket 式与 D-Bus 总线式激活服务;按需启动守护进程(daemon);利用 Linux 的 cgroups 监视进程;支持快照和系统恢复;维护挂载点和自动挂载点;各服务间基于依赖关系进行精密控制。systemd 支持 SysV 和 LSB 初始脚本,可以替代 SysVinit。除此之外,功能还包括日志进程、控制基础系统配置,维护登陆用户列表以及系统账户、运行时目录和设置,可以运行容器和虚拟机,可以简单的管理网络配置、网络时间同步、日志转发和名称解析等

1. systemd 简介

一个有效的、快速的 init 系统标准:

  • 尽可能少地启动进程(To start less
  • 尽可能多地并行启动进程(And to start more in parallel)

较少的启动意味着启动较少的服务或推迟启动服务,直到实际需要它们为止。传统的 SysVinit 程序不符合这些标准,应该在打印机连接或需要打印服务时才启动 cups 服务,在蓝牙适配器接入时才启动蓝牙服务,甚至 sshd 服务也不是必需的,因为管理员常常几个月才使用一次 SSH 去连接服务器

并行启动意味着我们不应该 串行 启动那些没有依赖关系的服务,而是同时运行它们,以便最大化 CPU 和磁盘 IO 带宽,因此缩短整体启动时间

systemd 是目前 Linux 系统中最新最先进的初始化系统,CentOS 7、Ubuntu 等发行版都使用了 systemd。它借鉴了 Apple 公司的 launchd 初始化系统的优秀思想,完全符合一个有效的、快速的 init 系统标准,启动速度比 Upstart 更快:

  • 支持并行化任务
  • 同时采用 socket 式与 D-Bus 总线式激活服务
  • 按需启动守护进程(daemon)
  • 利用 Linux 的 cgroups 监视进程
  • 支持快照和系统恢复
  • 维护挂载点和自动挂载点
  • 各服务间基于依赖关系进行精密控制

除此之外,它的功能还包括日志进程、控制基础系统配置,维护登陆用户列表以及系统账户、运行时目录和设置,可以运行容器和虚拟机,可以简单的管理网络配置、网络时间同步、日志转发和名称解析等

systemd 向后兼容 SysVLSB 风格的初始脚本,可以替代 SysVinit,更详细的说明请参考帮助文档 man 1 systemd

2. 系统和服务管理命令

systemd 是一个 Linux 系统基础组件的集合,提供了一个系统和服务管理器(system and service manager),它由内核启动(PID 1)并负责启动其它程序:

[root@CentOS ~]# pstree -Ap
systemd(1)-+-NetworkManager(715)-+-{NetworkManager}(757)
           |                     `-{NetworkManager}(759)
           |-abrt-dbus(25345)-+-{abrt-dbus}(25346)
           |                  |-{abrt-dbus}(25347)
           |                  `-{abrt-dbus}(25348)
           |-abrt-watch-log(717)
           |-abrtd(716)
           |-agetty(738)
           |-atd(732)
           |-auditd(662)---{auditd}(663)
           |-chronyd(699)
           |-crond(735)
           |-dbus-daemon(695)
            ...

查看系统中安装的 systemd 软件包版本:

[root@CentOS ~]# rpm -qa | grep 'systemd'
systemd-libs-219-30.el7.x86_64
systemd-219-30.el7.x86_64
systemd-sysv-219-30.el7.x86_64

查看 systemd 软件包所提供的命令:

[root@CentOS ~]# rpm -ql systemd-219-30.el7.x86_64 | grep '/usr/bin'
/usr/bin/bootctl
/usr/bin/busctl
/usr/bin/coredumpctl
/usr/bin/hostnamectl
/usr/bin/journalctl
/usr/bin/kernel-install
/usr/bin/localectl
/usr/bin/loginctl
/usr/bin/machinectl
/usr/bin/systemctl
/usr/bin/systemd-analyze
/usr/bin/systemd-ask-password
/usr/bin/systemd-cat
/usr/bin/systemd-cgls
/usr/bin/systemd-cgtop
/usr/bin/systemd-coredumpctl
/usr/bin/systemd-delta
/usr/bin/systemd-detect-virt
/usr/bin/systemd-escape
/usr/bin/systemd-firstboot
/usr/bin/systemd-hwdb
/usr/bin/systemd-inhibit
/usr/bin/systemd-loginctl
/usr/bin/systemd-machine-id-setup
/usr/bin/systemd-notify
/usr/bin/systemd-nspawn
/usr/bin/systemd-path
/usr/bin/systemd-run
/usr/bin/systemd-stdio-bridge
/usr/bin/systemd-tmpfiles
/usr/bin/systemd-tty-ask-password-agent
/usr/bin/timedatectl
/usr/bin/udevadm

2.1 hostnamectl

设置系统主机名,更多详情请参考 man hostnamectl

[root@CentOS ~]# hostnamectl set-hostname CentOS

2.2 journalctl

systemd 有自己的日志记录系统,名为 journald,它取代了 SysVinit 中的 syslog 守护进程,而命令 journalctl 就是用来读取日志的,更多详情请参考 man journalctl

# 1. 查看所有日志
[root@CentOS ~]# journalctl

# 2. 只查看内核日志
[root@CentOS ~]# journalctl -k

# 3. 实时监控日志
[root@CentOS ~]# journalctl -f

2.3 localectl

控制系统区域设置和键盘布局设置,更多详情请参考 man localectl

# 1. 查看
[root@CentOS ~]# localectl 
   System Locale: LANG=en_US.UTF-8
       VC Keymap: us
      X11 Layout: us
[root@CentOS ~]# cat /etc/locale.conf
LANG="en_US.UTF-8"
[root@CentOS ~]# localectl list-locales | grep 'zh_'
zh_CN
zh_CN.gb18030
zh_CN.gb2312
zh_CN.gbk
zh_CN.utf8
zh_HK
zh_HK.big5hkscs
zh_HK.utf8
zh_SG
zh_SG.gb2312
zh_SG.gbk
zh_SG.utf8
zh_TW
zh_TW.big5
zh_TW.euctw
zh_TW.utf8

# 2. 修改
[root@CentOS ~]# localectl set-locale LANG=zh_CN.utf8

2.4 systemctl

该命令是 systemd 的核心命令,本文后续将详细介绍它的使用方式,更多详情请参考 man systemctl

2.5 systemd-analyze

该命令用于查看系统启动所用的时间,更多详情请参考 man systemd-analyze

# 1. CentOS 7.3 Minimal 未启用 Kdump 时的系统启动用时
[root@CentOS ~]# systemd-analyze
Startup finished in 494ms (kernel) + 927ms (initrd) + 9.614s (userspace) = 11.037s
[root@CentOS ~]# systemd-analyze time
Startup finished in 494ms (kernel) + 927ms (initrd) + 9.614s (userspace) = 11.037s

# 2. 使用 systemd-analyze blame 命令可以显示各进程在启动时所占用的时间
[root@CentOS ~]# systemd-analyze blame
          5.000s NetworkManager-wait-online.service
          2.504s tuned.service
          1.397s lvm2-pvscan@8:5.service
          1.309s postfix.service
           812ms lvm2-monitor.service
           690ms dev-mapper-centos\x2droot.device
           478ms network.service
           271ms polkit.service
           209ms sshd.service
           ...

# 3. 以树型结构(自底向上依次启动)显示系统启动时的关键 units 所用的时间
[root@CentOS ~]# systemd-analyze critical-chain

2.6 timedatectl

设置系统日期和时间,更多详情参考 man timedatectl

# 1. 查看当前时区、日期时间、是否启用 NTP 等
[root@CentOS ~]# timedatectl

# 2. 显示所有可用的时区
[root@CentOS ~]# timedatectl list-timezones

# 3. 设置时区
[root@CentOS ~]# timedatectl set-timezone Asia/Shanghai

# 4. 设置时间
[root@CentOS ~]# timedatectl set-time 2016-01-01 12:00:00

# 5. Enable an NTP daemon (chronyd)
[
                                
                            
未经允许不得转载: LIFE & SHARE - 王颜公子 » Linux引导过程与故障排除|第4章:systemd管理系统启动过程和服务

分享

作者

作者头像

Madman

如需 Linux / Python 相关问题付费解答,请按如下方式联系我

0 条评论

暂时还没有评论.

专题系列

热门文章