Administrator
Administrator
发布于 2024-12-04 / 20 阅读
0
0

完善的 Systemctl 服务管理与 CoreDNS 自定义服务创建

完善的 Systemctl 服务管理与 CoreDNS 自定义服务创建指南

在现代Linux系统中,systemd 作为系统和服务管理器,已经成为主流发行版的标准初始化系统。systemctlsystemd 的控制工具,用于管理系统服务、检查服务状态、启动和停止服务等操作。同时,CoreDNS 作为一个灵活、高效的DNS服务器,广泛应用于各种环境中。本文将详细介绍如何使用 systemctl 管理服务,以及如何创建和注册自己的自定义服务单元,特别是以CoreDNS为例,涵盖从安装Go语言环境、编译CoreDNS到配置和注册为系统服务的完整流程。

目录

  1. 引言
  2. 安装Go语言环境
  3. 克隆并编译CoreDNS
  4. 配置CoreDNS
  5. 创建和注册CoreDNS为Systemd服务
  6. 复活系统的DNS解析
  7. 一键脚本自动化部署
  8. 总结
  9. 附录:常用命令快捷参考

1. 引言

在Linux系统管理中,服务的管理与控制是日常维护的重要部分。systemdsystemctl 提供了一套统一、高效的服务管理机制,简化了服务的启动、停止、重启以及状态监控等操作。同时,CoreDNS 作为一个灵活、高效的DNS服务器,广泛应用于各种环境中。通过本文,您将学习如何安装Go语言环境、编译CoreDNS、配置CoreDNS以及将其注册为系统服务,从而实现自动化和高效的DNS服务管理。


2. 安装Go语言环境

CoreDNS 使用Go语言开发,因此编译和运行CoreDNS需要安装Go语言环境。以下步骤将指导您如何在Linux系统中安装和配置Go语言环境。

2.1 下载和安装Go

  1. 下载Go语言安装包

    首先,访问Go语言官方网站下载适合您系统的Go安装包。以Go 1.22.5为例,下载对应的Linux AMD64版本:

    wget https://golang.org/dl/go1.22.5.linux-amd64.tar.gz
    
  2. 解压安装包

    将下载的安装包解压到 /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 环境变量中。

  1. 编辑环境变量配置文件

    打开 /etc/profile 文件进行编辑:

    sudo nano /etc/profile
    
  2. 添加Go环境变量

    在文件末尾添加以下行:

    export PATH=$PATH:/usr/local/go/bin
    
  3. 使改动生效

    执行以下命令使环境变量立即生效:

    source /etc/profile
    

2.3 验证安装

通过以下命令验证Go语言是否安装成功:

go version

预期输出

go version go1.22.5 linux/amd64

2.4 配置工作空间

配置Go的工作空间(GOPATH)有助于管理Go项目和依赖包。

  1. 创建工作空间目录

    例如,在用户主目录下创建 gowork 目录:

    mkdir -p $HOME/gowork
    
  2. 设置GOPATH环境变量

    编辑 /etc/profile 文件:

    sudo nano /etc/profile
    

    在文件末尾添加以下行:

    export GOPATH=$HOME/gowork
    export PATH=$PATH:$GOPATH/bin
    
  3. 使改动生效

    执行以下命令:

    source /etc/profile
    
  4. 验证配置

    使用以下命令检查Go环境配置:

    go env
    

    重点检查

    • GOPATH 应设置为 $HOME/gowork
    • PATH 应包含 /usr/local/go/bin$GOPATH/bin

3. 克隆并编译CoreDNS

完成Go语言环境的安装和配置后,接下来将克隆CoreDNS的源码并进行编译。

3.1 克隆CoreDNS源码

  1. 克隆CoreDNS仓库

    使用 git 克隆CoreDNS的官方仓库:

    git clone https://github.com/coredns/coredns
    
  2. 进入仓库目录

    cd coredns
    

3.2 编译CoreDNS

  1. 编译源码

    在CoreDNS源码目录中,运行 make 命令进行编译:

    make
    

    说明make 将根据Makefile自动下载依赖、编译源码并生成可执行文件。

  2. 验证编译结果

    编译成功后,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 创建服务单元文件

  1. 创建服务单元文件

    使用编辑器创建一个新的systemd服务单元文件,例如 /etc/systemd/system/coredns.service

    sudo nano /etc/systemd/system/coredns.service
    
  2. 添加以下内容到服务单元文件

    [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

示例:以专用用户运行

  1. 创建专用用户

    sudo useradd -r -s /sbin/nologin coredns
    
  2. 修改服务单元文件

    [Service]
    Type=simple
    User=coredns
    Group=coredns
    WorkingDirectory=/opt/coredns
    ExecStart=/opt/coredns/coredns -conf /etc/coredns/Corefile.txt
    Restart=on-failure
    
  3. 设置目录权限

    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 服务。

  1. 停止systemd-resolved服务

    sudo systemctl stop systemd-resolved
    
  2. 禁用systemd-resolved服务

    sudo systemctl disable systemd-resolved
    
  3. 删除符号链接

    如果存在 /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服务

  1. 启动服务

    sudo systemctl start coredns
    
  2. 启用服务开机自启

    sudo systemctl enable coredns
    
  3. 确认服务状态

    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配置

  1. 编辑resolved.conf文件

    打开 /etc/systemd/resolved.conf 文件:

    sudo nano /etc/systemd/resolved.conf
    
  2. 添加或修改以下设置

    [Resolve] 部分中添加:

    [Resolve]
    DNSStubListener=no
    

    说明:禁用 systemd-resolved 的Stub监听器。

  3. 保存并关闭文件

6.2 创建自定义监听器配置

如果需要让 systemd-resolved 监听其他端口,例如5353端口,可以创建一个自定义的 .socket 文件。

  1. 创建socket文件

    sudo nano /etc/systemd/system/systemd-resolved.socket
    
  2. 添加以下内容

    [Unit]
    Description=Stub resolver for systemd-resolved
    
    [Socket]
    ListenStream=5353
    BindIPv6Only=both
    
    [Install]
    WantedBy=sockets.target
    

    说明:配置 systemd-resolved 在5353端口监听。

6.3 重载和启动服务

  1. 重新加载systemd配置

    sudo systemctl daemon-reload
    
  2. 启动新的socket并重新启动systemd-resolved服务

    sudo systemctl start systemd-resolved.socket
    sudo systemctl restart systemd-resolved
    
  3. 验证服务状态

    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已成功部署并作为系统服务运行。"

使用说明

  1. 保存脚本

    将上述脚本内容保存为 deploy_coredns.sh

  2. 赋予执行权限

    chmod +x deploy_coredns.sh
    
  3. 执行脚本

    以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服务的稳定与安全。


评论