离线环境装包:downloadonly + 本地仓库(Rocky 9 实测)
什么时候该用它
Section titled “什么时候该用它”内网机器不能出网,但缺几个包(或要升级)。做法不是把 rpm 一个个 scp 过去手动装,而是:在有网机器上把包和依赖下载下来,做成一个本地仓库,让 dnf 像访问远程源一样从目录安装——依赖解析、版本检查都还在。
准备:先装 createrepo_c,再下载
Section titled “准备:先装 createrepo_c,再下载”dnf -y install createrepo_cmkdir -p /srv/offlinednf -y install --downloadonly --destdir=/srv/offline treels /srv/offlinetree-1.8.0-10.el9.aarch64.rpm顺序很重要:先装 createrepo_c,再 --downloadonly。反过来做,下一步安装任何包都会让 dnf 清理刚下载到 destdir 的文件(实测:/srv/offline 里只剩 repodata,rpm 消失)。
createrepo_c /srv/offlinels /srv/offline/repodata | head -31cb61ea9...-primary.xml.gz84823fd3...-other.sqlite.bz295a4415d...-filelists.xml.gzrepodata/ 就是 dnf 读取的元数据;没有它,把 rpm 放进目录也不会被当成仓库。
指向本地目录并安装
Section titled “指向本地目录并安装”printf '[local-offline]\nname=Local offline repo\nbaseurl=file:///srv/offline\nenabled=1\ngpgcheck=0\n' \ | sudo tee /etc/yum.repos.d/local.reposudo dnf clean allsudo dnf -y --disablerepo="*" --enablerepo=local-offline install treeInstalled: tree-1.8.0-10.el9.aarch64Complete!--disablerepo="*" 是关键:离网机器上其他源不可达,只留本地源才不会卡在超时。
rpm -q treednf --disablerepo="*" --enablerepo=local-offline list available第一条应输出 tree-1.8.0-10.el9.aarch64;第二条应只列本地仓库里的包。
- 先下载、后装别的包:destdir 里的 rpm 会被清掉(本文实测),顺序必须是「先装工具,再下载」;
- 只复制 rpm 不建 repodata:dnf 认不出这个目录,会报
No match for argument; gpgcheck=0:离线仓库常用,但等于放弃签名校验;正式环境把 Rocky 的 GPG key 一起带过去,保持gpgcheck=1并配gpgkey=file:///...。
练习:离线装一个带依赖的包
Section titled “练习:离线装一个带依赖的包”前置:有网机器 A、离网机器 B(同为 Rocky 9 aarch64/x86_64)。
# Adnf -y install --downloadonly --destdir=/srv/offline nginxcreaterepo_c /srv/offlinetar -C /srv -czf offline.tgz offline# Bsudo tar -C /srv -xzf offline.tgz# local.repo 指向 /srv/offline,然后:sudo dnf --disablerepo="*" --enablerepo=local-offline install nginx检查:
rpm -q nginx→ 有版本号输出dnf --disablerepo="*" --enablerepo=local-offline repoquery --requires nginx | head→ 依赖都已满足systemctl is-active nginx→active(需要真实 systemd,容器里不可用)
- 仓库结构与默认启用项:Rocky 仓库
- 多仓库冲突(页面待补):
/repo-priority/ - 事务回滚:dnf history undo