systemctl enable和/etc/systemd/system目录之间的关系

linux系统中有很多的system目录,在平常使用中或者大量的博客中,常看到的有/etc/systemd/system、/lib/systemd/system以及/usr/lib/systemd/system等,这三者有什么样的关系呢,本文将三者的关系详细说明,后续使用不再混淆。

简介

目录/lib/systemd/system以及/usr/lib/systemd/system其实指向的是同一目录,在/目录下ll可知:

[root@localhost /]# ll
total 28
lrwxrwxrwx.   1 root root    7 Jul  3 09:43 bin -> usr/bin
dr-xr-xr-x.   5 root root 4096 Jul 19 12:04 boot
drwxr-xr-x.  19 root root 3080 Jul 19 04:03 dev
drwxr-xr-x.  76 root root 8192 Jul 19 20:07 etc
drwxr-xr-x.   4 root root   39 Jul 19 04:37 home
lrwxrwxrwx.   1 root root    7 Jul  3 09:43 lib -> usr/lib
lrwxrwxrwx.   1 root root    9 Jul  3 09:43 lib64 -> usr/lib64
drwxr-xr-x.   2 root root    6 Apr 11  2018 media
drwxr-xr-x.   2 root root    6 Apr 11  2018 mnt
drwxr-xr-x.   3 root root   23 Jul  3 20:33 opt
dr-xr-xr-x. 118 root root    0 Jul 19 04:03 proc
dr-xr-x---.  10 root root 4096 Jul 20 06:31 root
drwxr-xr-x.  27 root root  760 Jul 19 16:00 run
lrwxrwxrwx.   1 root root    8 Jul  3 09:43 sbin -> usr/sbin
drwxr-xr-x.   2 root root    6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root    0 Jul 19 04:03 sys
drwxrwxrwt.  10 root root 4096 Jul 20 03:37 tmp
drwxr-xr-x.  13 root root  155 Jul  3 09:43 usr
drwxr-xr-x.  21 root root 4096 Jul 19 13:34 var
  • [/usr]/lib/systemd/system/ 该目录中包含的是软件包安装的单元,也就是说通过yum、dnf、rpm等软件包管理命令管理的systemd单元文件,都放置在该目录下。
[/usr]/lib/systemd/system/
The expectation is that `/lib/systemd/system` is a directory that should only contain systemd unit files which were put there by the package manager (YUM/DNF/RPM/APT/etc).
  • /etc/systemd/system/(系统管理员安装的单元, 优先级更高)
Files in /etc/systemd/system are manually placed here by the operator of the system for ad-hoc software installations that are not in the form of a package. This would include tarball type software installations or home grown scripts.

在一般的使用场景下,每一个 Unit(服务等) 都有一个配置文件,告诉 Systemd 怎么启动这个 Unit 。
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在这个目录。 systemctl enable 命令用于在上面两个目录之间,建立符号链接关系。

$ sudo systemctl enable clamd@scan.service
# 等同于
$ sudo ln -s '/usr/lib/systemd/system/clamd@scan.service' '/etc/systemd/system/multi-user.target.wants/clamd@scan.service'

如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。

$ sudo systemctl disable clamd@scan.service

虽然在/etc/systemd/system/目录下放置的是系统管理员安装的单元,但是实际使用过程中,用户可以自定义服务配置文件,并且放置在该目录,将该服务的配置文件的优先级提高。

优先级

systemd的使用大幅提高了系统服务的运行效率, 而unit的文件位置一般主要有三个目录:

Table 1.  Load path when running in system mode (--system).
┌────────────────────────┬─────────────────────────────┐
│Path                    │ Description                 │
├────────────────────────┼─────────────────────────────┤
│/etc/systemd/system     │ Local configuration         │
├────────────────────────┼─────────────────────────────┤
│/run/systemd/system     │ Runtime units               │
├────────────────────────┼─────────────────────────────┤
│/lib/systemd/system     │ Units of installed packages │
└────────────────────────┴─────────────────────────────┘

这三个目录的配置文件优先级依次从高到低,如果同一选项三个地方都配置了,优先级高的会覆盖优先级低的。

系统安装时,默认会将unit文件放在/lib/systemd/system目录。如果我们想要修改系统默认的配置,比如nginx.service,一般有两种方法:

  1. /etc/systemd/system目录下创建nginx.service文件,里面写上我们自己的配置。
  2. /etc/systemd/system下面创建nginx.service.d目录,在这个目录里面新建任何以.conf结尾的文件,然后写入我们自己的配置。推荐这种做法。

/run/systemd/system这个目录一般是进程在运行时动态创建unit文件的目录,一般很少修改,除非是修改程序运行时的一些参数时,即Session级别的,才在这里做修改。

<think>好的,用户现在问的是关于执行`systemctl enable httpd`命令后的输出。首先,我需要理解这个命令的作用以及系统给出的响应是什么意思。用户可能是在设置Apache HTTP服务器开机启动,所以需要解释这个命令的目的结果。 首先,回忆一下systemctl的基本知识。`systemctl enable`用于启用服务,使其在系统启动时自动运行。这里用户执行的是启用httpd服务,也就是Apache。输出的信息显示创建了一个符号链接,指向httpd的服务单元文件。这说明服务已经成功配置为开机启动。 接下来,我需要确定用户的需求。用户可能想知道这个命令到底做了什么,或者确认是否成功启用了服务。也有可能用户遇到了问题,但根据输出信息,这里显示的是成功的操作,所以可能用户只是想了解这个过程。 然后,考虑用户的背景。用户可能有一定的Linux使用经验,但可能对systemctl的工作原理不太熟悉。需要解释符号链接的作用,以及服务单元文件的存放位置。还要提到可能需要重新加载systemd配置,不过在这个例子中,用户执行命令后系统已经自动处理了,所以不需要额外步骤。 另外,用户可能会关心接下来的步骤,比如启动服务或验证状态。因此,应该建议用户使用`systemctl start httpd`来立即启动服务,并用`systemctl status httpd`检查运行状态。还需要提醒防火墙设置测试服务访问,这些是常见的后续操作。 还要注意可能的疑问点。比如,为什么需要创建符号链接?解释这是因为systemd通过目标(target)来管理服务启动,符号链接将服务添加到对应的目标中,确保在启动时被激活。 最后,确保回答结构清晰,分步骤说明,并给出总结,强调关键点。这样用户能逐步理解整个过程,并知道下一步该做什么。</think>以下是关于执行 `systemctl enable httpd` 命令的详细解释操作结果分析: --- ### **命令功能** - **`systemctl enable httpd`** 的作用是将 Apache HTTP 服务(`httpd`)配置为 **开机自动启动**。 - 此命令不会立即启动服务,仅设置服务的自启规则。 --- ### **输出结果解析** ```bash Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service ``` - **含义**: 1. Systemd 创建了一个 **符号链接**(软链接),将 Apache 的服务单元文件(`httpd.service`)关联到 `multi-user.target` 目标。 2. `multi-user.target` 是 Linux 多用户模式(无图形界面)的默认启动目标,表示系统启动到该模式时会自动启动 `httpd` 服务。 - **路径说明**: - **源文件**:`/usr/lib/systemd/system/httpd.service` - 这是 Apache 服务的默认配置文件,由软件包安装时生成。 - **符号链接**:`/etc/systemd/system/multi-user.target.wants/httpd.service` - 该链接告诉 systemd:当系统进入 `multi-user.target` 状态时,需要激活 `httpd` 服务。 --- ### **后续操作建议** 1. **立即启动服务**(如果尚未运行): ```bash sudo systemctl start httpd ``` 2. **验证服务状态**: ```bash sudo systemctl status httpd ``` - 检查输出中是否包含 `active (running)` `enabled` 字样(分别表示服务已运行且开机自启已配置)。 3. **开放防火墙端口**(若需外部访问): ```bash sudo firewall-cmd --permanent --add-service=http # 开放 HTTP(80 端口) sudo firewall-cmd --permanent --add-service=https # 开放 HTTPS(443 端口) sudo firewall-cmd --reload ``` 4. **测试访问**: - 在浏览器中输入服务器 IP 或域名(如 `http://your-server-ip`),若看到 Apache 默认页面,说明服务正常运行。 --- ### **关键总结** - **符号链接的作用**:通过将服务文件链接到目标(`multi-user.target`),实现服务与系统启动阶段的绑定。 - **手动启动与自启的区别**:`enable` 仅配置自启,`start` 才会立即运行服务。 - **配置文件层级**: - 自定义服务配置应放在 `/etc/systemd/system/` 目录,优先级高于 `/usr/lib/systemd/system/`。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值