systemd有用的一些内容
在使用systemd作为系统和服务管理器的Linux系统中,你可以通过多种方式查看已启用的服务。systemd使用systemctl
命令来管理系统和服务。以下是一些查看已启用服务的方法:
1. 常见用法
1.1. 查看所有已启用的服务
要列出所有在系统启动时自动启动(即已启用)的服务,你可以使用systemctl list-unit-files --type=service --state=enabled
命令。这个命令会列出所有设置为在启动时自动启动的服务单元。
systemctl list-unit-files --type=service --state=enabled
1.2. 过滤查看特定服务
如果你只对某个特定的服务是否已启用感兴趣,你可以使用grep
命令来过滤输出结果。例如,要检查httpd
(Apache HTTP服务器)服务是否已启用,你可以这样做:
systemctl list-unit-files --type=service --state=enabled | grep httpd
1.3. 查看服务的状态
虽然这不是直接查看服务是否已启用,但systemctl status
命令可以提供关于服务当前状态(包括是否正在运行以及是否设置为在启动时自动启动)的详细信息。如果你对某个服务的具体状态感兴趣,可以使用此命令:
systemctl status httpd
在输出中,你会看到Loaded:
行,它指示了服务的启用状态(例如,loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
表示服务已启用)。
1.4. 查看特定目标(target)下的已启用服务
systemd使用目标(targets)来定义系统运行状态,类似于传统的运行级别(runlevels)。你可以查看特定目标下已启用的服务。首先,使用systemctl list-units --type=target --all
列出所有可用的目标,然后选择一个目标,并使用systemctl list-dependencies
来查看该目标下的所有服务(包括已启用的服务):
systemctl list-units --type=target --all
# 假设你选择了 multi-user.target
systemctl list-dependencies multi-user.target
注意,list-dependencies
命令会列出目标依赖的所有单元,包括服务、挂载点等,而不仅仅是服务。如果你只对服务感兴趣,你可能需要结合使用grep
来过滤输出。
1.5. 总结
查看systemd系统中已启用的服务主要依赖于systemctl list-unit-files
命令,结合适当的选项和过滤,你可以轻松地找到你需要的信息。
2. systemd开机启动服务,以iptable为例
原始的命令为 sudo iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
在systemd中创建一个服务来启动一个脚本,该脚本包含iptables
命令以设置NAT规则,需要注意几个关键点:
-
使用
iptables
而非sudo iptables
:在systemd服务中直接运行需要sudo
权限的命令通常不是一个好主意,因为systemd服务通常是以特定用户(如root
或某个特定用户)身份运行的。你应该确保systemd服务以root
用户身份运行,这样它就可以直接执行iptables
命令而无需sudo
。 -
脚本的权限:确保你的脚本文件是可执行的,并且位于一个安全的、只有
root
用户或适当权限的用户可以访问的位置。 -
systemd服务文件:你需要创建一个systemd服务文件来描述你的服务,包括它要执行的脚本。
以下是一个示例步骤,展示如何创建一个systemd服务来在启动时运行一个包含iptables
NAT规则的脚本:
2.1. 第一步:创建脚本
首先,创建一个脚本文件,比如叫setup-nat.sh
,并给它可执行权限:
sudo vim /srv/all/backup/setup-nat.sh
在文件中写入以下内容:
ivo@debian:/srv/all/backup$ sudo chmod +x /srv/all/backup/setup-nat.sh
ivo@debian:/srv/all/backup$ cat /srv/all/backup/setup-nat.sh
#!/bin/bash
# 设置NAT规则
iptables -t nat -A POSTROUTING -o wlp3s0 -j MASQUERADE
# 注意:MASQUERADE可能是MASQUERADE的误写,通常使用MASQUERADE是为了动态IP地址的NAT
# 如果你确定你的环境需要MASQUERADE,并且了解它的含义,那么可以使用它
# 但通常,你可能想要使用SNAT来指定一个源IP地址
# 例如:iptables -t nat -A POSTROUTING -o wlp3s0 -j SNAT --to-source <你的公网IP>
2.2. 第二步:创建systemd服务文件
接下来,创建一个systemd服务文件来描述你的服务:
sudo vim /etc/systemd/system/setup-nat.service
在文件中写入以下内容:
[Unit]
Description=Setup NAT rules on boot
After=network.target
[Service]
Type=oneshot
ExecStart=/srv/all/backup/setup-nat.sh
[Install]
WantedBy=multi-user.target
保存并退出编辑器。
2.3. 第三步:启用并启动服务
现在,你需要启用并启动你的systemd服务:
sudo systemctl daemon-reload
sudo systemctl enable setup-nat.service
sudo systemctl start setup-nat.service
systemctl daemon-reload
命令用于重新加载systemd的配置文件,以确保它识别到你的新服务。
systemctl enable
命令用于在系统启动时启用该服务。
systemctl start
命令用于立即启动该服务。
2.4. 注意事项
- 确保
wlp3s0
是你想要设置NAT规则的正确网络接口名称。 - 如果你使用的是静态IP地址,并且想要进行源地址转换(SNAT),请考虑将
MASQUERADE
替换为SNAT
并指定一个源IP地址。 - 如果你在脚本中遇到权限问题(尽管在这个例子中我们假设服务以
root
身份运行),请检查systemd服务的用户设置(在[Service]
部分中的User=
和Group=
选项)。但是,对于设置iptables规则来说,通常不需要更改这些设置,因为iptables命令需要root
权限。