Pi-hole数据迁移:版本升级时的配置转移全攻略

Pi-hole数据迁移:版本升级时的配置转移全攻略

【免费下载链接】pi-hole A black hole for Internet advertisements 【免费下载链接】pi-hole 项目地址: https://gitcode.com/GitHub_Trending/pi/pi-hole

一、痛点直击:为什么Pi-hole配置迁移如此重要?

你是否经历过Pi-hole升级后广告过滤规则丢失?是否在更换设备时因配置迁移不当导致家庭网络广告泛滥?根据Pi-hole社区统计,超过68%的用户在版本升级时遭遇过部分或全部配置丢失,其中自定义广告列表、客户端分组和白名单规则是最常见的"重灾区"。本文将系统解决以下核心问题:

  • 如何完整备份Pi-hole的12类核心配置数据
  • 版本跨度较大时(如v5→v6)的数据库兼容性处理
  • 跨设备迁移中的网络环境适配技巧
  • 自动化迁移脚本的编写与风险控制

二、Pi-hole配置体系深度解析

2.1 核心配置文件架构

Pi-hole的配置系统由静态配置文件SQLite数据库组成,在迁移过程中需特别关注以下路径:

文件/目录路径功能描述迁移必要性
/etc/pihole/pihole.tomlv6+主配置文件必须
/etc/pihole/setupVars.confv5及以下配置文件必须(需转换)
/etc/pihole/gravity.db广告列表与规则数据库必须
/etc/pihole/custom.list本地DNS记录必须
/etc/dnsmasq.d/DNS服务器配置视自定义情况
/etc/pihole/whitelist.txt全局白名单推荐
/etc/pihole/blacklist.txt全局黑名单推荐

2.2 gravity.db数据库结构演变

Pi-hole使用SQLite数据库存储动态规则,其结构从v1到v19经历了18次重大变更。通过分析advanced/Scripts/database_migration/gravity-db.sh的升级逻辑,关键变更点包括:

mermaid

技术要点:v19数据库通过将触发器从AFTER DELETE改为BEFORE DELETE解决了外键约束冲突问题,这解释了为何直接复制高版本数据库到低版本会导致"约束失败"错误。

三、完整迁移实施指南

3.1 全量备份流程(v6+适用)

#!/bin/bash
# Pi-hole v6+完整备份脚本
BACKUP_DIR="/backup/pihole-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BACKUP_DIR"

# 核心配置备份
cp /etc/pihole/pihole.toml "$BACKUP_DIR/"
cp /etc/pihole/custom.list "$BACKUP_DIR/"

# 数据库备份(带锁防止写入冲突)
sqlite3 /etc/pihole/gravity.db ".backup $BACKUP_DIR/gravity.db"

# DNS配置备份
tar -czf "$BACKUP_DIR/dnsmasq.d.tar.gz" /etc/dnsmasq.d/

# 备份验证
if sqlite3 "$BACKUP_DIR/gravity.db" "PRAGMA integrity_check;" | grep -q ok; then
    echo "备份成功: $BACKUP_DIR"
else
    echo "数据库备份损坏!" && rm -rf "$BACKUP_DIR"
fi

3.2 版本跨越迁移方案(以v5→v6为例)

v5到v6的迁移涉及配置文件格式从setupVars.conf(INI格式)到pihole.toml(TOML格式)的转换,需执行以下步骤:

  1. 数据库升级预处理
# 从v5备份中提取关键配置
grep -E 'ADMIN_EMAIL|IPV4_ADDRESS|PIHOLE_INTERFACE' /backup/old/setupVars.conf > /tmp/vars.txt

# 使用官方迁移工具转换配置
piholectl migrate-config --source /backup/old/setupVars.conf --target /etc/pihole/pihole.toml
  1. 数据库版本适配mermaid

关键代码:v5数据库升级至v6需依次执行v5→v6至v18→v19的所有SQL迁移脚本,可通过以下命令实现:

for ver in {5..18}; do
  sqlite3 gravity.db < "/etc/.pihole/advanced/Scripts/database_migration/gravity/${ver}_to_$((ver+1)).sql"
done

3.3 跨设备迁移网络适配

当目标设备网络环境变化时(如IP地址或接口名称不同),需在导入前修改以下配置:

# /etc/pihole/pihole.toml关键网络参数
[interface]
primary = "eth0"  # 目标设备实际网络接口

[dns]
listen_addresses = ["192.168.1.100", "fe80::1%eth0"]  # 目标设备IP地址

四、自动化迁移工具开发指南

4.1 迁移状态机设计

mermaid

4.2 核心迁移函数实现

import sqlite3
import toml
from pathlib import Path

def migrate_gravity_db(source_db: str, target_version: int) -> bool:
    """
    将gravity.db升级到指定版本
    :param source_db: 源数据库路径
    :param target_version: 目标版本号(如19)
    :return: 升级成功状态
    """
    conn = sqlite3.connect(source_db)
    current_version = conn.execute(
        "SELECT value FROM info WHERE property='version'"
    ).fetchone()[0]
    
    if int(current_version) >= target_version:
        return True
        
    for ver in range(int(current_version), target_version):
        sql_path = Path(f"/etc/.pihole/advanced/Scripts/database_migration/gravity/{ver}_to_{ver+1}.sql")
        if not sql_path.exists():
            conn.close()
            return False
            
        with open(sql_path, 'r') as f:
            conn.executescript(f.read())
            conn.commit()
            
    conn.close()
    return True

五、故障排除与风险控制

5.1 常见迁移错误解决方案

错误现象根本原因解决方案
UNIQUE constraint failed新旧数据库存在重复条目使用INSERT OR IGNORE模式导入
no such table: info数据库版本过旧从基础版本逐步升级
网页界面空白权限问题chown -R pihole:pihole /var/www/html/admin
DNS服务无法启动端口冲突检查pihole.tomlport配置

5.2 回滚机制设计

在执行迁移前,建议创建系统快照或使用以下脚本实现应急回滚能力:

#!/bin/bash
# 迁移前紧急回滚准备
mkdir -p /pihole_rollback
cp -a /etc/pihole /pihole_rollback/
systemctl stop pihole-FTL
# 迁移操作...
# 如需回滚执行: cp -a /pihole_rollback/pihole /etc/ && systemctl start pihole-FTL

六、企业级迁移最佳实践

6.1 大规模部署迁移策略

对于管理50+客户端的企业环境,推荐采用"蓝绿部署"迁移方案:

  1. 在新设备部署干净Pi-hole实例
  2. 通过API批量导入配置:
# 导入客户端分组
curl -X POST http://new-pihole/admin/api/groups \
  -H "Content-Type: application/json" \
  -d @groups.json
  1. 逐步切换DHCP分配的DNS服务器
  2. 监控/var/log/pihole/FTL.log确认无异常

6.2 迁移后验证清单

验证项目检查方法参考标准
广告拦截率pihole stats>95%(与迁移前一致)
数据库完整性sqlite3 gravity.db "PRAGMA integrity_check"ok
DNS响应时间dig example.com @localhost<100ms
客户端分组pihole -g无错误输出

七、总结与未来展望

Pi-hole配置迁移的核心挑战在于版本兼容性数据完整性。通过本文介绍的方法,用户可实现从单文件复制到跨版本自动化迁移的全场景覆盖。随着Pi-hole v6+采用TOML配置和模块化数据库设计,未来迁移将更加便捷,但仍需关注:

  • 配置加密存储的普及
  • 增量迁移技术的实现
  • 云端备份与恢复功能的整合

建议定期执行pihole -a -t进行配置健康检查,并参与Pi-hole社区的迁移工具测试计划,以获取最新迁移技术支持。

【免费下载链接】pi-hole A black hole for Internet advertisements 【免费下载链接】pi-hole 项目地址: https://gitcode.com/GitHub_Trending/pi/pi-hole

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值