完善的 Systemctl 服务管理与 CoreDNS 自定义服务创建指南
在现代Linux系统中,systemd
作为系统和服务管理器,已经成为主流发行版的标准初始化系统。systemctl
是 systemd
的控制工具,用于管理系统服务、检查服务状态、启动和停止服务等操作。同时,CoreDNS 作为一个灵活、高效的DNS服务器,广泛应用于各种环境中。本文将详细介绍如何使用 systemctl
管理服务,以及如何创建和注册自己的自定义服务单元,特别是以CoreDNS为例,涵盖从安装Go语言环境、编译CoreDNS到配置和注册为系统服务的完整流程。
目录
1. 引言
在Linux系统管理中,服务的管理与控制是日常维护的重要部分。systemd
和 systemctl
提供了一套统一、高效的服务管理机制,简化了服务的启动、停止、重启以及状态监控等操作。同时,CoreDNS 作为一个灵活、高效的DNS服务器,广泛应用于各种环境中。通过本文,您将学习如何安装Go语言环境、编译CoreDNS、配置CoreDNS以及将其注册为系统服务,从而实现自动化和高效的DNS服务管理。
2. 安装Go语言环境
CoreDNS 使用Go语言开发,因此编译和运行CoreDNS需要安装Go语言环境。以下步骤将指导您如何在Linux系统中安装和配置Go语言环境。
2.1 下载和安装Go
下载Go语言安装包
首先,访问Go语言官方网站下载适合您系统的Go安装包。以Go 1.22.5为例,下载对应的Linux AMD64版本:
wget https://golang.org/dl/go1.22.5.linux-amd64.tar.gz
解压安装包
将下载的安装包解压到
/usr/local
目录:sudo tar -C /usr/local -xzf go1.22.5.linux-amd64.tar.gz
说明:此操作会将Go语言安装到
/usr/local/go
目录。
2.2 配置环境变量
为了在终端中全局使用Go命令,需要将Go的 bin
目录添加到 PATH
环境变量中。
编辑环境变量配置文件
打开
/etc/profile
文件进行编辑:sudo nano /etc/profile
添加Go环境变量
在文件末尾添加以下行:
export PATH=$PATH:/usr/local/go/bin
使改动生效
执行以下命令使环境变量立即生效:
source /etc/profile
2.3 验证安装
通过以下命令验证Go语言是否安装成功:
go version
预期输出:
go version go1.22.5 linux/amd64
2.4 配置工作空间
配置Go的工作空间(GOPATH)有助于管理Go项目和依赖包。
创建工作空间目录
例如,在用户主目录下创建
gowork
目录:mkdir -p $HOME/gowork
设置GOPATH环境变量
编辑
/etc/profile
文件:sudo nano /etc/profile
在文件末尾添加以下行:
export GOPATH=$HOME/gowork export PATH=$PATH:$GOPATH/bin
使改动生效
执行以下命令:
source /etc/profile
验证配置
使用以下命令检查Go环境配置:
go env
重点检查:
GOPATH
应设置为$HOME/gowork
PATH
应包含/usr/local/go/bin
和$GOPATH/bin
3. 克隆并编译CoreDNS
完成Go语言环境的安装和配置后,接下来将克隆CoreDNS的源码并进行编译。
3.1 克隆CoreDNS源码
克隆CoreDNS仓库
使用
git
克隆CoreDNS的官方仓库:git clone https://github.com/coredns/coredns
进入仓库目录
cd coredns
3.2 编译CoreDNS
编译源码
在CoreDNS源码目录中,运行
make
命令进行编译:make
说明:
make
将根据Makefile自动下载依赖、编译源码并生成可执行文件。验证编译结果
编译成功后,
coredns
可执行文件将位于当前目录中。可以通过以下命令检查版本:./coredns -version
预期输出:
CoreDNS-1.8.4
(具体版本号视克隆的源码版本而定)
4. 配置CoreDNS
CoreDNS的配置主要通过Corefile完成,此外,还需要配置DNS区域文件和转发配置文件。
4.1 Corefile配置文件
Corefile是CoreDNS的主要配置文件,用于定义DNS服务的行为和插件。以下是一个示例Corefile配置:
.:53 {
file /etc/coredns/db.vcm.asia {
reload 10s
}
errors
log
health {
lameduck 1s
}
ready
prometheus :9153
forward . /etc/coredns/resolv.conf {
prefer_udp
}
cache 30
loop
loadbalance
}
配置项解释:
.:53
:表示CoreDNS在所有网络接口的53端口监听。file /etc/coredns/db.vcm.asia
:加载指定的DNS区域文件。reload 10s
:每10秒检查一次区域文件是否有变更,自动重新加载。
errors
:记录错误信息。log
:记录访问日志。health
:健康检查插件,lameduck 1s
设置健康检查的延迟时间。ready
:指示服务准备就绪。prometheus :9153
:启用Prometheus监控,监听9153端口。forward . /etc/coredns/resolv.conf
:转发未解析的查询到指定的解析器。prefer_udp
:优先使用UDP协议进行转发。
cache 30
:启用缓存,缓存时间为30秒。loop
:防止DNS查询中的循环引用。loadbalance
:启用负载均衡。
4.2 DNS区域配置文件
DNS区域文件定义了特定域名的DNS记录。以下是一个示例区域文件 /etc/coredns/db.vcm.asia
:
$TTL 10
@ IN SOA ns1.vcm.asia. admin.vcm.asia. (
2024080301 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
IN NS ns1.vcm.asia.
IN NS ns2.vcm.asia.
wdcom.com.cn. IN A 110.40.59.75
www.wdcom.com.cn. IN A 110.40.59.75
a.wdcom.com.cn. IN A 110.40.59.75
配置项解释:
$TTL 10
:默认生存时间为10秒。@ IN SOA ns1.vcm.asia. admin.vcm.asia.
:定义起始授权机构(SOA)记录。Serial
:区域文件的序列号,用于DNS服务器判断配置是否有更新。Refresh
:主DNS服务器刷新时间。Retry
:主DNS服务器重试时间。Expire
:区域文件失效时间。Minimum TTL
:最小生存时间。
IN NS
:定义命名服务器记录。IN A
:定义A记录,将域名解析到指定的IP地址。
4.3 DNS转发配置文件
配置DNS转发器,指定CoreDNS在无法解析的情况下转发查询到其他DNS服务器。以下是一个示例 /etc/coredns/resolv.conf
文件:
nameserver 8.8.8.8
nameserver 8.8.4.4
说明:
nameserver
指定了Google的公共DNS服务器地址,CoreDNS将转发未解析的查询到这些地址。
5. 创建和注册CoreDNS为Systemd服务
将CoreDNS注册为系统服务,使其能够通过 systemctl
管理,实现自动启动和停止等功能。
5.1 创建服务单元文件
创建服务单元文件
使用编辑器创建一个新的systemd服务单元文件,例如
/etc/systemd/system/coredns.service
:sudo nano /etc/systemd/system/coredns.service
添加以下内容到服务单元文件
[Unit] Description=CoreDNS DNS Server After=network.target [Service] Type=simple User=root WorkingDirectory=/root/coredns ExecStart=/root/coredns/coredns -conf /etc/coredns/Corefile.txt Restart=on-failure [Install] WantedBy=multi-user.target
配置项解释:
[Unit]
Description
:服务描述。After
:指定服务启动顺序,表示在network.target
后启动。
[Service]
Type=simple
:指定服务类型为简单服务。User=root
:以root用户身份运行服务。WorkingDirectory
:设置服务的工作目录。ExecStart
:启动服务的命令及参数。Restart
:服务失败时的重启策略。
[Install]
WantedBy
:指定服务在哪个运行级别下启动,这里为multi-user.target
(多用户运行级别)。
注意:为了提高安全性,建议不要以root用户运行服务,而是创建一个专用用户,例如 coredns
。
示例:以专用用户运行
创建专用用户
sudo useradd -r -s /sbin/nologin coredns
修改服务单元文件
[Service] Type=simple User=coredns Group=coredns WorkingDirectory=/opt/coredns ExecStart=/opt/coredns/coredns -conf /etc/coredns/Corefile.txt Restart=on-failure
设置目录权限
sudo chown -R coredns:coredns /opt/coredns sudo chown root:root /etc/coredns/Corefile.txt sudo chmod 644 /etc/coredns/Corefile.txt
5.2 停止和禁用systemd-resolved
为了避免DNS冲突,需停止并禁用 systemd-resolved
服务。
停止systemd-resolved服务
sudo systemctl stop systemd-resolved
禁用systemd-resolved服务
sudo systemctl disable systemd-resolved
删除符号链接
如果存在
/etc/resolv.conf
的符号链接,需将其删除并创建新的resolv.conf
文件:sudo rm /etc/resolv.conf sudo nano /etc/resolv.conf
添加以下内容:
nameserver 127.0.0.1
说明:将DNS查询转发到本地的CoreDNS服务。
5.3 重新加载systemd配置
修改或创建新的服务单元文件后,需要重新加载 systemd
配置以识别新的服务。
sudo systemctl daemon-reload
5.4 启动并启用CoreDNS服务
启动服务
sudo systemctl start coredns
启用服务开机自启
sudo systemctl enable coredns
确认服务状态
sudo systemctl status coredns
预期输出:
● coredns.service - CoreDNS DNS Server Loaded: loaded (/etc/systemd/system/coredns.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2024-04-26 11:00:00 UTC; 5s ago Main PID: 6789 (coredns) Tasks: 2 (limit: 4915) Memory: 3.1M CGroup: /system.slice/coredns.service └─6789 /root/coredns/coredns -conf /etc/coredns/Corefile.txt
6. 复活系统的DNS解析
在禁用 systemd-resolved
后,需要重新配置DNS解析以确保系统能够正常解析域名。
6.1 修改systemd-resolved配置
编辑resolved.conf文件
打开
/etc/systemd/resolved.conf
文件:sudo nano /etc/systemd/resolved.conf
添加或修改以下设置
在
[Resolve]
部分中添加:[Resolve] DNSStubListener=no
说明:禁用
systemd-resolved
的Stub监听器。保存并关闭文件
6.2 创建自定义监听器配置
如果需要让 systemd-resolved
监听其他端口,例如5353端口,可以创建一个自定义的 .socket
文件。
创建socket文件
sudo nano /etc/systemd/system/systemd-resolved.socket
添加以下内容
[Unit] Description=Stub resolver for systemd-resolved [Socket] ListenStream=5353 BindIPv6Only=both [Install] WantedBy=sockets.target
说明:配置
systemd-resolved
在5353端口监听。
6.3 重载和启动服务
重新加载systemd配置
sudo systemctl daemon-reload
启动新的socket并重新启动systemd-resolved服务
sudo systemctl start systemd-resolved.socket sudo systemctl restart systemd-resolved
验证服务状态
sudo systemctl status systemd-resolved
预期输出:
● systemd-resolved.service - Network Name Resolution Loaded: loaded (/lib/systemd/system/systemd-resolved.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2024-04-26 11:15:00 UTC; 1min 30s ago
7. 一键脚本自动化部署
为了简化上述步骤,可以编写一个一键部署脚本,自动完成Go语言环境安装、CoreDNS编译、配置以及注册为systemd服务。以下是一个示例脚本:
#!/bin/bash
# 一键部署CoreDNS及systemctl服务的脚本
# 注意:请以root用户或使用sudo执行此脚本
set -e
# 变量定义
GO_VERSION="1.22.5"
GO_TAR="go${GO_VERSION}.linux-amd64.tar.gz"
GO_URL="https://golang.org/dl/${GO_TAR}"
GO_INSTALL_DIR="/usr/local"
GOPATH_DIR="$HOME/gowork"
COREDNS_REPO="https://github.com/coredns/coredns.git"
COREDNS_DIR="$HOME/coredns"
COREDNS_CONF_DIR="/etc/coredns"
COREDNS_CONF_FILE="$COREDNS_CONF_DIR/Corefile.txt"
ZONE_FILE="$COREDNS_CONF_DIR/db.vcm.asia"
RESOLV_CONF="$COREDNS_CONF_DIR/resolv.conf"
SYSTEMD_SERVICE_FILE="/etc/systemd/system/coredns.service"
SERVICE_USER="coredns"
# 更新系统
echo "更新系统..."
apt-get update && apt-get upgrade -y
# 安装必要的软件包
echo "安装必要的软件包..."
apt-get install -y git wget make nano
# 安装Go语言环境
echo "下载并安装Go语言..."
wget -O /tmp/$GO_TAR $GO_URL
tar -C $GO_INSTALL_DIR -xzf /tmp/$GO_TAR
rm /tmp/$GO_TAR
# 配置环境变量
echo "配置Go语言环境变量..."
{
echo "export PATH=\$PATH:/usr/local/go/bin"
echo "export GOPATH=$GOPATH_DIR"
echo "export PATH=\$PATH:\$GOPATH/bin"
} >> /etc/profile
# 使环境变量生效
source /etc/profile
# 验证Go安装
echo "验证Go语言安装..."
go version
# 创建工作空间
echo "创建Go工作空间..."
mkdir -p $GOPATH_DIR
# 克隆CoreDNS源码
echo "克隆CoreDNS源码..."
git clone $COREDNS_REPO $COREDNS_DIR
# 编译CoreDNS
echo "编译CoreDNS..."
cd $COREDNS_DIR
make
# 创建配置目录
echo "创建CoreDNS配置目录..."
mkdir -p $COREDNS_CONF_DIR
# 创建Corefile配置文件
echo "创建Corefile配置文件..."
cat <<EOF > $COREDNS_CONF_FILE
.:53 {
file $ZONE_FILE {
reload 10s
}
errors
log
health {
lameduck 1s
}
ready
prometheus :9153
forward . /etc/coredns/resolv.conf {
prefer_udp
}
cache 30
loop
loadbalance
}
EOF
# 创建DNS区域配置文件
echo "创建DNS区域配置文件..."
cat <<EOF > $ZONE_FILE
\$TTL 10
@ IN SOA ns1.vcm.asia. admin.vcm.asia. (
2024080301 ; Serial
3600 ; Refresh
1800 ; Retry
604800 ; Expire
86400 ) ; Minimum TTL
IN NS ns1.vcm.asia.
IN NS ns2.vcm.asia.
wdcom.com.cn. IN A 110.40.59.75
www.wdcom.com.cn. IN A 110.40.59.75
a.wdcom.com.cn. IN A 110.40.59.75
EOF
# 创建DNS转发配置文件
echo "创建DNS转发配置文件..."
cat <<EOF > $RESOLV_CONF
nameserver 8.8.8.8
nameserver 8.8.4.4
EOF
# 创建专用用户运行CoreDNS
echo "创建专用用户coredns..."
useradd -r -s /sbin/nologin $SERVICE_USER
# 复制编译后的CoreDNS到工作目录
echo "复制CoreDNS可执行文件到工作目录..."
mkdir -p /opt/coredns
cp $COREDNS_DIR/coredns /opt/coredns/
chown -R $SERVICE_USER:$SERVICE_USER /opt/coredns
# 设置配置文件权限
echo "设置配置文件权限..."
chown -R root:root $COREDNS_CONF_DIR
chmod 644 $COREDNS_CONF_FILE $ZONE_FILE $RESOLV_CONF
# 创建systemd服务单元文件
echo "创建systemd服务单元文件..."
cat <<EOF > $SYSTEMD_SERVICE_FILE
[Unit]
Description=CoreDNS DNS Server
After=network.target
[Service]
Type=simple
User=$SERVICE_USER
Group=$SERVICE_USER
WorkingDirectory=/opt/coredns
ExecStart=/opt/coredns/coredns -conf $COREDNS_CONF_FILE
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF
# 停止并禁用systemd-resolved
echo "停止并禁用systemd-resolved..."
systemctl stop systemd-resolved
systemctl disable systemd-resolved
# 删除旧的resolv.conf并创建新的
echo "配置resolv.conf..."
rm /etc/resolv.conf
cat <<EOF > /etc/resolv.conf
nameserver 127.0.0.1
EOF
# 重新加载systemd配置
echo "重新加载systemd配置..."
systemctl daemon-reload
# 启动并启用CoreDNS服务
echo "启动并启用CoreDNS服务..."
systemctl start coredns
systemctl enable coredns
# 验证服务状态
echo "验证CoreDNS服务状态..."
systemctl status coredns
echo "CoreDNS已成功部署并作为系统服务运行。"
使用说明:
保存脚本:
将上述脚本内容保存为
deploy_coredns.sh
。赋予执行权限:
chmod +x deploy_coredns.sh
执行脚本:
以root用户或使用sudo执行脚本:
sudo ./deploy_coredns.sh
脚本功能概述:
- 更新系统并安装必要的软件包(Git、Wget、Make、Nano)。
- 下载并安装指定版本的Go语言。
- 配置Go的环境变量和工作空间。
- 克隆CoreDNS源码并编译。
- 创建CoreDNS的配置文件(Corefile、DNS区域文件和转发配置文件)。
- 创建专用用户运行CoreDNS服务,提升安全性。
- 创建并配置systemd服务单元文件。
- 停止并禁用系统默认的
systemd-resolved
服务,避免DNS冲突。 - 配置新的
resolv.conf
文件,将DNS查询转发到本地CoreDNS服务。 - 重新加载systemd配置,启动并启用CoreDNS服务。
- 验证服务状态,确保CoreDNS正常运行。
8. 总结
通过本文,您已经学习了如何在Linux系统中使用 systemctl
管理服务,以及如何创建和注册自定义服务单元。以CoreDNS为例,您了解了从安装Go语言环境、编译CoreDNS、配置CoreDNS到将其注册为systemd服务的完整流程。此外,通过提供的一键部署脚本,您可以快速自动化地完成CoreDNS的安装和配置,提升系统管理的效率和安全性。
关键要点:
- 理解systemd与systemctl:了解
systemd
的工作原理及systemctl
的基本命令。 - 安装和配置Go语言环境:为编译Go语言开发的应用程序(如CoreDNS)做好准备。
- 编译和配置CoreDNS:掌握CoreDNS的编译流程及其配置文件的编写。
- 创建自定义systemd服务:学习如何将CoreDNS或其他应用注册为系统服务,实现自动管理。
- 自动化部署:通过脚本化部署,简化复杂的安装和配置流程,减少人为错误。
- 安全性考虑:使用专用用户运行服务,配置正确的权限和环境变量,增强系统安全性。
通过不断的实践和学习,您将能够熟练运用这些工具和方法,提升Linux系统的管理能力和安全性,确保系统的高效与稳定运行。
9. 附录:常用命令快捷参考
以下是本文介绍的各类 systemctl
和相关工具的常用命令示例,供您快速查阅和参考。
9.1 使用 systemctl
查看服务状态
systemctl status <service>
示例:
systemctl status coredns
9.2 使用 systemctl
启动服务
sudo systemctl start <service>
示例:
sudo systemctl start coredns
9.3 使用 systemctl
停止服务
sudo systemctl stop <service>
示例:
sudo systemctl stop coredns
9.4 使用 systemctl
重启服务
sudo systemctl restart <service>
示例:
sudo systemctl restart coredns
9.5 使用 systemctl
重新加载服务配置
sudo systemctl reload <service>
示例:
sudo systemctl reload coredns
9.6 使用 systemctl
启用服务开机自启
sudo systemctl enable <service>
示例:
sudo systemctl enable coredns
9.7 使用 systemctl
禁用服务开机自启
sudo systemctl disable <service>
示例:
sudo systemctl disable coredns
9.8 使用 systemctl
查看所有服务
systemctl list-units --type=service --all
9.9 使用 journalctl
查看服务日志
sudo journalctl -u <service>
示例:
sudo journalctl -u coredns
9.10 使用 systemd-analyze
验证单元文件语法
sudo systemd-analyze verify /etc/systemd/system/<service>.service
示例:
sudo systemd-analyze verify /etc/systemd/system/coredns.service
9.11 一键查看所有端口占用信息
sudo ss -tulnp && sudo netstat -tulnp && sudo lsof -i -P -n | grep LISTEN
说明:此命令组合使用多个工具,提供全面的端口占用信息。
通过本文的详细讲解和丰富示例,您已经全面了解了如何使用 systemctl
管理系统服务,以及如何创建和注册自定义服务单元,特别是以CoreDNS为例的实际应用。结合一键部署脚本,您可以高效地完成CoreDNS的安装和配置,确保系统DNS服务的稳定与安全。