服务管理 | Systemd

Systemd

systemd

Systemd由来.

  • 👉 历史上,Linux 的启动一直采用init进程.
/etc/init.d/nginx start
/etc/init.d/nginx restart
/etc/init.d/nginx stop
/etc/init.d/apache2 stop
/etc/init.d/apache2 start
/etc/init.d/apache2 restart
......

init启动缺点.

  • 启动时间长.
  • init进程是串行启动,只有前一个进程启动完,才会启动下一个进程.
  • 启动脚本复杂.
  • init进程只是执行启动脚本,不管其他事情,脚本需要自己处理各种情况,这往往使得脚本变得很长.

Systemd简介.

systemd架构图

systemd is a suite of basic building blocks for a Linux system. It provides a system and service manager that runs as PID 1 and starts the rest of the system. systemd provides aggressive parallelization capabilities, uses socket and D-Bus activation for starting services, offers on-demand starting of daemons, keeps track of processes using Linux control groups, supports snapshotting and restoring of the system state, maintains mount and automount points and implements an elaborate transactional dependency-based service control logic. systemd supports SysV and LSB init scripts and works as a replacement for sysvinit. Other parts include a logging daemon, utilities to control basic system configuration like the hostname, date, locale, maintain a list of logged-in users and running containers and virtual machines, system accounts, runtime directories and settings, and daemons to manage simple network configuration, network time synchronization, log forwarding, and name resolution.

systemd 是 Linux 下的一种 init 软件,由 Lennart Poettering 带头开发,并在 LGPL 2.1 及其后续版本许可证下开源发布.
其开发目标是提供更优秀的框架以表示系统服务间的依赖关系,并依此实现系统初始化时服务的并行启动,
同时达到降低 Shell 的系统开销的效果,最终代替现在常用的 System V 与 BSD 风格 init 程序.

与多数发行版使用的 System V 风格 init 相比,systemd 采用了以下新技术:
采用 Socket 激活式与总线激活式服务,以提高相互依赖的各服务的并行运行性能,
cgroups 代替 PID 来追踪进程,因此即使是两次 fork 之后生成的守护进程也不会脱离 systemd 的控制.
从设计构思上说,由于 systemd 使用了 cgroupsfanotify 等组件以实现其特性,所以只适用于 Linux.

SystemD 被设计用来改进 SysVinit 的缺点,与 Ubuntu 的 upstart 形成技术竞争.
SystemD 的很多概念来源于苹果的 launchd.
目标是尽可能启动更少进程,尽可能将更多进程并行启动(这是性能优于 SysV init 的理念基础).
SystemD 尽可能减少对 Shell 脚本的依赖.
传统 SysV init 使用 inittab 来决定运行哪些 Shell 脚本,大量使用 Shell 脚本被认为是效率低下无法并行的原因.
SystemD 使用了 Linux 专属技术,不再顾及 POSIX 兼容.
只要能满足社会变革的需要,突破一些可能过时的技术约束,这也是当今创信理念的需要,相信市场会给出评判.

上图为Systemd 作者 Lennart Poettering

系统管理.

  • systemd并不是一个命令,而是一组命令,它涉及到系统管理的方方面面.

用户空间的启动顺序.

用户的空间的大致启动顺序如下:

  • 🛼init

  • 🛼基础底层服务,如udevd(设备管理器),syslogd(日志管理)

  • 🛼网络配置

  • 🛼中高层服务,如cron(定时器)

  • 🛼登录提示符(getty),GUI,MySQL(如果设置开机启动的话)

  • init是内核启动的第一个用户空间进程,主要负责启动,终止系统中的基础服务进程.

Linux下,init主要有三个实现版本:

  • System V,传统的init
  • Upstart,Ubuntu后期针对sys-v的一个改进实现版本
  • systemd,是一套中央化系统及设置管理程序(init),包括有守护进程,程序库以及应用软件,兼容sys-v.现代大部分桌面版都使用此实现.也是本文主要介绍的一个…emmmm…框架.是的,systemd更像一个服务管理框架.

运行级别.

简单地说,运行级别定义了系统的特定状态,这种状态可以看成一系列服务状态的集合.
不同的发行版有不同的运行级别,但比较公认的如下:

sysvinit运行级别systemd目标备注
0runlevel0.target
poweroff.target
关闭系统
1,s,singlerunlevel1.target
rescue.target
单用户模式
2,4runlevel2.target
runlevel4.target
multi-user.target
用户定义/域特定运行级别,默认等同于3
3runlevel3.target
multi-user.target
多用户,非图形化,用户可以通过多个控制台或网络登录
5runlevel5.target
graphical.target
多用户,图形化,通常为所有运行级别为3的服务外加图形化登录
6runlevel6.target
reboot.target
重启系统
emergencyemergency.target急救模式 (Emergency shell)

systemd启动步骤.

  • systemd的特性复杂,下面给出大致的启动步骤,使我们有个总体观:

  • 0,systemd加载配置信息.

  • 1,判定启动目标,一般是default.target

  • 2,判定启动目标的依赖关系.

  • 3,激活依赖服务,启动目标.

  • 4,响应系统消息,激活其他组件.

单元和单元类型.

  • 比较常用的几种:
  • 服务单元,传统的守护进程(XXX.service文件表示)
  • 挂载单元,控制文件系统挂载(XXX.mount文件表示)
  • 目标单元,将服务单元,挂载单元等单元组织在一起的单元,一般对应Sys-V的运行等级(XXX.target文件表示)
  • Sockets单元,(XXX.sockets文件表示)
  • 系统设备单元,(XXX.device)
  • 交换分区单元,(XXX.swap)
  • 文件路径单元,(XXX.path)
  • 定时器单元,(XXX.timer)

systemd不光负责处理进程和服务,同时还能挂载文件系统,监控网络套接字等等.在systemd中
所有服务和功能都被抽象成一个个单元(Unit),根据功能不同,单元类型也不同.systemd正是通过配置这些单元
来开关,管理服务的.

systemd相关命令.

(Unit)单元管理.
  • 使用systemd操作单元的激活与关闭
systemctl start <unit>      #立即激活单元.
systemctl stop <unit>       #立即关闭单元.
sudo systemctl kill <unit>  #前面的stop不好使了,就强行杀死这个单元.
systemctl restart <unit>    #重启单元.
systemctl status <unit>     #单元状态,(能够看到服务单元的几乎所有信息).

systemctl is-enabled <unit> #单元是否配置自动启动.
systemctl enable <unit>     #配置自动启动单元.
systemctl disable <unit>    #关闭单元自动启动.

systemctl help <unit>       #单元帮助手册,一般是服务单元.

systemctl daemon-reload <unit>#扫描单元配置文件变动,重新载入.

systemctl mask <unit>       #禁用单元.
systemctl unmask <unit>     #取消禁用.
systemctl list-dependencies <unit>          #显示服务的相互依赖情况.
systemctl reset-failed  <unit>              #复位某个failed的服务.
电源管理.
systemctl reboot        #重启.
systemctl poweroff      #关机.
systemctl suspend       #待机.
systemctl hibernate     #休眠.
systemctl rescue        #进入单用户模式.
分析系统状态.
systemd-cgtop               #检查资源使用情况,包括CPU,RAM,I/O.
systemd-cgls                #以树形递归形式显示Linux控制组群结构层次.
systemd-analyze blame       #显示每个服务启动花费的时间方面详细信息.
systemd-analyze         #显示内核和用户空间上一次引导话费的时间.
systemd-analyze  plot >plot.svg       #显示详细的启动过程信息,并创建一张svg位图;
systemctl list          #列出所有单元.
systemctl status        #系统状态.
systemctl list-units    #所有激活单元列表.
systemctl --failed      #运行失败单元列表.
systemctl list-unit-files  #列出已安装的单元文件及其状态.
systemctl list-unit-files --type=service   #列出指定类型的配置文件.
systemctl --type=mount      #类型过滤器,(类型可以是服务,挂载点,设备,套接字和启动目标)
systemctl --enable debug-shell.service    #启动TTY9上的Shell,用于调试.
systemctl isolate multi-user.target         #切换到运行级别3和TTY,不带X图形界面.
systemctl isolate graphical.target          #切换到运行级别5,X服务器在运行级别5运行.
localectl                   #本地化信息
timedatectl                 #时区信息
loginctl list-user          #列出当前登录用户
定时器.
  • 配置一个systemd定时器,系统启动后5分钟后触发指定服务运行.
  • 服务在激活之后的24小时执行,也就是每天都会执行一次(但是执行的具体时间取决于开机时间).
cat < "EOF" >/etc/systemd/system/foo.service
[Unit]
Description="Foo shell script"

[Service]
ExecStart=/usr/local/bin/foo.sh
EOF
cat < "EOF" >/etc/systemd/system/foo.timer
[Unit]
Description="Run foo shell script"

[Timer]
OnBootSec=5min
OnUnitActiveSec=24h
Unit=foo.service

[Install]
WantedBy=multi-user.target
EOF
  • OnCalendar=daily,意思是每天触发..
  • AccuracySec=12h,意思是由于某些原因需要推测执行的时间.
  • Unit=mlocate.service,这里就是指定了需要执行的任务服务.
  • Persistent=true,指定如果由于关机等原因到时了为能执行任务的情况下,启动会立即触发该任务.
  • OnBootSec=5min,指定了在系统启动5分钟后触发指定服务的执行.
  • OnUnitActiveSec=24h,指定了在服务在激活之后的24小时执行,也就是每天都会执行一次(但是执行的具体时间取决于开机时间)
  • Unit=foo.service,指定了触发的任务是我们上面定义的foo服务,也就是执行 foo.sh 脚本.

OnCalendar ,其值支持的格式为 DayOfWeek Year-Month-Day Hour:Minute:Second,例如

  • OnCalendar=–* 5:00:00,指定在每天早上的5点执行.

  • OnCalendar=Fri 18:00:00,指定在每个月的周五下午6点执行.

  • 在一个配置文件中,还可以指定多个OnCalendar,例如.

OnCalendar=Mon..Fri 10:00
OnCalendar=Sat,Sun 22:00
  • 上面的配置就指定了在周一到周五的每天上午10点,以及在周末两天的晚上10点执行.
配置IP地址.
  • 打开systemd的网络管理功能.
systemctl enable systemd-networkd.service
  • 配置静态IP.
cat << "EOF" >/etc/systemd/network/10-static-eth0.network
[Match]
Name=eth0

[Network]
Address=192.168.1.202/24
Gateway=192.168.1.1
DNS=8.8.8.8
EOF
  • 配置DHCP.
cat << "EOF" >/etc/systemd/network/20-dhcp-eth0.network
[Match]
Name=eth0

[Network]
DHCP=yes
EOF
挂载磁盘.
  • 挂载本地物理磁盘.
cat << "EOF" >/etc/systemd/system/sdb-4.mount
[Unit]
Description=mount disk sdb4

[Mount]
What=/dev/sdb4
Where=/mnt/data
Type=ext4
Options=defaults

[Install]
WanteBy=local-fs.target
EOF
  • 挂载网络文件系统(NFS).
cat << "EOF" >/etc/systemd/system/nfs-0.mount
[Unit]
Description=mount nfs disk

[Mount]
What=172.16.0.8:/export/scratch
Where=/mnt/data/nfs
Type=nfs
Options=defaults

[Install]
WanteBy=multi-user.target
EOF

为什么会使用systemd?

Well, to be overly simplistic, it was time. Now that our servers have graduated into the modern age where they are asked to do everything including make us dinner (well, maybe not that far yet), there were a whole lot of things that the older ‘init’ based systems (to be complete, the ‘init’ systems are technically grouped into the 'sysvinit' category to mark their compatibility with Unix System V from quite some time ago) are not very good at or require a lot of extra hacking around.

时过境迁,传统的 SysV init 已经不能满足现代服务器的需求了.


   转载规则


《服务管理 | Systemd》Bad-BoY 采用 知识共享署名 4.0 国际许可协议 进行许可。
 上一篇
高级网络管理 | NetworkManager 高级网络管理 | NetworkManager
NetworkManager高级网络管理.网络管理器(NetworManager)是检测网络,自动连接网络的程序.无论是无线还是有线连接,它都可以令您轻松管理.对于无线网络,网络管理器优先连接已知的网络并可以自动切换到最可靠的无线网络.利用
2022-03-29
下一篇 
暴力破解防御 之 | fail2ban 暴力破解防御 之 | fail2ban
Fail2ban 暴力破解防御.Fail2ban简介.fail2Ban是一款入侵防御软件,可以保护服务器免受暴力攻击.它是用Python编程语言编写的.fail2Ban基于auth 日志文件工作,默认情况下它会扫描所有 auth 日志文件,
2022-03-12
  目录