一、systemd引入
1.1 sysv引导启动
Linux的启动之前采用init进程。启动服务: service httpd start 或 /etc/init.d/httpd start
init 这种方法有两个缺点。
一是启动时间长。init进程是串行启动,只有前一个进程启动完,才会启动下一个进程。
二是启动脚本复杂。init进程只是执行启动脚本, 不管其他事情。脚本需要自己处理各种情况, 这往往使得脚本变得很长。
Ubuntu 的 Upstart 解决了没有直接依赖的程序之间的并行启动。
1.2 Systemd 取代 SysV
Systemd 是 Linux系统新一代的初始化系统(init), 主要的设计目标是克服 sysv init 固有的缺点, 提高系统的启动速度。
CentOS 7 使用 Systemd 替换了SysV, Ubuntu 从 15.04 开始使用 Systemd, 已成为大多数发行版的标准配置。
Systemd 取代了initd,成为系统的第一个进程(PID 等于 1), 作为初始守护进程。其他进程都是它的子进程。
1.3 Systemd 介绍
systemd 提供了并行化功能, 使用套接字和 D-Bus 激活来启动服务, 按需启动守护程序,
使用Linux控制组跟踪进程, 维护安装和自动挂载点, 并实现了详细的基于事务依赖关系的服务控制逻辑。
systemd支持SysV和LSB初始化脚本。
Systemd 是一系列工具的集合, 其作用也远远不仅是启动操作系统。
它还接管了后台服务、结束、状态查询, 以及日志归档、设备管理、电源管理、定时任务等许多职责,
并支持通过特定事件(如插入特定 USB 设备)和特定端口数据触发的 On-demand (按需)任务。
1.4 Systemd 特点
它的设计目标是 为系统的启动和管理提供一套完整的解决方案。
- 按需启动进程,减少系统资源消耗
- 并行启动进程,提高系统启动速度
- Systemd 通过 Socket 缓存、DBus 缓存和建立临时挂载点等方法解决了启动进程之间的依赖, 做到了所有系统服务并发启动。
- 对于用户自定义的服务,Systemd 允许配置其启动依赖项目,从而确保服务按必要的顺序运行。
- 使用 CGroup 监视和管理进程的生命周期
- CGroup 提供了类似文件系统的接口。 当进程创建子进程时,子进程会继承父进程的CGroup。因此无论服务如何启动新的子进程,所有的这些相关进程都会属于同一个CGroup。
- 在Systemd之前的主流应用管理服务都是使用 进程树 来跟踪应用的继承关系的, 而进程的父子关系很容易通过 两次 fork 的方法脱离。
- 而Systemd则提供通过 CGroup 跟踪进程关系,引补了这个缺漏。
- 通过CGroup不仅能够实现服务之间访问隔离,限制特定应用程序对系统资源的访问配额,还能更精确地管理服务的生命周期。
- 统一管理服务日志
- 支持快照和系统恢复
1.5 优缺点
Systemd的优点是功能强大, 使用方便, 缺点是体系庞大, 非常复杂。
现在还有很多人反对使用Systemd,理由就是它过于复杂,与操作系统的其他部分强耦合,违反"keep simple, keep stupid"的 Unix 哲学。
1.6 版本
[root@cl-server ~]# systemctl --version systemd 219 +PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN
二、systemd框架图
三、系统管理
[root@cl-server ~]# systemd- systemd-analyze systemd-escape systemd-path systemd-ask-password systemd-firstboot systemd-run systemd-cat systemd-hwdb systemd-stdio-bridge systemd-cgls systemd-inhibit systemd-sysv-convert systemd-cgtop systemd-loginctl systemd-tmpfiles systemd-coredumpctl systemd-machine-id-setup systemd-tty-ask-password-agent systemd-delta systemd-notify systemd-detect-virt systemd-nspawn
systemd-analyze: 显示此次系统启动时运行每个服务所消耗的时间,可以用于分析系统启动过程中的性能瓶颈 systemd-ask-password: 辅助性工具,用星号屏蔽用户的任意输入,然后返回实际输入的内容 systemd-cat: 用于将其他命令的输出重定向到系统日志 systemd-cgls: 递归地显示指定 CGroup 的继承链 systemd-cgtop: 显示系统当前最耗资源的 CGroup 单元 systemd-escape: 辅助性工具,用于去除指定字符串中不能作为 Unit 文件名的字符 systemd-hwdb: Systemd 的内部工具,用于更新硬件数据库 systemd-delta: 对比当前系统配置与默认系统配置的差异 systemd-detect-virt: 显示主机的虚拟化类型 systemd-inhibit: 用于强制延迟或禁止系统的关闭、睡眠和待机事件 systemd-machine-id-setup: Systemd 的内部工具,用于给 Systemd 容器生成 ID systemd-notify: Systemd 的内部工具,用于通知服务的状态变化 systemd-nspawn: 用于创建 Systemd 容器 systemd-path: Systemd 的内部工具,用于显示系统上下文中的各种路径配置 systemd-run: 用于将任意指定的命令包装成一个临时的后台服务运行 systemd-stdio- bridge: Systemd 的内部 工具,用于将程序的标准输入输出重定向到系统总线 systemd-tmpfiles: Systemd 的内部工具,用于创建和管理临时文件目录 systemd-tty-ask-password-agent: 用于响应后台服务进程发出的输入密码请求
systemctl: 用于检查和控制各种系统服务和资源的状态 bootctl: 用于查看和管理系统启动分区 hostnamectl: 用于查看和修改系统的主机名和主机信息 journalctl: 用于查看系统日志和各类应用服务日志 localectl: 用于查看和管理系统的地区信息 loginctl: 用于管理系统已登录用户和 Session 的信息 machinectl: 用于操作 Systemd 容器 timedatectl: 用于查看和管理系统的时间和时区信息
3.1 systemd-analyze
### 查看启动耗时 [root@cl-server ~]# systemd-analyze Startup finished in 867ms (kernel) + 1.484s (initrd) + 28.384s (userspace) = 30.735s
### 查看每个服务的启动耗时 [root@cl-server ~]# systemd-analyze blame 25.326s emqx.service 7.215s kdump.service 6.340s docker.service 4.356s tuned.service 1.793s lvm2-pvscan@8:2.service 1.736s containerd.service 1.530s lvm2-monitor.service 1.422s dev-mapper-centos\x2droot.device 1.062s salt-master.service ...... ### 显示瀑布状的启动过程流 [root@cl-server ~]# systemd-analyze critical-chain The time after the unit is active or started is printed after the "@" character. The time the unit takes to start is printed after the "+" character. multi-user.target @28.356s └─emqx.service @3.029s +25.326s └─network.target @3.014s └─network.service @2.621s +392ms └─NetworkManager-wait-online.service @2.419s +198ms └─NetworkManager.service @2.269s +143ms └─dbus.service @2.167s └─basic.target @2.105s └─sockets.target @2.105s └─docker.socket @2.103s +1ms └─sysinit.target @2.103s └─systemd-update-utmp.service @2.091s +10ms └─auditd.service @1.930s +156ms └─systemd-tmpfiles-setup.service @1.906s +19ms └─rhel-import-state.service @1.861s +37ms └─local-fs.target @1.851s └─run-docker-netns-5a2d9138ba8b.mount @10.330s └─local-fs-pre.target @1.782s └─lvm2-monitor.service @251ms +1.530s └─lvm2-lvmetad.service @346ms └─lvm2-lvmetad.socket @244ms └─-.slice ### 显示指定服务的启动流 [root@cl-server ~]# systemd-analyze critical-chain emqx.service
3.2 loginctl
### 列出当前session [root@cl-server ~]# loginctl list-sessions SESSION UID USER SEAT 199 0 root 200 0 root 2 sessions listed. ### 列出当前登录的用户 [root@cl-server ~]# loginctl list-users UID USER 0 root 1 users listed. ### 列出指定用户的登录信息 [root@cl-server ~]# loginctl show-user root UID=0 GID=0 Name=root Timestamp=二 2021-12-14 11:19:18 CST TimestampMonotonic=359301590 RuntimePath=/run/user/0 Slice=user-0.slice Display=199 State=active Sessions=200 199 IdleHint=no IdleSinceHint=0 IdleSinceHintMonotonic=0 Linger=no [root@cl-server ~]# loginctl show-user adminx Failed to get user: No user 1002 known or logged in
3.3 localectl 命令 用于查看本地化设置
[root@cl-server ~]# localectl System Locale: LANG=zh_CN.UTF-8 VC Keymap: cn X11 Layout: cn
3.4 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
[root@cl-server ~]# timedatectl Local time: 四 2021-12-16 11:15:12 CST Universal time: 四 2021-12-16 03:15:12 UTC RTC time: 四 2021-12-16 03:15:12 Time zone: Asia/Shanghai (CST, +0800) NTP enabled: yes NTP synchronized: yes RTC in local TZ: no DST active: n/a
3.5 journalctl 日志管理
Systemd 统一管理所有 Unit 的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。
日志的配置文件是 /etc/systemd/journald.conf。
### 查看所有日志(默认情况下 ,只保存自本次启动以后的日志) [root@cl-server ~]# journalctl ### 查看内核日志(不显示应用日志) [root@cl-server ~]# journalctl -k ### 查看系统本次启动的日志 [root@cl-server ~]# journalctl -b [root@cl-server ~]# journalctl -b -0 ### 查看上一次启动的日志(需更改设置) [root@cl-server ~]# journalctl -b -1 Specifying boot ID has no effect, no persistent journal was found ### 查看指定时间的日志 [root@cl-server ~]# journalctl --since="2021-12-14 10:00:00" [root@cl-server ~]# journalctl --since="20 min ago" [root@cl-server ~]# journalctl --since="yesterday" [root@cl-server ~]# journalctl --since="2021-12-16 10:20:00" --until "2021-12-16 10:30:00" [root@cl-server ~]# journalctl --since="2021-12-16 10:20:00" --until "5 min ago" ### 显示尾部的最新日志,默认为10行 [root@cl-server ~]# journalctl -n -- Logs begin at 三 2021-12-15 12:22:51 CST, end at 四 2021-12-16 10:35:01 CST. -- 12月 16 10:33:01 cl-server run-parts(/etc/cron.daily)[7179]: finished logrotate [root@cl-server ~]# journalctl -n 13 -- Logs begin at 三 2021-12-15 12:22:51 CST, end at 四 2021-12-16 10:35:01 CST. -- 12月 16 10:33:01 cl-server CROND[7163]: (root) CMD (cd /application/open-falcon/mymon && ./mymon -c myMon.cfg) 12月 16 10:33:01 cl-server anacron[4965]: Job `cron.daily' started ### 实时滚动显示最新日志 [root@cl-server ~]# journalctl -f ### 查看指定服务的日志 [root@cl-server ~]# journalctl /usr/lib/systemd/systemd-logind -- Logs begin at 三 2021-12-15 12:22:51 CST, end at 四 2021-12-16 10:37:01 CST. -- 12月 15 12:22:58 cl-server systemd-logind[675]: New seat seat0. 12月 15 12:22:58 cl-server systemd-logind[675]: Watching system buttons on /dev/input/event0 (Power Button) 12月 16 10:02:40 cl-server systemd-logind[675]: New session 26 of user root. 12月 16 10:36:25 cl-server systemd-logind[675]: New session 64 of user root. ### 查看指定进程的日志 [root@cl-server ~]# journalctl _PID=5052 -- Logs begin at 三 2021-12-15 12:22:51 CST, end at 四 2021-12-16 10:38:01 CST. -- 12月 16 10:02:40 cl-server sshd[5052]: pam_tally2(sshd:account): option deny=3 allowed in auth phase only 12月 16 10:02:40 cl-server sshd[5052]: Accepted password for root from 192.168.234.1 port 8412 ssh2 12月 16 10:02:40 cl-server sshd[5052]: pam_unix(sshd:session): session opened for user root by (uid=0) ### 查看某个路径的脚本的日志 [root@cl-server ~]# journalctl /usr/bin/bash ### 查看指定用户的日志 [root@cl-server ~]# journalctl _UID=993 -- Logs begin at 三 2021-12-15 12:22:51 CST, end at 四 2021-12-16 10:40:01 CST. -- 12月 16 09:42:43 cl-server emqx[2368]: /usr/lib/emqx/erts-11.1.8/bin/erlexec -boot /usr/lib/emqx/releases/4.3.10/st 12月 16 09:42:48 cl-server sh[964]: EMQ X Broker 4.3.10 is started successfully! ### 查看某个 Unit 的日志 [root@cl-server ~]# journalctl -u mysqld.service [root@cl-server ~]# journalctl -u mysqld.service --since="today" [root@cl-server ~]# journalctl -u mysqld.service -f [root@cl-server ~]# journalctl -u mysqld.service -u nginx.service # 查看指定优先级(及其以上级别)的日志,共有8级 # 0: emerg # 1: alert # 2: crit # 3: err # 4: warning # 5: notice # 6: info # 7: debug [root@cl-server ~]# journalctl -p err -b ### 日志默认为分页输出,--no-pager 改为正常的标准输出,一次性输出 [root@cl-server ~]# journalctl --no-pager ### 以 JSON 格式(单行)输出 [root@cl-server ~]# journalctl -b -u mysqld.service -o json ### 以 JSON 格式(多行)输出,可读性更好 [root@cl-server ~]# journalctl -b -u mysqld.service -o json-pretty ### 显示日志占据的硬盘空间 root@cl-server ~]# journalctl --disk-usage Archived and active journals take up 8.0M on disk. ### 指定日志文件占据的最大空间 [root@cl-server ~]# journalctl --vacuum-size=1G Vacuuming done, freed 0B of archived journals on disk. ### 指定日志文件保存多久 [root@cl-server ~]# journalctl --vacuum-time=30days Vacuuming done, freed 0B of archived journals on disk.
标签:systemd,12,服务,cl,journalctl,server,Linux,root From: https://www.cnblogs.com/kingdomer/p/15544756.html