Linux下DNF本地仓库与NFS共享服务配置指南
📅 2026/7/25 8:01:09
👁️ 阅读次数
📝 编程学习
1. 项目背景与核心价值
在Linux系统运维工作中,软件包管理和文件共享是两个高频需求场景。DNF作为新一代RPM包管理工具,相比传统的YUM在性能、依赖解析和内存占用方面都有显著提升。而NFS(Network File System)作为Unix/Linux生态中最成熟的文件共享方案,至今仍是跨服务器文件共享的首选方案之一。
这个实操指南将手把手带你完成两个关键任务:
- 配置本地DNF仓库,解决内网环境下的软件包管理难题
- 部署NFS共享服务,实现跨主机的文件系统共享
特别说明:本文基于CentOS 8/RHEL 8+环境验证,但核心方法同样适用于其他RPM系发行版。所有操作均需root权限执行。
2. 本地DNF仓库配置全流程
2.1 基础环境准备
首先确认系统已安装createrepo工具包:
dnf install -y createrepo准备仓库存储目录(建议使用独立分区):
mkdir -p /var/repo/local chmod -R 755 /var/repo/local2.2 仓库数据收集与处理
获取软件包的三种典型方式:
- 从官方镜像站下载完整仓库:
rsync -avz --delete rsync://mirror.example.com/centos/8/BaseOS/x86_64/os/Packages/ /var/repo/local/- 从已安装系统提取RPM包:
rpm -qa | xargs rpm -ql | grep '\.rpm$' | xargs -I {} cp {} /var/repo/local/- 手动下载特定软件包:
dnf download --destdir=/var/repo/local/ httpd nginx创建仓库元数据:
createrepo -v /var/repo/local/2.3 仓库配置文件详解
创建仓库定义文件:
cat > /etc/yum.repos.d/local.repo <<EOF [local] name=Local Repository baseurl=file:///var/repo/local enabled=1 gpgcheck=0 priority=1 EOF关键参数说明:
priority=1:设置最高优先级,优先从本地仓库查找gpgcheck=0:禁用GPG验证(生产环境建议开启)baseurl支持http/ftp协议实现网络共享
2.4 仓库维护与更新
定期同步脚本示例:
#!/bin/bash REPO_DIR="/var/repo/local" LOG_FILE="/var/log/repo_sync.log" rsync -avz --delete rsync://mirror.example.com/centos/8/BaseOS/x86_64/os/Packages/ $REPO_DIR >> $LOG_FILE 2>&1 createrepo --update $REPO_DIR >> $LOG_FILE 2>&1设置cron定时任务:
0 3 * * * /usr/local/bin/repo_sync.sh3. NFS服务部署实战
3.1 服务端配置
安装必要软件包:
dnf install -y nfs-utils创建共享目录并设置权限:
mkdir -p /shared/data chown nobody:nobody /shared/data chmod 1777 /shared/data # 粘滞位防止用户删除他人文件配置exports文件:
cat > /etc/exports <<EOF /shared/data 192.168.1.0/24(rw,sync,no_root_squash) EOF参数说明:
rw:读写权限sync:同步写入no_root_squash:允许root用户保持权限
启动服务:
systemctl enable --now nfs-server firewall-cmd --permanent --add-service=nfs firewall-cmd --reload3.2 客户端配置
安装客户端工具:
dnf install -y nfs-utils创建挂载点:
mkdir -p /mnt/nfs/data手动挂载测试:
mount -t nfs 192.168.1.100:/shared/data /mnt/nfs/data配置fstab实现开机挂载:
echo "192.168.1.100:/shared/data /mnt/nfs/data nfs defaults,_netdev 0 0" >> /etc/fstab重要提示:
_netdev选项确保网络就绪后再挂载
4. 性能调优与问题排查
4.1 NFS性能优化参数
服务端调整:
echo "RPCNFSDCOUNT=16" >> /etc/sysconfig/nfs systemctl restart nfs-server客户端挂载参数优化:
mount -t nfs -o rsize=65536,wsize=65536,hard,intr,noatime,nodiratime 192.168.1.100:/shared/data /mnt/nfs/data推荐参数组合:
| 参数 | 说明 | 推荐值 |
|---|---|---|
| rsize/wsize | 读写缓冲区大小 | 65536 |
| hard | 保持重试直到成功 | 必选 |
| intr | 允许中断挂起的IO | 必选 |
| noatime | 不更新访问时间 | 推荐 |
| nodiratime | 不更新目录访问时间 | 推荐 |
4.2 常见问题排查指南
问题1:DNF无法找到本地仓库包
- 检查仓库元数据是否生成:
ls /var/repo/local/repodata/ - 验证仓库配置优先级:
dnf repolist -v
问题2:NFS挂载失败
- 检查服务状态:
rpcinfo -p 192.168.1.100 - 验证导出列表:
showmount -e 192.168.1.100 - 排查防火墙规则:
firewall-cmd --list-all
问题3:NFS写入性能差
- 检查网络延迟:
ping -c 5 192.168.1.100 - 测试磁盘IO:
fio --filename=/mnt/nfs/data/test --size=1G --direct=1 --rw=randrw --bs=4k --ioengine=libaio --iodepth=256 --runtime=120 --numjobs=4 --time_based --group_reporting --name=iops-test-job --eta-newline=1
5. 安全加固建议
5.1 DNF仓库安全
- 启用GPG签名验证:
gpg --gen-key gpg --export -a > RPM-GPG-KEY-local rpm --import RPM-GPG-KEY-local- 在repo配置中启用检查:
gpgcheck=1 gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-local5.2 NFS安全加固
- 限制访问范围:
# /etc/exports /shared/data 192.168.1.50(rw) 192.168.1.51(ro)- 启用NFSv4加密:
# 服务端 echo "SECURE_NFS=yes" >> /etc/sysconfig/nfs # 客户端 mount -t nfs4 -o sec=krb5p server:/share /mnt- 使用防火墙限制:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="nfs" accept'6. 扩展应用场景
6.1 自动化部署集成
将DNF仓库与CI/CD流水线集成:
# Jenkins Pipeline示例 stage('Build RPM') { sh 'rpmbuild -ba specfile.spec' sh 'cp ~/rpmbuild/RPMS/x86_64/*.rpm /var/repo/local/' sh 'createrepo --update /var/repo/local/' }6.2 多节点NFS集群
使用DRBD+Heartbeat实现高可用NFS:
- 在两台服务器上安装DRBD:
dnf install -y drbd kmod-drbd- 配置资源文件:
resource r0 { protocol C; disk /dev/sdb1; meta-disk internal; on node1 { address 192.168.1.101:7788; } on node2 { address 192.168.1.102:7788; } }- 配置Heartbeat浮动IP:
# /etc/ha.d/haresources node1 IPaddr::192.168.1.100/24/eth0 nfs-kernel-server7. 监控与维护
7.1 DNF仓库监控
设置仓库健康检查脚本:
#!/bin/bash REPO_URL="file:///var/repo/local" STATUS=$(curl -sI $REPO_URL/repodata/repomd.xml | head -n1 | cut -d' ' -f2) if [ "$STATUS" != "200" ]; then logger -t DNF_REPO "Repository check failed, regenerating metadata" createrepo --update /var/repo/local/ fi7.2 NFS性能监控
使用nfsstat工具:
nfsstat -c # 客户端统计 nfsstat -s # 服务端统计配置Prometheus监控:
# prometheus.yml scrape_configs: - job_name: 'nfs' static_configs: - targets: ['192.168.1.100:9100']8. 实际应用中的经验分享
批量安装时的仓库优化: 在同时有大量主机需要从本地仓库安装软件时,建议:
- 使用
lighttpd或nginx提供HTTP访问 - 设置
keepalive_timeout延长连接保持 - 增加
worker_processes提升并发能力
- 使用
NFS写性能瓶颈突破: 当遇到大量小文件写入时:
- 客户端挂载添加
noac选项禁用属性缓存 - 服务端调整
nfsd线程数:echo "RPCNFSDCOUNT=32" >> /etc/sysconfig/nfs - 使用
async写入模式(需权衡数据安全)
- 客户端挂载添加
混合环境兼容方案: 在同时存在CentOS 7/8的环境中:
- 为不同系统版本创建子目录:
/var/repo/local/centos7 /var/repo/local/centos8 - 使用
releasever变量动态选择:baseurl=http://repo.example.com/centos/$releasever/local
- 为不同系统版本创建子目录:
存储后端选型建议:
- 对于频繁读写的NFS共享:
- 优先考虑SSD存储
- 使用LVM快照定期备份
- 考虑cephFS替代传统NFS
- 对于频繁读写的NFS共享:
故障转移实战技巧: 当NFS服务器需要维护时:
# 客户端优雅卸载 umount -fl /mnt/nfs/data # 临时重定向到备用服务器 mount -t nfs 192.168.1.101:/shared/data /mnt/nfs/data
编程学习
技术分享
实战经验