Fedora离线环境手动下载YUM更新包并本地更新的技术方案


阅读 8 次

问题场景描述

在Windows主机联网而Fedora系统离线的特殊环境下,需要为Fedora 14 i386系统获取安全更新。由于缺乏第二台Linux主机作为跳板,传统通过createrepo搭建本地仓库的方案无法实施。

核心解决思路

通过Windows主机完成以下关键步骤:

  1. 获取官方仓库的元数据
  2. 筛选需要更新的RPM包
  3. 建立本地YUM仓库结构

具体操作步骤

1. 获取仓库元数据

在Windows端使用PowerShell下载元数据:

# 下载repomd.xml索引文件
$baseUrl = "http://download.fedoraproject.org/pub/fedora/linux/updates/14/i386"
Invoke-WebRequest -Uri "$baseUrl/repodata/repomd.xml" -OutFile repomd.xml

# 解析primary.xml.gz位置
[xml]$repomd = Get-Content repomd.xml
$primaryLocation = ($repomd.repomd.data | Where-Object type -eq 'primary').location.href
Invoke-WebRequest -Uri "$baseUrl/$primaryLocation" -OutFile primary.xml.gz

2. 分析更新需求

在Fedora离线主机上生成需要更新的包列表:

# 生成已安装包列表
rpm -qa --qf '%{NAME}\n' > installed_pkgs.txt

# 生成可更新包列表
yum list updates | awk '/i386/ {print $1}' > updates.txt

3. Windows端下载RPM包

结合两个列表文件,使用Python脚本批量下载:

import requests
from bs4 import BeautifulSoup

base_url = "http://download.fedoraproject.org/pub/fedora/linux/updates/14/i386/Packages/"
with open('updates.txt') as f:
    pkgs = [line.strip() for line in f]

session = requests.Session()
for pkg in pkgs:
    resp = session.get(base_url)
    soup = BeautifulSoup(resp.text, 'html.parser')
    for link in soup.find_all('a'):
        if pkg in link.get('href'):
            print(f"Downloading {link['href']}")
            with open(link['href'], 'wb') as f:
                f.write(session.get(base_url + link['href']).content)

建立本地YUM仓库

将下载的RPM包通过U盘拷贝到Fedora主机后:

# 创建本地仓库目录结构
mkdir -p /var/local_repo/{Packages,repodata}

# 移动RPM包
mv *.rpm /var/local_repo/Packages/

# 生成仓库元数据
createrepo /var/local_repo

# 创建本地仓库配置
cat > /etc/yum.repos.d/local.repo <<EOF
[local]
name=Local Repository
baseurl=file:///var/local_repo
enabled=1
gpgcheck=0
EOF

验证更新

执行标准更新命令:

yum clean all
yum update --disablerepo="*" --enablerepo="local"

注意事项

  • 确保Windows下载的RPM包与Fedora系统架构(i386)完全匹配
  • 建议优先下载security分类的更新包
  • 对于依赖关系复杂的包组,建议使用yumdownloader --resolve在可联网环境预先下载