1.4.4 本地仓库与离线安装方案

本节聚焦在受限网络或无公网环境下的安装交付。通过构建本地仓库与离线安装包,确保系统在封网场景下具备可持续更新能力与可控的软件供应链。

目标与适用场景#

  • 适用场景:生产内网、军工/政企封网、跨机房隔离、边缘节点无公网
  • 目标:统一软件来源、降低外网依赖、提高安装一致性与可追溯性

本地仓库总体思路#

文章图片
  • 从有网环境同步官方仓库或镜像源到本地
  • 以 HTTP/FTP/NFS 提供仓库服务
  • 内网客户端统一指向本地仓库
  • 规划仓库版本与快照,支持回溯

RPM 系列本地仓库(YUM/DNF)#

安装工具与目录规划#

# 以 RHEL/CentOS 为例
sudo yum -y install yum-utils createrepo nginx
sudo mkdir -p /srv/repo/centos/7/os/x86_64
sudo mkdir -p /srv/repo/centos/7/updates/x86_64
  • yum-utils 提供 reposync
  • createrepo 生成仓库元数据
  • nginx 提供 HTTP 访问

同步仓库与生成元数据#

# 同步官方 base 仓库(示例,实际按需选择)
sudo reposync -r base -p /srv/repo/centos/7/os/x86_64 --download-metadata

# 生成仓库索引
sudo createrepo /srv/repo/centos/7/os/x86_64

# 验证 repodata 生成
ls /srv/repo/centos/7/os/x86_64/repodata
  • -r base 指定源仓库 ID(与 /etc/yum.repos.d/*.repo 一致)
  • --download-metadata 确保元数据完整
  • 预期效果:目录下出现 repodata/ 索引

发布仓库(Nginx 示例)#

cat > /etc/nginx/conf.d/repo.conf <<'EOF'
server {
    listen 80;
    server_name repo.local;
    autoindex on;
    location /repo/ {
        alias /srv/repo/;
    }
}
EOF

sudo nginx -t && sudo systemctl enable --now nginx
  • autoindex on 便于浏览与校验
  • 访问测试:curl http://repo.local/repo/centos/7/os/x86_64/

客户端配置指向本地仓库#

cat > /etc/yum.repos.d/local.repo <<'EOF'
[local-base]
name=Local Base
baseurl=http://repo.local/repo/centos/7/os/x86_64
enabled=1
gpgcheck=0
EOF

sudo yum clean all
sudo yum makecache
  • baseurl 改为内网地址
  • gpgcheck=0 仅示例,生产建议启用签名

版本冻结与快照#

# 生成快照目录(保留历史版本)
SNAP=/srv/repo/snapshot-$(date +%Y%m%d)
sudo cp -a /srv/repo/centos/7/os/x86_64 "$SNAP"
  • 通过快照目录实现回溯与版本冻结

DEB 系列本地仓库(APT)#

安装工具与目录规划#

sudo apt-get update
sudo apt-get -y install apt-mirror apache2 dpkg-dev
sudo mkdir -p /srv/repo/ubuntu

同步与索引生成(简化版)#

# /etc/apt/mirror.list 示例
cat > /etc/apt/mirror.list <<'EOF'
set base_path    /srv/repo/ubuntu
set nthreads     4
set _tilde 0

deb http://archive.ubuntu.com/ubuntu focal main restricted
deb http://archive.ubuntu.com/ubuntu focal-updates main restricted
clean http://archive.ubuntu.com/ubuntu
EOF

sudo apt-mirror

# 生成 Packages 索引
cd /srv/repo/ubuntu/mirror/archive.ubuntu.com/ubuntu
sudo dpkg-scanpackages . /dev/null | gzip -9c > Packages.gz
  • apt-mirror 同步包
  • dpkg-scanpackages 生成索引

发布仓库(Apache 示例)#

sudo a2enmod autoindex
cat > /etc/apache2/sites-available/repo.conf <<'EOF'
<VirtualHost *:80>
    ServerName repo.local
    DocumentRoot /srv/repo/ubuntu
    <Directory /srv/repo/ubuntu>
        Options Indexes FollowSymLinks
        Require all granted
    </Directory>
</VirtualHost>
EOF

sudo a2ensite repo.conf && sudo systemctl reload apache2

客户端 sources.list 指向内网#

cat > /etc/apt/sources.list <<'EOF'
deb http://repo.local/ubuntu/mirror/archive.ubuntu.com/ubuntu focal main restricted
deb http://repo.local/ubuntu/mirror/archive.ubuntu.com/ubuntu focal-updates main restricted
EOF

sudo apt-get update

离线安装包与依赖打包#

RPM 离线依赖包#

# 下载指定软件及依赖到本地目录
mkdir -p /tmp/offline/pkg
cd /tmp/offline/pkg
yum -y install yum-utils
yumdownloader --resolve --destdir=/tmp/offline/pkg nginx

# 在离线环境安装
sudo rpm -Uvh /tmp/offline/pkg/*.rpm
  • --resolve 自动拉取依赖
  • 预期效果:离线系统安装成功

DEB 离线依赖包#

mkdir -p /tmp/offline/deb
cd /tmp/offline/deb
sudo apt-get -y install apt-rdepends
apt-rdepends nginx | grep -E '^[a-zA-Z0-9]' | xargs -n1 apt-get download

# 离线安装
sudo dpkg -i /tmp/offline/deb/*.deb
sudo apt-get -f install  # 修复依赖

仓库签名与安全#

RPM 仓库签名与校验#

# 生成 GPG 密钥(示例)
gpg --quick-generate-key "Repo Signing <repo@example.com>" rsa4096 sign 2y
gpg --export -a "Repo Signing" > /srv/repo/RPM-GPG-KEY-local

# 客户端导入密钥
sudo rpm --import http://repo.local/repo/RPM-GPG-KEY-local

APT 仓库签名(简化示例)#

# 生成 Release 文件与签名(示意)
cd /srv/repo/ubuntu/mirror/archive.ubuntu.com/ubuntu
apt-ftparchive release . > Release
gpg --default-key "Repo Signing" -abs -o Release.gpg Release

更新策略与同步机制#

  • 设定同步周期与变更窗口
  • 使用增量同步减少流量
  • 保留最近 N 次快照,支持回滚
  • 建立变更记录与包清单审计

示例:增量同步(rsync)

rsync -avz --delete /srv/repo/centos/7/os/x86_64/ repo-backup:/backup/centos/7/os/x86_64/

常见问题与排查#

依赖缺失#

# 检查仓库元数据是否存在
ls /srv/repo/centos/7/os/x86_64/repodata
# 客户端重建缓存
sudo yum clean all && sudo yum makecache

版本冲突#

# 查看包版本来源
yum list nginx --showduplicates
# 临时锁定版本
yum -y install yum-plugin-versionlock
yum versionlock add nginx-1.20.*

访问失败#

# 服务端检查端口与防火墙
ss -lntp | grep :80
sudo firewall-cmd --add-service=http --permanent
sudo firewall-cmd --reload

# 客户端检测连通性
curl -I http://repo.local/repo/

SELinux 拦截#

# 临时验证(不建议长期关闭)
getenforce
sudo setenforce 0
# 或配置目录上下文
sudo chcon -R -t httpd_sys_content_t /srv/repo

安装验收清单(示例)#

  • 客户端 yum makecacheapt-get update 成功
  • 指定软件安装成功(如 nginx)
  • 元数据与快照可回滚
  • GPG 校验通过(生产必测)

练习#

  1. 在有网环境搭建 RPM 本地仓库并发布,客户端完成安装 htop
  2. 使用快照策略保留两次同步结果,并验证回滚到旧版本。
  3. 构建离线包(含依赖)安装 nginx,记录失败日志并排错。
  4. 为仓库配置 GPG 签名并在客户端强制校验。