问题场景描述
在Windows主机联网而Fedora系统离线的特殊环境下,需要为Fedora 14 i386系统获取安全更新。由于缺乏第二台Linux主机作为跳板,传统通过createrepo
搭建本地仓库的方案无法实施。
核心解决思路
通过Windows主机完成以下关键步骤:
- 获取官方仓库的元数据
- 筛选需要更新的RPM包
- 建立本地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
在可联网环境预先下载