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 上搭建一个功能完整的软件同步源。主要要点回顾:
- pkg-mirror 适合完整镜像,配置简单
- rsync 适合增量同步,速度快
- Nginx 提供高效的 HTTP 服务
- 定时任务 保证仓库持续更新
- 防火墙 确保内网访问安全
搭建完成后,内网所有 FreeBSD 服务器都可以从本地源高速安装和更新软件包,大大提升运维效率。
延伸阅读
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END











暂无评论内容