从标题出发,这篇博文我打算这么写:先讲为什么要把DNF仓库和NFS放一起做,然后分别拆解本地仓库搭建和NFS服务部署,再讲客户端挂载和权限细节,最后把最常见的几个报错拿来做排查实录。这样一套下来,无论你是刚接触Linux的运维新人,还是想给内网做离线软件源的老手,都能找到可以直接抄的配置。
从头捋一遍:为什么要同时搞DNF仓库和NFS共享
做Linux运维这几年,我越来越觉得"软件源"和"共享存储"这两件事是绕不开的。DNF是Fedora、RHEL、CentOS Stream、Rocky、AlmaLinux这些发行版的默认包管理器,它的核心工作机制就是从一个或多个"仓库"里拉取rpm包、解析依赖、完成安装升级。而NFS是Linux/Unix世界里最经典的网络文件系统协议,作用是把一台机器上的目录通过网络共享给其他机器用,客户端挂载之后就跟操作本地磁盘一样。
把这两者放一起讲,是因为在实际生产环境里它们经常是配套出现的。最典型的场景是:内网有一批机器不能访问外网,但你不想每台机器都手动rpm -ivh去装包,那就在一台服务器上搭一个DNF本地仓库(本质就是个HTTP或文件目录形式的软件源),再用NFS把这个仓库目录共享出去,客户端通过NFS挂载或直接配置仓库地址来装软件。这套组合下来,几十台机器的软件分发效率会高非常多。
这篇指南适合谁?一是刚接触Linux运维、想搞懂"仓库"到底是个什么东西的入门者;二是被内网离线安装折磨过、想搭建自己的软件源和共享目录的工程师。我会尽量把每一步的"为什么"也讲清楚,而不是丢一堆命令让你复制完就完事。
1. 核心思路拆解:仓库共享方案为什么这么搭
1.1 先搞明白DNF仓库的工作机制
DNF(Dandified YUM)是YUM的下一代版本,依赖管理能力更强,性能也更好。它的仓库本质上就是一个带着元数据(repodata目录)的rpm包集合。元数据里包含每个包的名字、版本、依赖关系、文件清单等信息,DNF客户端通过读取这些元数据来构建依赖树,然后决定下载哪些包、按什么顺序装。
打个比方:DNF仓库就像一个图书馆,rpm包是书,repodata目录就是图书馆的检索卡片。你告诉DNF"我要装nginx",它就先去翻检索卡片,找到nginx这本书以及它引用的其他书,然后一次性把你需要的所有书都搬回家。所以搭建本地仓库的核心工作,就是准备一个rpm包目录,然后生成正确的repodata。
在离线或内网场景下,你需要在一台能联网的机器上把需要的rpm包下载好,搬进内网。这里有两个思路:一是逐个下载指定rpm及其依赖,用dnf download --resolve这样的命令;二是直接把整个发行版的ISO文件解压或挂载,把里面的Packages目录作为仓库。后者的好处是包全,文件系统里该有的基础组件基本齐了。
1.2 NFS在方案里扮演的角色
NFS在这个组合里解决的是"仓库目录怎么让其他机器访问"的问题。DNF仓库的访问方式有很多种:本地file路径、HTTP、FTP、NFS。HTTP是最通用的,但需要额外装nginx或httpd来跑;NFS则不需要Web服务,直接把目录挂给客户端就行,性能也不错。
更重要的是,NFS不仅仅是给DNF仓库用。在内网环境里,很多场景都需要共享存储:比如多台Web服务器共享一套静态文件、开发环境里共享编译产物、备份机把数据目录挂给其他机器做异地读取。所以把NFS的技能点起来,属于一次性投资长期受益。我在实际项目中就用NFS同时完成了软件源共享、日志收集目录共享、静态资源分发三件事,一台服务器搞定。
1.3 方案选型:为什么不用其他组合
有人可能会问,仓库共享为什么不用HTTP而选NFS?这是个好问题。HTTP做软件源也很常见,尤其是用nginx托管repodata,客户端把baseurl配成http://server/centos/这种形式。但HTTP方案需要在服务器上装Web服务端、配置虚拟目录、处理SELinux对httpd读写目录的权限,链路更长。而NFS方案的配置链路短,客户端直接把远程目录挂到本地某个路径,然后DNF仓库的baseurl用file://协议指向挂载点就行,走的是本地文件协议,不涉及网络下载这一层,少一层协议就少一层排查点。
NFS的另一个优势是所有客户端看到的是同一个文件系统视图,你在服务器上更新了仓库目录里的rpm包,所有挂载了该目录的客户端立刻就能看到。HTTP方案还需要保证缓存一致性问题,虽然实际上也不难,但NFS这种方式更省心。当然,如果仓库要跨公网或者跨网段大量并发访问,HTTP+缓存会更合适,但那就是另一个话题了。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. DNF本地仓库搭建:从下载rpm到生成repodata
2.1 准备基础环境与必要工具
我以Rocky Linux 9.3为例来演示,这套流程在RHEL 9系、AlmaLinux 9上完全通用。第一件事是确认当前系统的发行版和架构,避免下载错rpm包:
bash复制cat /etc/os-release
uname -m
uname -m输出x86_64还是aarch64直接决定了你要下载哪个架构的包。很多人在这步栽过跟头,x86_64的包往aarch64机器上装,那肯定是装不上的。
接下来需要安装两个关键工具:createrepo_c用于生成仓库元数据,dnf-utils(或者dnf-plugins-core)里的dnf download插件用于下载rpm包。在还能联网的阶段先把工具装好:
bash复制dnf install -y createrepo_c dnf-utils
如果系统里已经装过,这条命令会提示"Nothing to do",不用担心。
2.2 下载rpm包并生成仓库元数据
假设我要做一个包含nginx、vim、git、tree这些常用工具的离线仓库。先建一个目录,用dnf download把包和它们的所有依赖都拉下来:
bash复制mkdir -p /data/repo/rocky9
cd /data/repo/rocky9
dnf download --resolve --alldeps --destdir=. nginx vim git tree
参数解释一下:--resolve表示同时下载依赖包,--alldeps表示把所有依赖(包括非默认弱依赖)都下载下来,--destdir指定输出目录。这个命令非常实用,它会把nginx需要的所有so库依赖对应的rpm、vim那一大堆依赖包全部下载到当前目录。
如果只想用发行版ISO做仓库,就更简单了:
bash复制mkdir -p /mnt/iso
mount -o loop,r
