Linux引导过程与故障排除|第4章:systemd管理系统启动过程和服务
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
向后兼容 SysV
和 LSB
风格的初始脚本,可以替代 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
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. 设置时区 [
0 条评论
评论者的用户名
评论时间暂时还没有评论.