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提供reposynccreaterepo生成仓库元数据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 makecache或apt-get update成功 - 指定软件安装成功(如 nginx)
- 元数据与快照可回滚
- GPG 校验通过(生产必测)
练习#
- 在有网环境搭建 RPM 本地仓库并发布,客户端完成安装
htop。 - 使用快照策略保留两次同步结果,并验证回滚到旧版本。
- 构建离线包(含依赖)安装
nginx,记录失败日志并排错。 - 为仓库配置 GPG 签名并在客户端强制校验。