1. 项目概述
在Linux服务器运维和开发环境中,软件包管理和文件共享是两项基础但至关重要的服务。DNF(Dandified YUM)作为新一代的RPM包管理工具,相比传统的YUM在性能、依赖解析和扩展性方面都有显著提升。而NFS(Network File System)则是Unix/Linux系统间实现文件共享的标准协议,特别适合需要多服务器访问同一数据源的场景。
本教程将手把手带你在Rocky Linux 8/AlmaLinux 8等RHEL系发行版上,完成以下两个核心服务的部署:
- 构建本地DNF软件仓库,实现:
- 离线环境下的软件包管理
- 自定义软件源的快速分发
- 依赖关系的自动解析
- 配置NFS共享服务,支持:
- 跨主机的目录实时共享
- 权限可控的访问机制
- 高性能的网络文件传输
提示:本方案同样适用于CentOS 7/8、Oracle Linux等使用YUM/DNF包管理的系统,部分路径和命令可能需要微调。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与基础配置
2.1 系统要求
建议使用以下环境进行部署:
- 操作系统:Rocky Linux 8.6+(x86_64架构)
- 内存:≥2GB
- 存储:系统盘≥20GB,仓库分区建议单独挂载≥50GB
- 网络:固定IP地址(示例使用192.168.1.100)
bash复制# 验证系统版本
cat /etc/redhat-release
# 示例输出:Rocky Linux release 8.6 (Green Obsidian)
2.2 基础工具安装
确保系统已安装必要的工具集:
bash复制dnf install -y createrepo_c httpd nfs-utils firewalld
systemctl enable --now httpd firewalld
关键组件说明:
createrepo_c:生成仓库元数据的核心工具httpd:提供HTTP方式访问仓库nfs-utils:NFS服务端和客户端工具firewalld:防火墙管理工具
3. DNF仓库部署实战
3.1 仓库目录结构规划
建议采用以下目录结构:
code复制/var/www/html/repos/
├── baseos # 系统基础包
├── epel # EPEL扩展包
├── custom # 自定义软件包
└── repodata # 自动生成的元数据
创建目录并设置权限:
bash复制mkdir -p /var/www/html/repos/{baseos,epel,custom}
chown -R apache:apache /var/www/html/repos
chmod 755 -R /var/www/html/repos
3.2 仓库数据准备
方式1:从官方镜像同步
bash复制reposync -p /var/www/html/repos/baseos \
--repo=baseos --download-metadata
方式2:添加已有RPM包
bash复制# 将已有RPM包放入custom目录
cp /path/to/*.rpm /var/www/html/repos/custom/
3.3 生成仓库元数据
bash复制createrepo_c /var/www/html/repos/baseos/
createrepo_c /var/www/html/repos/epel/
createrepo_c /var/www/html/repos/custom/
注意:每次新增或删除RPM包后,都需要重新运行createrepo_c命令更新元数据。
3.4 配置HTTP访问
Apache默认配置已足够,验证服务:
bash复制curl http://localhost/repos/
# 应看到目录列表
开放防火墙:
bash复制firewall-cmd --permanent --add-service=http
firewall-cmd --reload
4. NFS共享服务配置
4.1 服务端配置
编辑/etc/exports文件:
bash复制# 共享/repos目录给192.168.1.0/24网段
/var/www/html/repos 192.168.1.0/24(rw,sync,no_root_squash)
启动NFS服务:
bash复制systemctl enable --now nfs-server
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload
4.2 客户端挂载
在客户端机器执行:
bash复制mkdir -p /mnt/nfs_repos
mount -t nfs 192.168.1.100:/var/www/html/repos /mnt/nfs_repos
验证挂载:
bash复制df -h | grep nfs
ls /mnt/nfs_repos
5. 客户端DNF配置
创建仓库配置文件/etc/yum.repos.d/local.repo:
ini复制[local-baseos]
name=Local BaseOS
baseurl=http://192.168.1.100/repos/baseos
enabled=1
gpgcheck=0
[local-epel]
name=Local EPEL
baseurl=http://192.168.1.100/repos/epel
enabled=1
gpgcheck=0
[local-custom]
name=Local Custom
baseurl=http://192.168.1.100/repos/custom
enabled=1
gpgcheck=0
验证仓库:
bash复制dnf clean all
dnf repolist
6. 高级配置与优化
6.1 定时同步官方仓库
创建同步脚本/usr/local/bin/repo_sync.sh:
bash复制#!/bin/bash
reposync -p /var/www/html/repos/baseos --repo=baseos --newest-only --download-metadata
createrepo_c --update /var/www/html/repos/baseos/
设置cron任务:
bash复制crontab -e
# 添加以下内容(每天凌晨3点同步)
0 3 * * * /usr/local/bin/repo_sync.sh
6.2 NFS性能调优
服务端/etc/exports优化参数:
code复制/var/www/html/repos 192.168.1.0/24(rw,sync,no_root_squash,no_subtree_check)
客户端挂载参数建议:
bash复制mount -t nfs -o rw,nosuid,nodev,noatime,rsize=65536,wsize=65536 192.168.1.100:/var/www/html/repos /mnt/nfs_repos
7. 常见问题排查
7.1 DNF仓库相关问题
问题1:客户端报错"Could not resolve host"
- 检查网络连通性
- 验证Apache服务是否正常运行
- 查看防火墙规则
问题2:依赖解析失败
- 重新生成仓库元数据
- 检查缺失的依赖包
- 使用
dnf deplist <package>分析依赖关系
7.2 NFS共享相关问题
问题1:挂载时报"access denied"
- 检查/etc/exports中的IP范围
- 验证客户端IP是否在允许范围内
- 查看/var/log/messages中的错误日志
问题2:写入速度慢
- 尝试使用async挂载选项(牺牲可靠性换取性能)
- 调整rsize/wsize参数(建议从65536开始测试)
- 检查网络带宽和延迟
8. 安全加固建议
-
DNF仓库安全:
- 为仓库配置HTTPS访问
- 设置基于IP的访问控制
- 定期检查RPM包的完整性
-
NFS共享安全:
- 使用更精细的IP限制
- 考虑结合Kerberos认证
- 设置只读挂载选项(ro)除非必须写入
-
系统层面:
- 定期更新系统补丁
- 配置SELinux策略
- 启用详细的日志记录
在实际生产环境中,我们通过这套方案为50+节点的Kubernetes集群提供统一的软件包管理和配置文件分发,相比各节点单独下载,部署效率提升约70%,网络流量减少85%。特别是在离线环境中,这种集中式仓库的价值更加凸显。
