从0开始学习Linux——系统服务管理
往期目录:
从0开始学习Linux——简介&安装
从0开始学习Linux——搭建属于自己的Linux虚拟机
从0开始学习Linux——文本编辑器
从0开始学习Linux——Yum工具
从0开始学习Linux——远程连接工具
从0开始学习Linux——文件目录
从0开始学习Linux——网络配置
从0开始学习Linux——防火墙配置
上一期教程中我们学习了防火墙的配置,这一期教程我们将来学习如何实现Linux的系统服务管理。
在 CentOS 7 中,系统服务的管理是通过 Systemd 来实现的。Systemd 是一种系统和服务管理器,取代了 CentOS 7 之前的 SysVinit 和 Upstart 系统。Systemd 提供了更为高效和灵活的方式来管理系统服务、进程、日志等。
一、Systemd简介
Systemd 是 Linux 系统上的一种初始化系统和服务管理器,它负责启动和管理系统服务、进程、日志、定时任务等。它的主要功能包括:
- 启动和管理服务(守护进程)
- 日志管理(通过 journald)
- 进程监控和控制
- 启动顺序管理
- 并行启动服务
二、Systemd结构
2.1 单元
Systemd 中的每个服务或资源都被称为一个“单元(Unit)”。单元有不同的类型,常见的单元类型如下所示:
- Service 单元(.service):用于管理服务程序(如 Apache、MySQL 等)。
- Target 单元(.target):用于定义系统的运行级别,类似于 SysVinit 中的 runlevel。例如,multi-user.target和graphical.target。
- Mount 单元(.mount):用于挂载文件系统。
- Socket 单元(.socket):用于管理 socket 服务。
- Device 单元(.device):用于管理设备节点。
- Timer 单元(.timer):类似于 cron,用于定时任务。
2.2 单元文件
单元文件是 Systemd 配置文件,通常位于和/etc/systemd/system/和/lib/systemd/system/目录中。单元文件的扩展名通常是.service(服务),.target(目标)等。
2.3 服务
服务是执行某个任务的后台进程,它通常会以守护进程的形式运行。Systemd 使用.service文件来定义如何启动、停止和管理服务。
三、Systemd常见命令
1、启动服务
systemctl start 服务名称
上节教程我们讲解Linux系统中的防火墙,假设我们想要去开启防火墙服务就可以执行systeemctl start firewalld命令即可。
2、停止服务
systemctl stop 服务名称
3、重启服务
systemctl restart 服务名称
4、查看服务状态
systemctl status 服务名称
5、设置服务为开机自启动
systemctl enable 服务名称
6、禁用服务开机自启动
systemctl disable 服务名称
7、查看所有服务状态
systemctl list-units --type=service
8、重新加载systemd配置
当修改了服务单元文件(如 .service文件)后,需要重新加载 Systemd 配置。
systemctl daemon-reload
9、查看日志
Systemd 提供了强大的日志管理工具journalctl,可以用来查看服务的日志。
journalctl -u 服务名称
当然我们还可以使用-f选项来实时查看日志输出。
journalctl -f
四、Systemd服务的配置文件解析
Systemd 的配置文件通常以[Unit]、[Service]、[Install]等部分组成。
上一节教程我们学习了Linux防火墙配置,我们这里打开防火墙firewalld服务的一个配置文件进行深入研究。
cat /usr/lib/systemd/system/firewalld.service
[Unit]
Description=firewalld - dynamic firewall daemon
Before=network-pre.target
Wants=network-pre.target
After=dbus.service
After=polkit.service
Conflicts=iptables.service ip6tables.service ebtables.service ipset.service
Documentation=man:firewalld(1)
[Service]
EnvironmentFile=-/etc/sysconfig/firewalld
ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS
ExecReload=/bin/kill -HUP $MAINPID
# supress to log debug and error output also to /var/log/messages
StandardOutput=null
StandardError=null
Type=dbus
BusName=org.fedoraproject.FirewallD1
KillMode=mixed
[Install]
WantedBy=multi-user.target
Alias=dbus-org.fedoraproject.FirewallD1.service
在firewalld.service文件中,各个选项的含义如下所示:
1、 [Unit]选项:
这一部分描述了服务的元数据和依赖关系。
-
Description=firewalld - dynamic firewall daemon:描述服务的简短说明。在此,firewalld是一个动态防火墙守护进程。
-
Before=network-pre.target:这表示firewalld服务应该在network-pe.target之前启动,确保在网络服务启动前,防火墙已准备好进行处理。这是确保防火墙服务能早于网络相关服务启动的依赖关系。
-
Wants=network-pre.target:这意味着firewalld依赖于network-pe.target,即系统在启动时会尝试启动network-pe.target,这通常与网络配置相关。
-
After=dbus.service:这表示firewalld服务在dbus.service(D-Bus系统总线服务)之后启动,因为firewalld依赖于D-Bus用于与其他系统组件进行通信。
-
After=polkit.service:firewalld服务需要在polkit.service之后启动,polkit是一个用于管理系统权限的服务,firewalld可能需要它来处理访问控制。
-
Conflicts=iptables.service ip6tables.service ebtables.service ipset.service:这一行表示firewalld与传统的iptables、ip6tables、etables和ipset服务是互相冲突的,意味着如果系统中启用了这些服务,firewalld服务将无法启动或运行。这是因为它们都是用于网络过滤的工具,但firewalld是基于更高级的抽象来管理防火墙规则的。
-
Documentation=man:firewalld(1):该字段指定了该服务的文档位置,可以通过man
2、[Service]选项:
这一部分配置了服务的运行方式和管理行为。
-
EnvironmentFile=-/etc/sysconfig/firewalld:该行指定了一个环境变量文件,firewalld启动时会读取该文件中的配置。文件路径前的
-
表示如果该文件不存在,不会导致错误。这个文件通常用于存储防火墙的相关配置参数,比如设置防火墙的运行模式等。 -
ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS:这指定了启动firewalld服务的命令。--nofork选项指示firewalld在前台运行(不创建子进程),而--nopid表示不会生成PID文件。$FIREWALLD_ARGS是从EnvironmentFile中读取的变量,允许在启动时传递额外的参数。
-
ExecReload=/bin/kill -HUP $MAINPID:这个配置指定了如何重新加载firewalld服务。通常,通过向主进程发送SIGHUP信号来通知它重新加载配置,而不需要停止整个服务。
-
StandardOutput=null:该行配置了标准输出流的行为,null表示不输出任何内容到控制台或日志文件。这样可以减少不必要的日志记录。
-
StandardError=null:与StandardOutput类似,StandardError=null表示错误输出也不会记录或显示。
-
Type=dbus:该行指定了服务类型为dbus,这意味着firewalld作为一个D-Bus服务运行。D-Bus是一个消息总线系统,用于进程间通信。firewalld通过D-Bus与其他系统服务进行交互,允许其他服务查询或配置防火墙规则。
-
BusName=org.fedoraproject.FirewallD1:这定义了firewalld服务的D-Bus名称。通过这个名称,其他进程可以与firewalld进行通信。
-
KillMode=mixed:该配置控制服务停止时的进程终止方式。mixed表示在正常停止时,firewalld会先优雅地终止进程,然后强制结束所有子进程。如果服务中有子进程,它们也会被终止。
3、[Install]选项:
这一部分定义了如何安装和启用该服务。
-
WantedBy=multi-user.target:这行指示firewalld服务在multi-user.target(即多用户模式)启动时自动启动。multi-user.target是一个典型的运行级别,表示系统已准备好进行多用户操作。
-
Alias=dbus-org.fedoraproject.FirewallD1.service:这一行定义了一个别名,可以通过这个别名来访问和管理该服务。在此,dbus-org.fedoraproject.FirewallD1.service是firewalld服务的D-Bus别名,提供了另一种访问和控制服务的方式。
补充:
multi-user.target是 systemd 启动系统中的一个 target unit,它定义了一个系统运行级别,在这种级别下,系统进入多用户模式,通常是没有图形用户界面的文本模式。它的作用类似于传统的 Unix 系统中的运行级别(runlevel),特别是类似于运行级别 3(runlevel 3)的模式。
multi-user.target主要用于在没有图形用户界面的情况下启动一个适合多个用户登录和使用的环境:
多用户模式:这意味着多个用户可以通过命令行界面(CLI)登录到系统。这是一个多用户环境,允许系统支持多个并发的登录会话,适用于服务器或无头系统(没有图形界面的系统)。
无图形界面:multi-user.target不会启动图形用户界面(GUI)相关的服务,如 X 服务器或桌面环境。系统只会启动基本的系统服务和命令行工具,因此适合用于服务器或需要通过 SSH 等远程登录的场景。
基本系统服务:启动过程中,multi-user.target 会依赖一些重要的系统服务,包括网络配置、日志记录、文件系统挂载、SSH 服务等。
当系统启动并进入multi-user.target时,会触发一系列的服务:
- 启动网络服务(如网络接口、DNS 配置等)。
- 启动 SSH 服务,允许远程登录。
- 启动各种后台服务,如数据库服务、邮件服务等。
- 不启动图形用户界面(GUI)。
五、System目标(Target)
在 CentOS 7 中,target是一个系统运行级别的概念,类似于传统的 runlevel。常见的目标如下所示:
- default.target:系统默认启动的目标。
- multi-user.target:多用户模式,相当于传统的 runlevel 3。
- graphical.target:图形界面模式,相当于传统的 runlevel 5。
- rescue.target:救援模式,相当于传统的 runlevel 1。
- shutdown.target:系统关闭目标。
六、Systemd服务管理策略
Systemd 提供了很多高级的服务管理功能:
- 并行启动:Systemd 能够并行启动服务,从而提高系统启动速度。
- 依赖关系管理:通过After和Before等指令,Systemd 允许服务之间的依赖关系配置,以确保服务按正确的顺序启动。
- 服务监控和自动重启:通过Restart配置,Systemd 可以自动重启崩溃或失败的服务。
本节教程就到这里结束,更多内容请详见后续教程。