Rocky Linux离线环境搭建:挂载ISO配置本地yum源完整指南
1. 项目概述:为什么需要挂载ISO作为本地源?
最近在折腾一台没有外网环境的Rocky Linux服务器,安装完系统后,第一件事就是装各种开发工具和依赖包。结果一敲yum install,熟悉的报错就来了——无法连接到镜像仓库。这种场景对于运维和开发来说太常见了:封闭的内网环境、安全要求严格的隔离网络,或者单纯就是网络不稳定、下载速度慢得让人抓狂。这时候,系统安装时用的那张DVD光盘或者下载的ISO镜像文件,就成了救命稻草。
把Rocky Linux的安装ISO镜像挂载到系统里,配置成一个本地的yum软件源,本质上就是搭建一个离线的“软件仓库”。这个仓库里包含了系统安装时自带的、经过严格测试和兼容性认证的基础软件包。对于日常的系统维护、基础环境搭建、甚至是批量部署初始环境,这个方法既快又稳,完全不受网络波动的影响。我遇到过好几次在客户现场,网络配置还没搞定,但急需装个vim或者net-tools来排查问题,就是靠这个法子五分钟内解决问题。
这个操作的核心逻辑很简单:让系统认为有一个“本地光盘”在持续提供软件包,而不是去遥远的互联网上寻找。接下来,我会把从挂载ISO到最终成功使用yum安装软件的完整流程,以及我踩过的坑和总结的技巧,毫无保留地分享出来。
2. 前期准备与思路解析
在动手之前,我们得先理清整个操作的逻辑链条,并准备好必要的“食材”。盲目操作很容易导致权限问题、挂载点冲突或者源配置错误。
2.1 理解操作的核心逻辑
整个过程可以分解为四个清晰的步骤,像一条流水线:
- 获取“软件仓库”实体:找到Rocky Linux的安装ISO文件。它可能是一张物理DVD光盘,也可能是你从官网下载的
.iso镜像文件。 - 创建“访问入口”:在Linux文件系统中创建一个目录(例如
/mnt/cdrom)。这个目录本身是空的,它的作用是为ISO文件内容提供一个展示的“窗口”或“挂载点”。 - 建立“连接通道”:通过
mount命令,将ISO文件“贴”到刚才创建的挂载点上。执行成功后,访问/mnt/cdrom目录,看到的就是ISO文件内部的所有内容,包括我们需要的BaseOS和AppStream仓库目录。 - 告诉yum“新仓库地址”:修改或创建yum的源配置文件(
.repo文件),将软件源地址指向本地的挂载点(file:///mnt/cdrom)。这样,当执行yum install时,系统就会自动去这个本地路径查找和安装软件包。
理解这个逻辑后,即使中途某步出错,你也能快速定位是“连接”的问题还是“地址”配置的问题。
2.2 所需材料与环境检查
工欲善其事,必先利其器。开始前请确认以下几点:
- ISO文件或光盘:确保你拥有Rocky Linux的安装镜像。对于Rocky Linux 8或9,通常是一个包含
BaseOS和AppStream两个核心仓库的完整DVD镜像(大小约8-10GB)。迷你版或网络安装版ISO不包含完整的软件包,不适合此用途。- 如何确认:如果你有一个ISO文件,可以在Windows或Linux上用右键属性查看大小,或者用
file命令查看类型。
- 如何确认:如果你有一个ISO文件,可以在Windows或Linux上用右键属性查看大小,或者用
- 服务器访问权限:你需要拥有待配置服务器的root用户权限。因为挂载操作和修改
/etc/yum.repos.d/目录下的文件都需要最高权限。 - 确定ISO文件位置:
- 物理光盘:将光盘放入服务器的光驱。在虚拟机环境下,需要在VMware、VirtualBox或KVM的管理界面中将ISO文件“插入”虚拟光驱。
- ISO镜像文件:你需要知道这个文件放在服务器的哪个路径下。例如,你可能通过U盘拷贝到了
/root/目录,或者存放在一个共享存储/data/iso/下。记下它的完整路径,比如/root/Rocky-9.2-x86_64-dvd.iso。
注意:在虚拟机中,虽然可以通过图形界面直接加载ISO,但本文的方法是通过命令挂载,这更具通用性,适用于物理机、云主机和任何可通过SSH访问的环境。
3. 实操步骤详解:挂载与配置
理论清晰后,我们进入实战环节。请跟随步骤逐一操作,并注意我穿插的提示。
3.1 创建挂载点目录
挂载点就是一个普通的目录,习惯上我们会在/mnt或/media下创建。这里我选择/mnt/cdrom,你可以自定义,但后续所有配置都要相应修改。
sudo mkdir -p /mnt/cdromsudo:以管理员权限执行。mkdir -p:创建目录。-p参数确保如果/mnt目录不存在,会一并创建,避免报错。
创建后,可以用ls -ld /mnt/cdrom查看目录详情,确认权限通常是drwxr-xr-x(755)。
3.2 挂载ISO文件到目录
这是最关键的一步,将“仓库”和“入口”连接起来。
情况一:挂载物理光盘或虚拟光驱如果你的光盘已经放入光驱(在虚拟机中已连接ISO),设备名通常是/dev/sr0或/dev/cdrom(后者常是前者的软链接)。
sudo mount /dev/cdrom /mnt/cdrom如果成功,不会有任何输出。你可以用mount | grep cdrom或df -hT /mnt/cdrom来检查是否挂载成功,并看到文件系统类型是iso9660。
情况二:挂载本地的ISO镜像文件这是更常见的场景。使用-o loop选项来挂载镜像文件。
sudo mount -o loop /root/Rocky-9.2-x86_64-dvd.iso /mnt/cdrom-o loop:使用回环设备(loop device)将文件像块设备一样挂载。/root/Rocky-9.2-x86_64-dvd.iso:请替换为你ISO文件的实际路径。
挂载后的验证: 挂载成功后,立即进入挂载点查看内容,这是良好的习惯。
ls -l /mnt/cdrom/你应该能看到类似以下的目录结构,其中BaseOS和AppStream就是我们需要的仓库:
dr-xr-xr-x. 4 root root 2048 Jan 1 2020 AppStream dr-xr-xr-x. 4 root root 2048 Jan 1 2020 BaseOS -r--r--r--. 1 root root 8266 Jan 1 2020 EFI -r--r--r--. 1 root root 8266 Jan 1 2020 EULA -r--r--r--. 1 root root 8266 Jan 1 2020 GPL dr-xr-xr-x. 3 root root 2048 Jan 1 2020 images dr-xr-xr-x. 2 root root 2048 Jan 1 2020 isolinux -r--r--r--. 1 root root 8266 Jan 1 2020 media.repo -r--r--r--. 1 root root 8266 Jan 1 2020 TRANS.TBL看到AppStream和BaseOS目录,就说明挂载完全正确。
3.3 备份并禁用原有的网络yum源
为了防止本地源和网络源冲突,也为了在离线环境下yum不会因尝试连接网络而超时等待,最好将系统原有的网络源配置文件备份后禁用。
# 进入yum源配置目录 cd /etc/yum.repos.d/ # 创建备份目录,并将所有.repo文件移走 sudo mkdir -p repo-backup sudo mv *.repo repo-backup/ # 验证是否已清空 ls -la *.repo 2>/dev/null || echo "All .repo files have been moved."这个操作是可逆的。如果需要恢复网络源,只需将文件移回来即可:sudo mv repo-backup/*.repo ./
3.4 创建本地yum源配置文件
现在,我们需要创建一个新的.repo文件,告诉yum去哪里找软件包。
创建配置文件:
sudo vi /etc/yum.repos.d/local.repo你也可以使用
nano或gedit等你熟悉的编辑器。写入以下配置内容:
[Local-BaseOS] name=Local Rocky Linux $releasever - BaseOS baseurl=file:///mnt/cdrom/BaseOS enabled=1 gpgcheck=0 [Local-AppStream] name=Local Rocky Linux $releasever - AppStream baseurl=file:///mnt/cdrom/AppStream enabled=1 gpgcheck=0关键参数解析:
[Local-BaseOS]:源仓库的唯一ID,可以自定义。name:仓库的描述信息,会显示在yum操作中。baseurl:这是核心配置!指向我们挂载的ISO内的仓库路径。注意格式是file://后接绝对路径。file://是访问本地文件的协议,后面是三个斜杠///。enabled=1:启用此仓库。gpgcheck=0:禁用GPG密钥检查。因为ISO内的软件包是官方发布的,在离线可信环境下可以跳过检查以简化流程。如果设为1,则需要配置gpgkey,步骤会复杂一些。
重要提示:
baseurl中的路径必须和你挂载的路径以及ISO内的实际目录名完全一致。Rocky Linux 8/9的DVD镜像通常包含BaseOS和AppStream两个目录。请务必用ls /mnt/cdrom/确认。
3.5 清理缓存并测试本地源
配置完成后,必须让yum重新加载元数据。
清理旧缓存:
sudo yum clean all这个命令会清除所有已下载的仓库元数据和软件包缓存,确保yum读取新的本地源配置。
生成新缓存:
sudo yum makecache或者使用更详细的:
sudo yum repolist all这个命令会列出所有已启用和禁用的仓库。如果配置正确,你应该能看到
Local-BaseOS和Local-AppStream仓库被列出,并且状态为enabled。进行安装测试: 找一个ISO里肯定有的基础包进行测试,比如
vim-common或tree。sudo yum install tree -y如果安装成功,输出信息中会明确显示软件包是从
Local-BaseOS或Local-AppStream仓库下载的,恭喜你,本地源配置成功!
4. 进阶配置与优化技巧
基础的挂载和配置完成后,为了更贴合生产环境的需求,让这个本地源用起来更顺手、更稳定,还有一些进阶操作和技巧。
4.1 实现开机自动挂载
手动挂载的ISO在系统重启后会失效。对于需要长期使用本地源的服务器,必须配置自动挂载。有两种主流方法:
方法一:修改/etc/fstab文件(推荐用于固定ISO文件)/etc/fstab是系统开机自动挂载的文件系统表。
首先,确保你的ISO文件放在一个不会移动的位置,例如
/opt/iso/。sudo mkdir -p /opt/iso sudo cp /root/Rocky-9.2-x86_64-dvd.iso /opt/iso/编辑
/etc/fstab文件:sudo vi /etc/fstab在文件末尾添加一行:
/opt/iso/Rocky-9.2-x86_64-dvd.iso /mnt/cdrom iso9660 loop,ro,auto,nofail 0 0- 第一段:ISO文件的绝对路径。
- 第二段:挂载点目录。
- 第三段:文件系统类型
iso9660。 - 第四段:挂载选项。
loop:使用回环设备。ro:只读挂载(ISO本来就是只读的)。auto:开机自动挂载。nofail:即使挂载失败也继续启动系统(避免因ISO文件丢失导致系统无法启动)。
- 第五、六段:
dump和fsck选项,对于ISO文件通常设为0。
保存退出后,可以立即测试配置是否正确,而无需重启:
sudo mount -a这个命令会挂载
/etc/fstab中所有配置了auto选项但尚未挂载的文件系统。执行后检查df -h或ls /mnt/cdrom,确认挂载成功即可。
方法二:创建 Systemd Mount Unit 文件(更灵活)Systemd提供了更现代的挂载管理方式,适合需要更复杂控制的情况。
- 创建mount单元文件,命名规则是
挂载点路径转义后的名称.mount。例如,挂载点是/mnt/cdrom,则文件名为mnt-cdrom.mount。sudo vi /etc/systemd/system/mnt-cdrom.mount - 写入以下内容:
[Unit] Description=Mount Rocky Linux ISO Before=local-fs.target [Mount] What=/opt/iso/Rocky-9.2-x86_64-dvd.iso Where=/mnt/cdrom Type=iso9660 Options=loop,ro [Install] WantedBy=multi-user.target - 启用并启动这个mount单元:
sudo systemctl daemon-reload sudo systemctl enable mnt-cdrom.mount sudo systemctl start mnt-cdrom.mount - 检查状态:
sudo systemctl status mnt-cdrom.mount
选择建议:对于简单的固定ISO挂载,
/etc/fstab方法更直接、更通用。如果你需要依赖其他服务启动后再挂载,或者有更复杂的条件判断,Systemd mount unit提供了更精细的控制。
4.2 创建混合源(本地优先,网络备用)
在有些网络受限但并非完全离线的环境(如慢速网络),可以配置混合源,让yum优先从本地ISO安装,如果本地没有所需软件包,再尝试从网络源获取。
- 恢复网络源配置:将之前备份的网络源
.repo文件移回来。sudo mv /etc/yum.repos.d/repo-backup/*.repo /etc/yum.repos.d/ - 修改网络源优先级:编辑网络源的
.repo文件(如rocky.repo或rocky-baseos.repo),在[baseos]和[appstream]等章节中添加一行:
数字越大,优先级越低。通常设置为priority=101-99之间。 - 修改本地源优先级:编辑我们创建的
local.repo文件,为本地仓库设置更高的优先级(更小的数字):[Local-BaseOS] name=Local Rocky Linux $releasever - BaseOS baseurl=file:///mnt/cdrom/BaseOS enabled=1 gpgcheck=0 priority=1 [Local-AppStream] name=Local Rocky Linux $releasever - AppStream baseurl=file:///mnt/cdrom/AppStream enabled=1 gpgcheck=0 priority=1 - 测试优先级:执行
yum install时,yum会优先从priority=1的本地源查找,找不到再去priority=10的网络源。
4.3 扩展本地源:合并多个ISO或RPM包
一张DVD ISO的软件包终究有限。如果你有多个版本的ISO,或者自己下载了很多额外的RPM包,可以将其合并到一个本地目录,创建一个更强大的本地源。
- 创建统一的仓库目录结构:
sudo mkdir -p /opt/local-yum/BaseOS/Packages sudo mkdir -p /opt/local-yum/AppStream/Packages - 复制所有RPM包:将ISO挂载后,把
Packages目录下的所有.rpm文件拷贝到对应的本地目录。也可以直接从网上下载的RPM包放进去。# 假设ISO已挂载在 /mnt/cdrom sudo cp -n /mnt/cdrom/BaseOS/Packages/*.rpm /opt/local-yum/BaseOS/Packages/ sudo cp -n /mnt/cdrom/AppStream/Packages/*.rpm /opt/local-yum/AppStream/Packages/ # -n 参数避免覆盖已有文件 - 创建仓库元数据:这是最关键的一步,需要使用
createrepo_c命令(Rocky 9推荐)或createrepo命令。
这个命令会在仓库目录下生成# 安装createrepo工具(第一次需要网络或从ISO安装) # 可以先从ISO本地源安装它本身 # sudo yum install createrepo_c --disablerepo="*" --enablerepo="Local-*" # 为BaseOS仓库创建元数据 sudo createrepo_c /opt/local-yum/BaseOS/ # 为AppStream仓库创建元数据 sudo createrepo_c /opt/local-yum/AppStream/repodata文件夹,里面包含了所有RPM包的依赖关系、版本等元数据,yum依赖这些数据才能正常工作。 - 修改本地源配置:将
local.repo文件中的baseurl指向新的本地目录。baseurl=file:///opt/local-yum/BaseOS baseurl=file:///opt/local-yum/AppStream - 更新yum缓存:
sudo yum clean all && sudo yum makecache
此后,你可以随时向/opt/local-yum/BaseOS/Packages/目录添加新的RPM包,添加后只需重新运行一次sudo createrepo_c --update /opt/local-yum/BaseOS/更新元数据即可,yum源会自动包含新软件包。
5. 故障排查与常见问题
即使按照步骤操作,也可能遇到各种问题。下面是我在实践中总结的常见“坑点”和解决方法。
5.1 挂载阶段常见问题
问题1:mount: /mnt/cdrom: mount failed: No such file or directory.
- 原因:挂载点目录不存在。
- 解决:确认
/mnt/cdrom目录已创建。用ls -ld /mnt/cdrom检查。
问题2:mount: /mnt/cdrom: /dev/sr0 is write-protected, mounting read-only.
- 原因:这不是错误,而是提示信息。说明光盘或ISO被成功以只读方式挂载。可以忽略。
问题3:mount: /mnt/cdrom: wrong fs type, bad option, bad superblock on /dev/sr0...
- 原因:设备文件不对或ISO文件损坏。
- 解决:
- 确认光驱设备名。尝试
lsblk命令查看块设备,光驱通常显示为rom类型。 - 确认ISO文件路径和名称是否正确。
- 验证ISO文件完整性。可使用
file命令:file /path/to/iso,应显示ISO 9660 CD-ROM filesystem data。
- 确认光驱设备名。尝试
问题4:mount: /mnt/cdrom: device is busy.
- 原因:挂载点目录正在被其他进程使用(例如,你的当前Shell就在
/mnt/cdrom目录下)。 - 解决:退出占用该目录的进程。最简单的办法是,确保你的当前工作目录不在
/mnt/cdrom及其子目录下。
5.2 yum配置与使用阶段问题
问题1:执行yum makecache或yum repolist时报错,提示找不到repodata/repomd.xml。
- 原因:
baseurl配置的路径错误,或者ISO没有正确挂载,或者挂载的ISO不包含完整的仓库。 - 排查步骤:
- 检查挂载:
ls /mnt/cdrom/,确认能看到BaseOS和AppStream目录。 - 检查路径:进入
BaseOS目录,看里面是否有repodata文件夹。ls /mnt/cdrom/BaseOS/ - 检查配置:核对
local.repo文件中的baseurl。特别注意:file://后面是三个斜杠,然后是绝对路径。例如file:///mnt/cdrom/BaseOS。路径末尾不要有斜杠。 - 检查ISO版本:确认你使用的不是“Minimal ISO”或“Boot ISO”,它们不包含完整的软件仓库。
- 检查挂载:
问题2:能repolist成功,但yum install时提示“No match for argument: xxx”或“Error: Nothing to do”。
- 原因:你要安装的软件包在当前的本地源中确实不存在。DVD ISO只包含一部分常用软件包。
- 解决:
- 先用
yum search命令搜索一下包名或关键词。 - 如果确实没有,考虑使用“混合源”配置(见4.2节),让yum去网络源查找。
- 或者,手动下载该软件包及其所有依赖的RPM,放入自定义本地源目录并更新元数据(见4.3节)。
- 先用
问题3:安装软件时出现GPG密钥错误。
- 错误信息:
GPG key retrieval failed: [Errno 14] curl#37 - "Couldn't open file /mnt/cdrom/RPM-GPG-KEY-rockyofficial" - 原因:在
local.repo中我们设置了gpgcheck=0跳过了检查。如果设为1,就需要配置gpgkey路径。 - 解决(如果需要启用检查):
- 在ISO根目录或
RPM-GPG-KEY目录下找到GPG密钥文件。 - 将其导入系统:
sudo rpm --import /mnt/cdrom/RPM-GPG-KEY-rockyofficial - 在
local.repo文件中添加一行:gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-rockyofficial但出于简便,在可信的离线环境,保持gpgcheck=0是最实用的选择。
- 在ISO根目录或
问题4:系统重启后,yum又无法使用了。
- 原因:没有配置自动挂载,重启后ISO连接断开,本地源失效。
- 解决:按照4.1节的内容,配置
/etc/fstab或Systemd mount unit实现开机自动挂载。
5.3 性能与存储优化提示
- 使用硬盘目录代替ISO挂载:如果服务器性能敏感,频繁的软件安装操作,反复读取ISO文件(尤其是通过loop设备)可能有效能损耗。可以将ISO内的
Packages和repodata目录直接解压或拷贝到硬盘(如/opt/local-yum),然后直接指向该目录。这样访问速度更快,但会占用额外的磁盘空间(约10GB)。 - 注意磁盘空间:确保存放ISO文件或解压后仓库的磁盘分区有足够空间。
- NFS共享本地源:在多台内网服务器都需要使用相同本地源的场景下,可以在一台服务器上搭建好这个本地源目录(如
/opt/local-yum),然后通过NFS服务将此目录共享给内网其他机器。其他机器只需在baseurl中使用nfs://<server_ip>/opt/local-yum/BaseOS这样的地址即可,避免每台机器都存储一份拷贝。
整个流程走下来,从遇到网络困境到成功搭建一个稳定、快速的离线yum源,这种“自给自足”的感觉对于系统管理员来说非常踏实。最关键的是深刻理解每一步背后的意图:挂载是让系统能“看到”软件包,.repo文件是告诉yum去“哪里找”,而createrepo则是为一大堆散落的RPM包建立“索引目录”。掌握了这个核心,无论环境怎么变,你都能灵活应对。下次再遇到无网环境,你就能气定神闲地掏出ISO,十分钟内搭建好自己的软件堡垒。
