FreeBSD 15 搭建软件同步源完整教程

FreeBSD 15 搭建软件同步源完整教程

前言

在企业内网或实验室环境中,多台 FreeBSD 服务器需要安装和更新软件包时,如果每台都从外网下载,不仅速度慢,还浪费带宽。搭建一个本地软件同步源(镜像站),可以让所有内网服务器从本地高速获取软件包,同时还能控制软件版本、提高安全性。

本教程将详细介绍如何在 FreeBSD 15 上搭建一个完整的软件同步源,包括官方仓库和第三方仓库的同步。

环境说明

  • 操作系统:FreeBSD 15.0(代号:Cobalt)
  • 同步方式pkg-mirror(适合完整镜像) / rsync(适合增量同步)
  • Web 服务:Nginx
  • 存储空间:建议至少 200GB(完整镜像需要 500GB+)

方案选择

方案 适用场景 优点 缺点
pkg-mirror 完整镜像 配置简单,自动化程度高 占用空间大,定制性较差
rsync 增量同步 速度快,节省空间 需要手动维护索引文件

本教程以 pkg-mirror 方案为主。

第一步:安装必要软件包

# 更新软件包列表
pkg update

# 安装 pkg-mirror 和相关工具
pkg install -y pkg-mirror nginx

# pkg-mirror 用于同步软件源
# nginx 用于对外提供 HTTP 服务

第二步:配置 pkg-mirror

编辑 pkg-mirror 配置文件

# 编辑 pkg-mirror 配置文件
vim /usr/local/etc/pkg-mirror.conf

配置内容

# pkg-mirror 配置文件示例
# 镜像根目录
base_dir=/usr/local/pkgs

# 同步的仓库
# FreeBSD 官方仓库 - 每季度更新
repo {
    name=FreeBSD-Quarterly
    url=http://pkg.freebsd.org/FreeBSD:14:amd64/latest
    baseurl=http://repo.yourdomain.com/FreeBSD:14:amd64/latest
    mirror_dir=FreeBSD:14:amd64/latest
    prefix=FreeBSD:14:amd64/latest
}

# FreeBSD 官方仓库 - 稳定版
repo {
    name=FreeBSD-Stable
    url=http://pkg.freebsd.org/FreeBSD:15:amd64/latest
    baseurl=http://repo.yourdomain.com/FreeBSD:15:amd64/latest
    mirror_dir=FreeBSD:15:amd64/latest
    prefix=FreeBSD:15:amd64/latest
}

# FreeBSD 官方仓库 - 13.x
repo {
    name=FreeBSD-13
    url=http://pkg.freebsd.org/FreeBSD:13:amd64/latest
    baseurl=http://repo.yourdomain.com/FreeBSD:13:amd64/latest
    mirror_dir=FreeBSD:13:amd64/latest
    prefix=FreeBSD:13:amd64/latest
}

# FreeBSD 官方仓库 - 12.x
repo {
    name=FreeBSD-12
    url=http://pkg.freebsd.org/FreeBSD:12:amd64/latest
    baseurl=http://repo.yourdomain.com/FreeBSD:12:amd64/latest
    mirror_dir=FreeBSD:12:amd64/latest
    prefix=FreeBSD:12:amd64/latest
}

# Aliyun 镜像源(国内速度快)
# repo {
#     name=FreeBSD-Aliyun
#     url=http://mirrors.aliyun.com/freebsd/pkg/FreeBSD:14:amd64/latest
#     baseurl=http://repo.yourdomain.com/FreeBSD:14:amd64/latest
#     mirror_dir=FreeBSD:14:amd64/latest
#     prefix=FreeBSD:14:amd64/latest
# }

配置说明

  • base_dir:镜像根目录
  • name:仓库名称
  • url:上游镜像源地址
  • baseurl:本地镜像地址(供客户端访问)
  • mirror_dir:本地镜像目录
  • prefix:URL 前缀

第三步:开始同步

首次同步

# 执行同步(首次同步时间较长,可能需要数小时)
pkg-mirror -v

同步过程会:
1. 连接上游镜像源
2. 下载 packagesite.txz
3. 下载 INDEX 文件
4. 下载所有软件包文件

同步过程监控

# 监控下载进度
watch -n 5 'du -sh /usr/local/pkgs'

# 查看同步日志
tail -f /var/log/pkg-mirror.log

同步完成后

# 验证同步结果
ls -lh /usr/local/pkgs/FreeBSD:14:amd64/latest/

第四步:配置 Nginx 对外提供服务

安装和启动 Nginx

# 启动 Nginx 并设置开机自启
sysrc nginx_enable=YES
service nginx start

配置 Nginx 虚拟主机

创建配置文件 /usr/local/etc/nginx/conf.d/pkgs.conf

server {
    listen       80;
    server_name  repo.yourdomain.com;

    # 仓库根目录
    root /usr/local/pkgs;

    # 开启目录浏览
    autoindex on;
    autoindex_exact_size off;
    autoindex_localtime on;

    # 访问日志
    access_log  /var/log/nginx/pkgs-access.log;
    error_log   /var/log/nginx/pkgs-error.log;

    # 对 .txz 文件启用缓存
    location ~* \.txz$ {
        expires 30d;
        add_header Cache-Control "public, immutable";
    }

    # 对 INDEX 文件启用缓存
    location ~* \.INDEX$ {
        expires 30d;
        add_header Cache-Control "public";
    }

    # 允许所有内网访问
    location / {
        allow 192.168.0.0/16;
        allow 10.0.0.0/8;
        allow 172.16.0.0/12;
        deny all;
    }
}

重载 Nginx 配置:

# 检查配置语法
nginx -t

# 重载配置
service nginx reload

防火墙配置

# 开放 HTTP 端口
pfctl -f /etc/pf.conf

编辑 /etc/pf.conf 添加:

# 允许内网访问镜像源
pass in inet proto tcp from 192.168.0.0/16 to any port 80
pass in inet proto tcp from 10.0.0.0/8 to any port 80
pass in inet proto tcp from 172.16.0.0/12 to any port 80

# 允许内网访问镜像源
pass in inet proto tcp from 192.168.0.0/16 to any port 443
pass in inet proto tcp from 10.0.0.0/8 to any port 443
pass in inet proto tcp from 172.16.0.0/12 to any port 443

第五步:客户端配置

在内网其他 FreeBSD 服务器上,编辑 /etc/pkg/FreeBSD.conf

# 备份原配置
cp /etc/pkg/FreeBSD.conf /etc/pkg/FreeBSD.conf.backup

# 编辑配置文件
vim /etc/pkg/FreeBSD.conf

配置内容

# FreeBSD 软件源配置文件
# 镜像服务器地址
FreeBSD:14:amd64 {
    url: "http://repo.yourdomain.com/FreeBSD:14:amd64/latest",
    mirror_type: "srv",
    enabled: yes
}

FreeBSD:15:amd64 {
    url: "http://repo.yourdomain.com/FreeBSD:15:amd64/latest",
    mirror_type: "srv",
    enabled: yes
}

FreeBSD:13:amd64 {
    url: "http://repo.yourdomain.com/FreeBSD:13:amd64/latest",
    mirror_type: "srv",
    enabled: yes
}

FreeBSD:12:amd64 {
    url: "http://repo.yourdomain.com/FreeBSD:12:amd64/latest",
    mirror_type: "srv",
    enabled: yes
}

# 或者使用 Aliyun 镜像
# FreeBSD:14:amd64 {
#     url: "http://mirrors.aliyun.com/freebsd/pkg/FreeBSD:14:amd64/latest",
#     mirror_type: "srv",
#     enabled: yes
# }

# 或者使用 163 镜像
# FreeBSD:14:amd64 {
#     url: "http://mirrors.163.com/freebsd/pkg/FreeBSD:14:amd64/latest",
#     mirror_type: "srv",
#     enabled: yes
# }

更新软件包列表

# 更新软件包列表
pkg update

# 验证源是否生效
pkg update

测试安装

# 安装一个常用软件测试
pkg install -y vim

第六步:使用 rsync 增量同步(可选)

如果需要更灵活的同步方式,可以使用 rsync

安装 rsync

pkg install -y rsync

同步软件包

# 同步 packagesite.txz
rsync -avzP --delete \
  rsync://pkg.freebsd.org/FreeBSD:14:amd64/latest/ \
  /usr/local/pkgs/FreeBSD:14:amd64/latest/

# 同步 INDEX 文件
rsync -avzP --delete \
  rsync://pkg.freebsd.org/FreeBSD:14:amd64/latest/ \
  /usr/local/pkgs/FreeBSD:14:amd64/latest/

生成索引文件

# 进入仓库目录
cd /usr/local/pkgs/FreeBSD:14:amd64/latest

# 创建 packagesite.txz
pkg-mirror -c FreeBSD:14:amd64

# 更新 INDEX
pkg set -A 0 -a
pkg fetch -y -r . -a
pkg create -r . -a

第七步:配置定时同步

使用 cron 设置定时同步任务:

# 编辑 crontab
crontab -e

添加以下内容:

# 每天凌晨 3 点同步
0 3 * * * /usr/local/bin/pkg-mirror >> /var/log/pkg-mirror.log 2>&1

同步脚本优化

创建 /usr/local/bin/pkg-mirror-sync.sh

#!/bin/sh
#
# FreeBSD 软件源自动同步脚本
#

set -e

LOG_FILE="/var/log/pkg-mirror-sync.log"
REPO_BASE="/usr/local/pkgs"

log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

log "========== 开始同步任务 =========="

# 执行同步
log "执行 pkg-mirror 同步..."
/usr/local/bin/pkg-mirror -v

log "========== 同步任务结束 =========="

设置脚本权限:

chmod +x /usr/local/bin/pkg-mirror-sync.sh

第八步:监控与维护

检查磁盘空间

# 查看仓库占用空间
du -sh /usr/local/pkgs/*

# 设置磁盘告警
df -h /usr/local/pkgs

查看同步日志

tail -f /var/log/pkg-mirror-sync.log

查看客户端访问统计

# 查看最近访问的客户端 IP
awk '{print $1}' /var/log/nginx/pkgs-access.log | sort | uniq -c | sort -rn | head -10

# 查看最常请求的 .txz 文件
awk '{print $7}' /var/log/nginx/pkgs-access.log | grep '\.txz$' | sort | uniq -c | sort -rn | head -10

更新软件包列表

# 在客户端执行
pkg update

检查源配置

# 检查源是否可访问
curl http://repo.yourdomain.com/FreeBSD:14:amd64/latest/packagesite.txz

清理旧版本

# 清理过期的软件包
pkg-autoremove

# 清理缓存
pkg clean

第九步:常见问题与排错

Q1:pkg-mirror 同步失败

# 检查网络连接
ping pkg.freebsd.org

# 检查 pkg-mirror 配置文件
cat /usr/local/etc/pkg-mirror.conf

# 手动执行 pkg-mirror 查看错误信息
pkg-mirror -v

Q2:客户端提示 “Repository not found”

# 检查 FreeBSD.conf 配置
cat /etc/pkg/FreeBSD.conf

# 确认源地址正确
curl http://repo.yourdomain.com/FreeBSD:14:amd64/latest/

# 更新软件包列表
pkg update

Q3:软件包安装失败

# 清理缓存
pkg clean

# 重建软件包数据库
pkg update -f

# 重新尝试安装
pkg install -y <package-name>

Q4:同步速度太慢

# 方案一:使用国内镜像源
# 修改 /usr/local/etc/pkg-mirror.conf,将 pkg.freebsd.org 替换为 mirrors.aliyun.com

# 方案二:调整并发数
# 在 pkg-mirror 配置中添加
max_parallel=20

Q5:防火墙阻止访问

# 检查防火墙规则
pfctl -s rules

# 确保已添加内网访问规则
pfctl -f /etc/pf.conf

第十步:高级配置

配置 HTTPS(可选)

# 安装 Certbot
pkg install -y py39-certbot

# 获取 SSL 证书
certbot certonly --nginx -d repo.yourdomain.com

# 生成私钥和证书
cat /usr/local/etc/letsencrypt/live/repo.yourdomain.com/fullchain.pem \
  /usr/local/etc/letsencrypt/live/repo.yourdomain.com/privkey.pem \
  > /usr/local/etc/ssl/private/pkgs.pem

# 编辑 Nginx 配置

添加第三方仓库

# 添加 Docker 仓库
repo {
    name=Docker
    url=http://repo.yourdomain.com/docker/latest
    baseurl=http://repo.yourdomain.com/docker/latest
    mirror_dir=docker/latest
    prefix=docker/latest
}

配置多架构支持

# 同步 arm64 架构
repo {
    name=FreeBSD:14:arm64
    url=http://pkg.freebsd.org/FreeBSD:14:arm64/latest
    baseurl=http://repo.yourdomain.com/FreeBSD:14:arm64/latest
    mirror_dir=FreeBSD:14:arm64/latest
    prefix=FreeBSD:14:arm64/latest
}

总结

通过本教程,你已经可以在 FreeBSD 15 上搭建一个功能完整的软件同步源。主要要点回顾:

  1. pkg-mirror 适合完整镜像,配置简单
  2. rsync 适合增量同步,速度快
  3. Nginx 提供高效的 HTTP 服务
  4. 定时任务 保证仓库持续更新
  5. 防火墙 确保内网访问安全

搭建完成后,内网所有 FreeBSD 服务器都可以从本地源高速安装和更新软件包,大大提升运维效率。

延伸阅读

© 版权声明
THE END
喜欢就支持一下吧
点赞10分享
评论 抢沙发

请登录后发表评论

    暂无评论内容