yum list查询时部分包查找不到流程分析
以下是针对 yum list available -c xxx.repo(对应 DNF 的命令行操作)的详细流程解读,包括参数解析、配置初始化、元数据加载、数据库查询,以及读取不到特定包的场景分析。
1. 命令行参数解析与入口函数
代码入口: dnf.cli.main.main() -> user_main(sys.argv[1:])
- 参数处理流程:
-
参数分割:
sys.argv[1:]接收命令行参数,例如["list", "available", "-c", "xxx.repo"]。-c参数指定自定义配置文件路径(覆盖默认的/etc/dnf/dnf.conf)。xxx.repo是用户自定义仓库文件(需明确路径,如/path/to/xxx.repo)。
-
CLI 解析逻辑:
- DNF 使用
argparse解析参数,关键模块在dnf.cli.cli.Cli中。 list是子命令,对应dnf.cli.commands.list.ListCommand类。available是list的子参数,表示列出未安装但仓库中存在的包。- 关键代码片段:
# dnf/cli/cli.py def parse_commands(self):parser = argparse.ArgumentParser()subparsers = parser.add_subparsers(dest='command')list_parser = subparsers.add_parser('list')list_parser.add_argument('available', action='store_true')list_parser.add_argument('-c', '--config', dest='config_file')return parser.parse_args()
- DNF 使用
-
2. 配置初始化与仓库加载
代码模块: dnf.base.Base, dnf.conf.Conf
-
配置加载顺序:
- 默认配置:
- 读取
/etc/dnf/dnf.conf,初始化全局配置对象Conf。
- 读取
- 自定义配置:
-c xxx.repo参数触发加载用户指定的仓库文件(可能覆盖默认仓库)。- 仓库文件解析逻辑在
dnf.repo.RepoDict中,关键方法为_parse_repo_file()。
- 默认配置:
-
仓库初始化:
- 自定义仓库文件路径处理:
# dnf/cli/cli.py if opts.config_file:conf.reposdir = [os.path.abspath(opts.config_file)] - 所有仓库(包括自定义仓库)生成
Repo对象,存储在Base.repos中。
- 自定义仓库文件路径处理:
3. 元数据下载与 Sack 构建
代码模块: dnf.repo.Repo, dnf.sack.Sack
- 元数据加载流程:
-
元数据下载:
- 对每个启用的仓库(包括
xxx.repo中的仓库),调用Repo.load()方法。 - 下载
repomd.xml并验证签名(若配置了gpgcheck=1)。 - 下载
primary.xml、filelists.xml等元数据文件到缓存目录(如/var/cache/dnf/)。
- 对每个启用的仓库(包括
-
Sack 构建:
Base.fill_sack()方法将所有仓库的元数据解析为Package对象。- 关键代码:
# dnf/base.py def fill_sack(self):for repo in self.repos.iter_enabled():repo.load() # 触发元数据下载self.sack = dnf.sack.Sack()self.sack.add_cmdline_packages() # 添加本地 RPM(此处无)self.sack.load_repos(self.repos) # 加载仓库元数据到 Sack
-
4. 查询可用包 (list available)
代码模块: dnf.query.Query
-
查询逻辑:
- 初始化查询对象:
# dnf/commands/list.py query = self.base.sack.query() available = query.available() # 过滤未安装的包 - 过滤与输出:
- 根据
name、version等条件过滤包。 - 输出结果到终端,格式化为表格。
- 根据
- 初始化查询对象:
-
关键数据结构:
Sack中的packages列表存储所有Package对象。Query对象通过filter()方法实现高效检索(如name="bash")。
5. 读取不到特定包的可能场景
以下场景可能导致无法读取仓库中的特定包信息:
场景 1: 仓库配置错误
- 原因:
xxx.repo文件中的baseurl或metalink配置错误(如 URL 不可达)。- 仓库未启用(
enabled=0)。
- 现象:
- 执行
dnf repolist时目标仓库未列出。 - 日志中提示
Repository 'xxx' is missing valid metadata。
- 执行
场景 2: 元数据未更新
- 原因:
- 本地缓存过期(
metadata_expire超时)且未主动执行dnf clean all或dnf makecache。 - 仓库元数据损坏(如
repodata文件不完整)。
- 本地缓存过期(
- 现象:
- 包存在于仓库服务器但本地查询不到。
- 日志提示
Cannot retrieve metalink for repository。
场景 3: 包被排除规则过滤
- 原因:
- 全局配置或仓库配置中设置了
exclude=package_name。 - 启用了
--exclude命令行参数。
- 全局配置或仓库配置中设置了
- 现象:
dnf list available不显示目标包,但dnf repoquery --repo=xxx package_name可查到。
场景 4: 架构或版本不匹配
- 原因:
- 包的
arch不在系统支持的架构列表中(如i686包在x86_64系统上默认隐藏)。 - 包的
epoch:version-release不符合仓库元数据中的定义。
- 包的
- 现象:
dnf list available显示部分包,但特定包缺失。
场景 5: 仓库元数据未包含该包
- 原因:
- 仓库服务器未正确生成元数据(如
createrepo_c执行失败)。 - 包被手动上传到仓库目录但未添加到元数据。
- 仓库服务器未正确生成元数据(如
- 现象:
- 通过 HTTP 直接访问仓库 URL 可看到 RPM 文件,但元数据中无记录。
完整流程示例(代码视角)
-
参数解析:
# main.user_main(["list", "available", "-c", "xxx.repo"]) args = Cli().parse_commands() # 解析为 {command: 'list', available: True, config_file: 'xxx.repo'} -
配置初始化:
base = dnf.Base() base.conf.config_file_path = args.config_file # 加载 xxx.repo base.repos.repopulate() # 重新生成仓库列表 -
元数据加载:
base.repos.all().enable() # 启用所有仓库(包括自定义仓库) base.fill_sack() # 构建 Sack -
执行查询:
query = base.sack.query().available() for pkg in query:print(pkg.name, pkg.version)
调试与排查方法
- 查看仓库状态:
dnf repolist -v --config=xxx.repo - 检查元数据缓存:
ls /var/cache/dnf/xxx*/ # 确认 primary.xml 存在 - 手动下载元数据:
curl [baseurl]/repodata/repomd.xml # 验证仓库可达性
通过以上分析,可系统化定位包信息缺失的根本原因。
相关文章:
yum list查询时部分包查找不到流程分析
以下是针对 yum list available -c xxx.repo(对应 DNF 的命令行操作)的详细流程解读,包括参数解析、配置初始化、元数据加载、数据库查询,以及读取不到特定包的场景分析。 1. 命令行参数解析与入口函数 代码入口: dnf.cli.main.m…...
MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略
MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略 MySQL篇(六)MySQL 分库分表:应对数据增长挑战的有效策略一、引言二、为什么需要分库分表2.1 性能瓶颈2.2 存储瓶颈2.3 高并发压力 三、分库分表的方…...
Java基础:面向对象高级(四)
内部类(类中五大成分之一) 四种形式 成员内部类【了解】 静态内部类【了解】 局部内部类【了解】 匿名内部类【重点】 枚举 泛型 什么是泛型 泛型类-模拟ArrayList 泛型接口-操作学生,老师增删改查 泛型方法 泛型擦除和注意事项...
easy-poi 一对多导出
1. 需求: 某一列上下两行单元格A,B值一样且这两个单元格, 前面所有列对应单元格值一样的话, 就对A,B 两个单元格进行纵向合并单元格 1. 核心思路: 先对数据集的国家,省份,城市...... id 身份证进行排序…...
python通过调用海康SDK打开工业相机(全流程)
首先打开海康机器人-机器视觉-下载中心 下载最新版的 MVS 安装后打开目录找到 ...\MVS\Development\Samples\Python 将MvImport内所有文件拷贝至工作目录 然后到 C:\Program Files (x86)\Common Files\MVS\Runtime 找到适合自己系统的版本,将整个文件夹拷贝至工…...
网络安全防御核心原则与实践指南
一、四大核心防御原则 A. 纵深防御原则(Defense in Depth) 定义:通过在多个层次(如网络、系统、应用、数据)设置互补的安全措施,形成多层次防护体系。 目的:防止单一漏洞导致整体安全失效&…...
manim,制作专业的数学公式动画
manim是一个Python第三方库,全称是mathematical animation engine(数学动画引擎)。manim用于解说线性代数、微积分、神经网络、黎曼猜想、傅里叶变换以及四元数等数学概念。 manim使你能够以编程的方式创建精确的数学图形、动画和场景。与传统的几何画板等绘图软件不同,man…...
小刚说C语言刷题——第15讲 多分支结构
1.多分支结构 所谓多分支结构是指在选择的时候有多种选择。根据条件满足哪个分支,就走对应分支的语句。 2.语法格式 if(条件1) 语句1; else if(条件2) 语句2; else if(条件3) 语句3; ....... else 语句n; 3.示例代码 从键盘输入三条边的长度,…...
[ctfshow web入门] web6
前置知识 入口点(目录)爆破 还记得之前说过网站的入口的吗,我们输入url/xxx,其中如果url/xxx存在,那么访问成功,证明存在这样一个入口点;如果访问失败则证明不存在此入口点。所以我们可以通过遍历url/xxx,…...
简单程序语言理论与编译技术·22 实现一个从AST到RISCV的编译器
本文是记录专业课“程序语言理论与编译技术”的部分笔记。 LECTURE 22(实现一个从AST到RISCV的编译器) 一、问题分析 1、完整的编译器(如LLVM)需先完成AST到IR的转换,并进行代码优化,再到汇编࿰…...
Business English Certificates (BEC) 高频词汇学习
Business English Certificates {BEC} 高频词汇 References Cambridge English: Business Certificates, also known as Business English Certificates (BEC), are a suite of three English language qualifications for international business. abandon /əˈbndən/ vt. …...
lua和C的交互
1.C调用lua例子 #include <iostream> #include <lua.hpp>int main() {//用于创建一个新的lua虚拟机lua_State* L luaL_newstate();luaL_openlibs(L);//打开标准库/*if (luaL_dofile(L, "test.lua") ! LUA_OK) {std::cerr << "Lua error: &…...
Css:如何解决绝对定位子元素内容被父级元素overflow:hidden属性剪裁
一、问题描述 今天小伙伴提了一个bug,在点击列表项的“…”按钮应该出现的悬浮菜单显示不完整: 二、问题排查 一般这种问题,是由于悬浮菜单采用的是绝对定位,而父级采用了overflow:hidden属性。但需要注意的是,这里的…...
RoMo: Robust Motion Segmentation Improves Structure from Motion
前言 看起来像是一篇投稿CVPR的文章,不知道被哪个瞎眼审稿人拒了。同期还有一篇CVPR被接收的工作Segment Any Motion in Videos,看起来不如这篇直白(也可能是因为我先看过spotlesssplats的缘故),后面也应该一并介绍了…...
MCP 极简入门 - 三分钟 Cline + Smithery 运行 time 服务
文章目录 一、🚀 初识Smithery:AI服务的新大陆找到心仪的服务 二、Cline 编辑配置文件🔧1、打开配置文件2. 添加Time Server配置3. 验证配置效果 三、💬 实战对话:让AI告诉你时间四、服务管理小技巧🔄&…...
基本机动飞行性能
机动飞行时描述飞机在给定构型和发动机工作状态下改变飞行速度、飞行高度和飞行方向的能力 1. 水平加(减)速 水平加(减)速性能反映飞机在水平面内改变直线飞行速度的能力。描述水平加(减)速性能的参数包括…...
ES6 新特性全面总结
ES6 新特性全面总结 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多强大的新特性,极大地提升了JavaScript的开发体验和能力。以下是ES6主要新增知识点的详细总结: (一)、ES6变量声明:let 和 const 详解 一、let 和…...
【Linux】进程间通信、匿名管道、进程池
一.什么是通信 进程间通信(Inter-Process Communication,IPC),是指在操作系统中,不同进程之间进行数据交换和同步的机制。由于每个进程通常拥有独立的内存空间,进程间无法直接访问对方的内存,因此需要通过特定的机制来实现通信和…...
【HTML】纯前端网页小游戏-戳破彩泡
分享一个简单有趣的网页小游戏 - 彩色泡泡爆破。玩家需要点击屏幕上随机出现的彩色泡泡来得分。 <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…...
【MATLAB定位例程】TDOA(到达时间差)的chan-tylor,三维环境,附完整代码
该代码实现了基于三维空间的动态目标TDOA定位,结合了Chan算法(解析解)与Taylor级数展开法(迭代优化)的双重优势。 文章目录 运行结果MATLAB代码代码讲解代码功能概述核心算法原理代码结构解析可视化与结果分析运行结果 定位示意图: 三轴状态曲线: 三轴误差曲线: MA…...
数字化转型中的开源AI智能客服与S2B2C商城小程序的融合创新
摘要 数字经济时代,企业需通过技术重构用户交互与供应链体系。本文以“开源AI智能客服”“AI智能名片”及“S2B2C商城小程序”为核心,研究三者如何通过技术协同与场景化应用实现企业营销、客户服务与供应链管理的智能化升级。通过案例分析、技术架构设…...
重生之我是去噪高手——diffusion model
diffusion model是如何运作的? 想象一下,你有一张清晰的图片。扩散模型的核心思想分为两个过程: 前向过程(Forward Process / Diffusion Process):逐步加噪反向过程(Reverse Process / Denois…...
【C#】.net core 6.0 依赖注入常见问题之一,在构造函数使用的类,都需要注入到容器里,否则会提示如下报错,让DeepSeek找找原因,看看效果
🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…...
论文阅读笔记——RDT-1B: A DIFFUSION FOUNDATION MODEL FOR BIMANUAL MANIPULATION
RDT-1B 论文 模型表达与泛化能力:由于双臂操作中动作空间维度是单臂空间的两倍,传统方法难以建模其多模态分布。 数据:双臂数据少且不同机器人的物理结构和动作空间差异(如关节数、运动范围)导致数据分布不一致&#x…...
Vue中将pdf文件转为图片
平时开发中,我们经常遇到的场景应该是调用后端接口返回给前端pdf格式的文件流,然后我们可以通过URL.createObjectURL的方式转为object url临时路径然后可以通过window.open的方式来打开一个新的浏览器页签来进行预览,效果如下图: 但有时候这样满足不了的需求,它不想这样预…...
day39——输入操作:多值输入
数组输入: int main() {//***** 1、多值输入(C)/*输入:3 --> 3个值5 4 9*/int n;cin >> n; //输入个数const int MAX_SIZE 0xFFFF;//限定最大个数int a[MAX_SIZE];for (int i 0; i < n; i) {//用 n 作控制输入…...
微软的 Copilot 现在可以浏览网页并为您执行操作
在庆祝其 50 岁生日之际,微软正在向其人工智能驱动的 Copilot 聊天机器人传授一些新技巧。 从 BASIC 到 AI,改变世界的公司:微软 微软表示,Copilot 现在可以在“大多数网站”上采取行动,使其能够预订门票、预订餐厅等…...
elasticsearch 7.17 索引模板
文章目录 概要 概要 模板 import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; import cn.introns.framework.es.builder.OperationsBuilder; import java.util.HashMap; import java.util.Map;abstract class AbstractBuilder<T extends Abstrac…...
深入理解Python元组:从基础到高级应用
1. 元组基础认知 1.1 什么是元组 不可变序列:元组(tuple)是Python内置的不可变序列类型异构容器:可以存储不同类型的数据(与列表类似)语法特征:使用圆括号()定义,元素间用逗号分隔 # 基本示例 t1 (1, 2…...
【零基础入门unity游戏开发——动画篇】unity旧动画系统Animation组件的使用
考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、…...
