Ubuntu 22.04 安装 PowerDNS 5.1.4 指南
Ubuntu 22.04 从零安装 PowerDNS Authoritative 5.1.4:官方 APT 源与 universe 源双方案、SQLite3 后端初始化、53 端口冲突与只读数据库排障实录、systemd 托管验证与卸载清理。
Ubuntu 22.04 安装 PowerDNS 5.1.4 指南
目标:在 Ubuntu 22.04 服务器上从零安装 PowerDNS Authoritative Server 5.1.4(授权 DNS 服务器),覆盖官方 APT 源主线安装、universe 内置源备用安装、SQLite3 数据库后端初始化、systemd 托管与启动验证、首个区域的创建与解析验证、常见故障排查与卸载清理。全文命令与回显均在 Ubuntu 22.04.4 LTS 真实服务器上实测通过(查询/实测日期 2026-10-20)。
一、环境信息
本文所有命令在以下环境中实测通过:
- 操作系统:Ubuntu 22.04.4 LTS(Jammy Jellyfish),内核 6.8.0-138-generic,x86_64
- systemd 版本:249(249.11-0ubuntu3.22)
- PowerDNS Authoritative Server:5.1.4-1pdns.ubuntu22.04(官方 APT 源 jammy-auth-51 分支)
- 数据库后端:pdns-backend-sqlite3 5.1.4-1pdns.ubuntu22.04,SQLite3 CLI 3.37.2
- 客户端验证工具:dig 9.18.39-0ubuntu0.22.04.6-Ubuntu
- 监听地址:127.0.0.2:53(本机 53 端口被既有 DNS 服务占用,改绑独立回环地址,见第八章排障实录)
- 配置目录:
/etc/powerdns/(主配置/etc/powerdns/pdns.conf,后端片段目录/etc/powerdns/pdns.d/) - 数据目录:
/var/lib/powerdns/(SQLite3 数据库pdns.sqlite3) - 服务单元:
pdns.service(系统级,以pdns:pdns用户运行)
二、前置条件
安装前需确认以下几点,逐项给出检查命令与预期结果:
- 拥有 root 或 sudo 权限的账号,本文统一以
sudo执行管理命令。 - 服务器可访问
repo.powerdns.com(官方 APT 源)与cn.archive.ubuntu.com(系统源):
curl -sS -o /dev/null -w "%{http_code}\n" https://repo.powerdns.com/
实测回显(HTTP 200 表示可达):
200
- 确认 53 端口占用情况。PowerDNS 默认绑定
0.0.0.0:53,若机器上已有其他 DNS 服务(systemd-resolved 的本机存根、BIND9、dnsmasq 等)将无法绑定:
ss -ltn | grep ":53 "
实测回显(本机 53 端口已被既有服务占用):
LISTEN 0 4096 127.0.0.53%lo:53 0.0.0.0:*
LISTEN 0 10 127.0.0.1:53 0.0.0.0:*
💡 说明:若 53 端口已被占用,无需卸载既有服务——把 PowerDNS 绑定到本机其他 IP 地址(回环别名如
127.0.0.2,或本机网卡上的空闲 IP)即可共存,详见 7.3 节与第八章。
- 时间同步正常(DNSSEC 签名与 SOA 序列号依赖准确时间):
timedatectl | grep -E "System clock|NTP"
实测回显:
System clock synchronized: yes
NTP service: active
三、版本选型说明
PowerDNS Authoritative Server 当前稳定版本为 5.1.4(2026-08-06 发布,来源:官方 Changelog https://doc.powerdns.com/authoritative/changelog/,查询日期 2026-10-20)。官方软件源同时维护多条版本分支,选型时按下表对号入座:
| 软件源分支 | 版本系列 | 维护状态 | 适用场景 |
|---|---|---|---|
jammy-auth-51 | 5.1.X | 稳定版(当前 5.1.4) | 新装首选,功能与修复双最新 |
jammy-auth-50 | 5.0.X | 仅关键修复 | 已部署 5.0 且暂不跨小版本升级 |
jammy-auth-49 | 4.9.X | 仅关键修复 | 存量环境延续 |
jammy-auth-48 及更早 | 4.8.X / 4.7.X / 4.6.X | 生命周期结束(EOL) | 不建议新装 |
| Ubuntu 22.04 universe 内置源 | 4.5.3 | 随发行版冻结,无版本跟进 | 完全离线/无官方源可达时的兜底 |
关键差异:官方源拿到的是 5.1.4 并持续获得安全与缺陷修复;universe 源是发行版发布时冻结的 4.5.3(2022 年版本),两者功能差异显著(如 5.x 的 Catalog Zones、Views 等特性 4.5 均不具备)。新装一律推荐方案 A(官方源)。
四、方案 A:PowerDNS 官方 APT 源在线安装(推荐)
4.1 方案说明
该方案添加 PowerDNS 官方 APT 源的 jammy-auth-51 分支,安装 Authoritative Server 5.1.4 与 SQLite3 后端包,并通过 APT Pin 让官方源优先于 universe 源。全程约 2 分钟,是官方仓库页面给出的标准步骤。
4.2 导入签名密钥并配置软件源
第一步:导入官方 GPG 签名密钥到 /etc/apt/keyrings/:
sudo install -d /etc/apt/keyrings
sudo curl -fsSL https://repo.powerdns.com/FD380FBB-pub.asc -o /etc/apt/keyrings/auth-51-pub.asc
校验密钥指纹(官方密钥 ID 为 FD380FBB):
gpg --show-keys /etc/apt/keyrings/auth-51-pub.asc
实测回显:
pub rsa4096 2015-06-09 [SC]
9FAAA5577E8FCF62093D036C1B0C6205FD380FBB
第二步:创建软件源定义文件 /etc/apt/sources.list.d/pdns.list:
echo 'deb [signed-by=/etc/apt/keyrings/auth-51-pub.asc] http://repo.powerdns.com/ubuntu jammy-auth-51 main' | sudo tee /etc/apt/sources.list.d/pdns.list
第三步:创建 APT Pin,保证 pdns-* 系列包始终优先取官方源(Pin-Priority 600 高于默认 500):
printf 'Package: pdns-*\nPin: origin repo.powerdns.com\nPin-Priority: 600\n' | sudo tee /etc/apt/preferences.d/auth-51
第四步:刷新软件源索引:
sudo apt-get update
实测回显(节选,与 PowerDNS 相关的两行):
获取:7 http://repo.powerdns.com/ubuntu jammy-auth-51 InRelease [2,549 B]
获取:9 http://repo.powerdns.com/ubuntu jammy-auth-51/main amd64 Packages [6,773 B]
4.3 安装服务端与 SQLite3 后端
先确认候选版本已切换到官方源(Pin 600 生效):
apt-cache policy pdns-server
实测回显:
pdns-server:
已安装:(无)
候选: 5.1.4-1pdns.ubuntu22.04
版本列表:
5.1.4-1pdns.ubuntu22.04 600
500 http://repo.powerdns.com/ubuntu jammy-auth-51/main amd64 Packages
4.5.3-1 500
500 http://cn.archive.ubuntu.com/ubuntu jammy/universe amd64 Packages
执行安装(服务端 + SQLite3 后端一起装;pdns-backend-bind 是包的默认推荐项会被连带装入,7.2 节说明如何按需移除):
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pdns-server pdns-backend-sqlite3
实测回显(节选):
正在解压 pdns-server (5.1.4-1pdns.ubuntu22.04) ...
正在解压 pdns-backend-sqlite3 (5.1.4-1pdns.ubuntu22.04) ...
正在设置 pdns-server (5.1.4-1pdns.ubuntu22.04) ...
Created symlink /etc/systemd/system/multi-user.target.wants/pdns.service → /lib/systemd/system/pdns.service.
正在设置 pdns-backend-sqlite3 (5.1.4-1pdns.ubuntu22.04) ...
Job for pdns.service failed because the control process exited with error code.
See "systemctl status pdns.service" and "journalctl -xeu pdns.service" for details.
invoke-rc.d: initscript pdns, action "restart" failed.
⚠️ 注意:安装结束时
Job for pdns.service failed是本机 53 端口被占用导致的首次启动失败,不影响安装本身,软件包、systemd 单元、配置文件均已就位,排障见 4.4 节与第八章。若服务器 53 端口空闲,此处会直接启动成功。
核对安装产物:
dpkg -l pdns-server pdns-backend-sqlite3 | grep "^ii"
实测回显:
ii pdns-backend-sqlite3 5.1.4-1pdns.ubuntu22.04 amd64 sqlite 3 backend for PowerDNS
ii pdns-server 5.1.4-1pdns.ubuntu22.04 amd64 extremely powerful and versatile nameserver
关键文件布局(dpkg -L pdns-server 节选):
/etc/powerdns/pdns.conf
/lib/systemd/system/pdns.service
/lib/systemd/system/pdns@.service
/usr/bin/pdns_control
/usr/bin/pdnsutil
/usr/bin/zone2json
/usr/bin/zone2sql
/usr/sbin/pdns_server
4.4 systemd 服务与首启排障(53 端口占用)
pdns.service 已随安装启用(Created symlink ... multi-user.target.wants/pdns.service)。查看单元定义核心内容:
systemctl cat pdns.service | grep -E "ExecStart|User|Group|Type|RuntimeDirectory"
实测回显:
ExecStart=/usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write-pid=no
SyslogIdentifier=pdns_server
User=pdns
Group=pdns
Type=notify
RuntimeDirectory=pdns
首启失败的完整现场(journalctl -u pdns -n 6 --no-pager):
10月 20 16:32:27 ops pdns_server[1392398]: Listening on controlsocket in '/run/pdns/pdns.controlsocket'
10月 20 16:32:27 ops pdns_server[1392398]: Unable to bind UDP socket to '0.0.0.0:53': Address already in use
10月 20 16:32:27 ops pdns_server[1392398]: Fatal error: Unable to bind to UDP socket
10月 20 16:32:27 ops systemd[1]: pdns.service: Main process exited, code=exited, status=1/FAILURE
10月 20 16:32:27 ops systemd[1]: pdns.service: Failed with result 'exit-code'.
10月 20 16:32:27 ops systemd[1]: Failed to start PowerDNS Authoritative Server.
定位:Unable to bind UDP socket to '0.0.0.0:53': Address already in use 说明既有 DNS 服务占着 53 端口。解决方案是把 PowerDNS 绑定到本机其他地址(7.3 节),配置后重启即恢复——实测修复后 systemctl is-active pdns 返回 active。
五、方案 B:Ubuntu universe 内置源安装(备用)
5.1 方案说明
不添加任何第三方源,直接安装 Ubuntu 22.04 universe 仓库自带的 pdns-server 4.5.3-1。适合无法访问官方源、或仅做功能验证的环境。缺点:版本停留在 2022 年,无后续修复跟进。
5.2 安装与默认后端
sudo DEBIAN_FRONTEND=noninteractive apt-get install -y pdns-server
实测回显(节选):
正在解压 pdns-server (4.5.3-1) ...
正在解压 pdns-backend-bind (4.5.3-1) ...
正在设置 pdns-server (4.5.3-1) ...
Created symlink /etc/systemd/system/multi-user.target.wants/pdns.service → /lib/systemd/system/pdns.service.
正在设置 pdns-backend-bind (4.5.3-1) ...
Job for pdns.service failed because the control process exited with error code.
See "systemctl status pdns.service" and "journalctl -xeu pdns.service" for details.
说明:只装 pdns-server 时,APT 会按 Recommends 关系连带装入默认后端 pdns-backend-bind(基于 BIND 格式区域文件的本地后端),并注册 pdns.service 开机自启。
版本确认:
pdns_server --version 2>/dev/null | head -3
实测回显:
PowerDNS Authoritative Server 4.5.3 (C) 2001-2021 PowerDNS.COM BV
Using 64-bits mode. Built using gcc 11.2.0.
PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
5.3 默认配置布局与 include-dir 机制
universe 包的主配置 /etc/powerdns/pdns.conf 是一份带完整注释的参数模板,每个参数以「注释说明 + 注释掉的默认值行」形式给出,只有显式赋值的行才生效。模板末尾有一行激活的 include-dir=/etc/powerdns/pdns.d,使后端包可以把自身配置片段放进 /etc/powerdns/pdns.d/:
grep -E "^include-dir" /etc/powerdns/pdns.conf
实测回显:
include-dir=/etc/powerdns/pdns.d
后端片段 pdns-backend-bind 装入后自动在 /etc/powerdns/pdns.d/bind.conf 写入 launch+=bind,即默认以 BIND 文件后端启动。
5.4 启动验证
4.5.3 同样会遇到 53 端口占用问题。将 local-address=127.0.0.2 追加到 /etc/powerdns/pdns.conf 后重启,验证:
sudo systemctl restart pdns
systemctl is-active pdns
pdns_control rping
实测回显:
active
PONG
六、方案对比与选择建议
| 维度 | 方案 A:官方 APT 源 | 方案 B:universe 内置源 |
|---|---|---|
| 实测版本 | 5.1.4-1pdns.ubuntu22.04 | 4.5.3-1 |
| 版本跟进 | 持续更新(stable 分支 + 关键修复分支) | 随 jammy 冻结,无跟进 |
| 需联网外部源 | 是(repo.powerdns.com) | 否 |
| 安装方式 | 添加源 + pin + apt install | 单条 apt install |
| 默认后端 | pdns-backend-bind(Recommends 连带) | pdns-backend-bind(Recommends 连带) |
| 新特性(Catalog Zones / Views 等) | 具备 | 不具备 |
| 适用 | 生产与长期维护 | 离线兜底、临时验证 |
选择建议:能访问 repo.powerdns.com 就选方案 A;内网完全隔离环境选方案 B 并自行承担版本老化风险;两者都依赖 APT 与 systemd,安装后均为系统级服务形态,运维方式完全一致。
七、配置说明
7.1 初始化 SQLite3 数据库
gsqlite3 后端需要预先建好表结构。先安装 sqlite3 命令行工具(若未安装),再用后端包自带的标准建库脚本初始化:
sudo apt-get install -y sqlite3
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 < /usr/share/pdns-backend-sqlite3/schema/schema.sqlite3.sql
sudo chown pdns:pdns /var/lib/powerdns/pdns.sqlite3
ls -la /var/lib/powerdns/
实测回显(建库脚本无输出即为成功):
-rw-r--r-- 1 pdns pdns 77824 10月 20 16:37 pdns.sqlite3
建库脚本包含 domains、records、domainmetadata、cryptokeys、tsigkeys 等核心表,数据库属主必须为 pdns(服务以该用户运行)。
7.2 启用 gsqlite3 后端
先移除默认连带的 bind 后端(其配置片段会让服务同时尝试加载两个后端,容易混淆):
sudo DEBIAN_FRONTEND=noninteractive apt-get remove -y pdns-backend-bind
sudo DEBIAN_FRONTEND=noninteractive dpkg --purge pdns-backend-bind
⚠️ 注意:
remove只删软件本体,/etc/powerdns/pdns.d/bind.conf属于 conffile 会残留,需要dpkg --purge pdns-backend-bind才会一并清除。实测移除后ls /etc/powerdns/pdns.d/应为空。
编辑 /etc/powerdns/pdns.conf:把模板中的空 launch= 行改为启用 gsqlite3,并在文件末尾追加数据库路径与 DNSSEC 开关:
sudo sed -i 's|^launch=$|launch=gsqlite3|' /etc/powerdns/pdns.conf
sudo tee -a /etc/powerdns/pdns.conf > /dev/null <<'EOF'
# sqlite3 backend database (created from package schema)
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
gsqlite3-dnssec=yes
EOF
逐项说明:
launch=gsqlite3:指定启动的数据库后端,替换模板中的空值行(同参数多次出现时以最后一行为准)。gsqlite3-database=/var/lib/powerdns/pdns.sqlite3:SQLite3 数据库文件绝对路径,与 7.1 节建库路径一致。gsqlite3-dnssec=yes:启用 DNSSEC 处理(表结构中的 cryptokeys 等表仅在开启后生效)。
验证配置语法并重启:
sudo pdns_server --config=check
sudo systemctl restart pdns
systemctl is-active pdns
pdns_control rping
实测回显:
active
PONG
服务启动后会立即在数据库同目录生成 SQLite WAL 伴生文件,可据此确认后端已正确连接:
ls -la /var/lib/powerdns/ | grep sqlite
实测回显:
-rw-r--r-- 1 pdns pdns 77824 10月 20 16:37 pdns.sqlite3
-rw-r--r-- 1 pdns pdns 32768 10月 20 16:37 pdns.sqlite3-shm
-rw-r--r-- 1 pdns pdns 0 10月 20 16:37 pdns.sqlite3-wal
7.3 监听地址与端口冲突规避
当 53 端口已被其他 DNS 服务占用时(见 4.4 节排障现场),为 PowerDNS 指定独立监听地址。回环网段 127.0.0.0/8 内任意未占用地址(如 127.0.0.2)无需额外配置即可使用:
sudo tee -a /etc/powerdns/pdns.conf > /dev/null <<'EOF'
# dedicated loopback address to avoid port 53 conflict with existing DNS service
local-address=127.0.0.2
EOF
sudo systemctl restart pdns
实测启动日志确认绑定成功:
10月 20 16:36:41 ops pdns_server[1396330]: UDP server bound to 127.0.0.2:53
10月 20 16:36:41 ops pdns_server[1396330]: TCP server bound to 127.0.0.2:53
10月 20 16:36:41 ops pdns_server[1396330]: PowerDNS Authoritative Server 5.1.4 (C) PowerDNS.COM BV
10月 20 16:36:41 ops pdns_server[1396330]: Polled security status of version 5.1.4 at startup, no known issues reported: OK
若需要对外网提供解析,把 local-address 设为本机网卡上的空闲 IP(如 192.0.2.53),或与 53 端口占用方各绑不同 IP 共存。
7.4 Web 监控页与 REST API
PowerDNS 内置 Web 监控页与 REST API,由同一 HTTP 端口提供服务(默认 8081)。在 /etc/powerdns/pdns.conf 末尾追加:
sudo tee -a /etc/powerdns/pdns.conf > /dev/null <<'EOF'
# webserver + REST API
webserver=yes
webserver-address=127.0.0.2
webserver-port=8081
webserver-password=q1w2e3r4
api=yes
api-key=q1w2e3r4
EOF
sudo systemctl restart pdns
逐项说明:webserver=yes 开启 HTTP 服务;webserver-address/webserver-port 与 DNS 监听同样遵循端口冲突检查;webserver-password 是监控页的 Basic Auth 口令;api=yes 开启 REST API,api-key 为 API 调用密钥(示例统一使用测试口令 q1w2e3r4,生产环境务必更换)。
监控页验证(Basic Auth,账号 admin、口令 q1w2e3r4):
curl -s -u admin:q1w2e3r4 http://127.0.0.2:8081/ | head -5
实测回显:
<!DOCTYPE html>
<html><head>
<title>PowerDNS Authoritative Server Monitor</title>
<link rel="stylesheet" href="style.css"/>
</head><body>
REST API 验证:
curl -s http://127.0.0.2:8081/api/v1/servers/localhost -H "X-API-Key: q1w2e3r4"
实测回显:
{"autoprimaries_url": "/api/v1/servers/localhost/autoprimaries{/autoprimary}", "config_url": "/api/v1/servers/localhost/config{/config_setting}", "daemon_type": "authoritative", "id": "localhost", "type": "Server", "url": "/api/v1/servers/localhost", "version": "5.1.4", "zones_url": "/api/v1/servers/localhost/zones{/zone}"}
不带密钥访问会得到 401 拒绝:
curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.2:8081/api/v1/servers/localhost/zones
实测回显:
401
7.5 创建首个区域并解析验证
用 pdnsutil 创建 example.com 区域并添加记录(完整 CLI 能力见《PowerDNS 5.1.4 常用 CLI 命令与工具详解》):
sudo pdnsutil create-zone example.com ns1.example.com
sudo pdnsutil add-record example.com www.example.com A 192.0.2.10
sudo pdnsutil add-record example.com ns1.example.com A 192.0.2.53
sudo pdnsutil add-record example.com example.com MX "10 mail.example.com"
实测回显(逐条):
Creating empty zone 'example.com'
Also adding one NS record
If the authoritative server is running, be sure to refresh its zone cache
with 'pdns_control rediscover'
New rrset:
www.example.com. 3600 IN A 192.0.2.10
New rrset:
ns1.example.com. 3600 IN A 192.0.2.53
New rrset:
example.com. 3600 IN MX 10 mail.example.com.
💡 说明:
pdnsutil add-record的记录名必须写全限定名(如www.example.com)。写相对名www会报Error: Name "www." to add is not part of zone "example.com.".,这是 5.1.x 的实测行为。
执行 pdns_control rediscover 让运行中的服务刷新区域缓存(create-zone 回显中官方明确提示了这一步),然后逐类型解析验证:
pdns_control rediscover
dig @127.0.0.2 www.example.com A +noall +answer
dig @127.0.0.2 example.com MX +noall +answer
dig @127.0.0.2 example.com SOA +noall +answer
实测回显:
Ok
www.example.com. 3600 IN A 192.0.2.10
example.com. 3600 IN MX 10 mail.example.com.
example.com. 3600 IN SOA a.misconfigured.dns.server.invalid. hostmaster.example.com. 0 10800 3600 604800 3600
负向查询验证 NXDOMAIN 响应权威性(flags: qr aa rd 中 aa 表示权威应答):
dig @127.0.0.2 nope.example.com A
实测回显(节选):
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 29131
;; flags: qr aa rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; QUESTION SECTION:
;nope.example.com. IN A
;; AUTHORITY SECTION:
example.com. 3600 IN SOA a.misconfigured.dns.server.invalid. hostmaster.example.com. 1 10800 3600 604800 3600
7.6 服务管理常用命令
sudo systemctl start pdns # 启动
sudo systemctl stop pdns # 停止
sudo systemctl restart pdns # 重启(改配置后)
sudo systemctl status pdns # 状态
sudo systemctl enable pdns # 开机自启(安装时已默认启用)
journalctl -u pdns -n 50 --no-pager # 最近 50 行日志
systemctl status pdns 实测回显(节选):
● pdns.service - PowerDNS Authoritative Server
Loaded: loaded (/lib/systemd/system/pdns.service; enabled; vendor preset: enabled)
Active: active (running) since Tue 2026-10-20 16:37:05 CST; 2min ago
Main PID: 1396584 (pdns_server)
7.7 升级、降级与版本锁定
- 升级:官方源的
jammy-auth-51分支会持续推送 5.1.X 修复版本,sudo apt-get update && sudo apt-get install --only-upgrade pdns-server pdns-backend-sqlite3即可就地升级。跨大版本(如 5.0 → 5.1)前先阅读官方 Upgrade Notes(https://doc.powerdns.com/authoritative/upgrading.html)。 - 降级:从 universe 源装回 4.5.3 时显式指定版本与源优先级:
sudo apt-get install pdns-server=4.5.3-1。若官方源 pin(Pin-Priority 600)仍存在,需临时用apt-get install pdns-server=4.5.3-1 -t jammy/universe或先移除 pin 文件。 - 版本锁定:
sudo apt-mark hold pdns-server pdns-backend-sqlite3,解除用apt-mark unhold。 - 多版本管理:同一台服务器同一时间只能运行一个 Authoritative 实例;如需并行对比版本,用第二台服务器或以
pdns@.service模板实例化第二个配置(/lib/systemd/system/pdns@.service,配合config-name参数隔离配置目录)。
八、常见问题(FAQ)
Q1:安装时报 Job for pdns.service failed ... Unable to bind UDP socket to '0.0.0.0:53': Address already in use,怎么办?
这是本机 53 端口被既有 DNS 服务占用(本机实测为 systemd-resolved 存根与其他 DNS 服务)。定位:
ss -ltnp | grep ":53 "
确认占用方后二选一:(1) 保留既有服务,按 7.3 节把 PowerDNS 绑到其他地址(实测 local-address=127.0.0.2 后 active);(2) 若确认既有服务可让出 53 端口,停用对方(例如 systemd-resolved 的本机存根可在 /etc/systemd/resolved.conf 设置 DNSStubListener=no 后 systemctl restart systemd-resolved),再 systemctl restart pdns。
Q2:日志报 gsqlite3: connection failed: ... attempt to write a readonly database?
SQLite 处于 WAL 模式,除了数据库文件本身,pdns 用户还必须能写数据库所在目录(生成 -wal/-shm 伴生文件)。实测修法:
sudo chown pdns:pdns /var/lib/powerdns
sudo chown pdns:pdns /var/lib/powerdns/pdns.sqlite3
sudo systemctl restart pdns
修复后目录内出现 pdns.sqlite3-shm 与 pdns.sqlite3-wal 即为恢复(实测回显见 7.2 节)。
Q3:pdnsutil add-record example.com www A 192.0.2.10 报 Name "www." to add is not part of zone "example.com.".?
5.1.x 的 add-record 要求记录名写全限定名。把 www 换成 www.example.com 即成功(实测两种写法的完整回显见 7.5 节与第九章引用的 CLI 篇)。
Q4:pdns_control ping / pdns_control status 报 Unknown command,是坏了吗?
不是。官方 man 页明确:ping 只在 guardian 模式下可用,非 guardian(本发行包的 systemd 单元以 --guardian=no 运行)用 rping,实测返回 PONG;status 同样依赖 guardian 模式,systemd 形态下用 pdns_control list / show 获取统计即可。
Q5:安装时 postinst 报启动失败,需要重装吗?
不需要。首次启动失败只影响服务进程,不影响包文件与配置布局;完成 7.3 节配置后 systemctl restart pdns 即可。重装反而会再次触发同样的首启失败。
九、卸载与清理
完整卸载服务端与后端,并清空配置与数据:
sudo systemctl stop pdns
sudo DEBIAN_FRONTEND=noninteractive apt-get purge -y pdns-server pdns-backend-sqlite3
实测回显(节选):
下列软件包将被【卸载】:
pdns-backend-sqlite3* pdns-server*
升级了 0 个软件包,新安装了 0 个软件包,要卸载 2 个软件包,有 205 个软件包未被升级。
解压缩后将会空出 14.3 MB 的空间。
正在卸载 pdns-backend-sqlite3 (5.1.4-1pdns.ubuntu22.04) ...
正在卸载 pdns-server (5.1.4-1pdns.ubuntu22.04) ...
正在清除 pdns-server (5.1.4-1pdns.ubuntu22.04) 的配置文件 ...
清理随包装入、现已无用的依赖:
sudo apt-get autoremove -y
实测回显(节选):
正在卸载 libboost-program-options1.74.0:amd64 (1.74.0-14ubuntu3) ...
正在卸载 libluajit-5.1-2:amd64 (2.1.0~beta3+dfsg-6ubuntu0.1) ...
正在卸载 libluajit-5.1-common (2.1.0~beta3+dfsg-6ubuntu0.1) ...
删除 SQLite 数据库与运行时残留:
sudo rm -rf /var/lib/powerdns /run/pdns
若按方案 A 配置过官方源,移除软件源三件套(源定义、pin、密钥)并刷新索引:
sudo rm -f /etc/apt/sources.list.d/pdns.list /etc/apt/preferences.d/auth-51 /etc/apt/keyrings/auth-51-pub.asc
sudo apt-get update
最终验证(均无输出即卸载干净):
dpkg -l | grep pdns
which pdns_server pdns_control pdnsutil
ls /etc/powerdns /var/lib/powerdns
十、参考链接
- PowerDNS 官方软件源与发行版配置说明:https://repo.powerdns.com/
- Authoritative Server 官方文档主页:https://doc.powerdns.com/authoritative/
- 5.1 版本 Changelog(5.1.4 发布于 2026-08-06):https://doc.powerdns.com/authoritative/changelog/5.1.html
- 官方升级注意事项:https://doc.powerdns.com/authoritative/upgrading.html
- gsqlite3 后端官方文档:https://doc.powerdns.com/authoritative/backends/generic-sqlite3.html
- 同系列文档:《PowerDNS 5.1.4 配置参数详解》(参数逐项解读)、《PowerDNS 5.1.4 常用 CLI 命令与工具详解》(pdns_control/pdnsutil/zone2sql 实测)、《PowerDNS 5.1.4 介绍与选型指南》(架构与同类对比)