yum list查詢時部分包查找不到流程分析

以下是針對 yum list available -c xxx.repo(對應 DNF 的命令行操作)的詳細流程解讀,包括參數解析、配置初始化、元數據加載、數據庫查詢,以及讀取不到特定包的場景分析。


1. 命令行參數解析與入口函數

代碼入口: dnf.cli.main.main() -> user_main(sys.argv[1:])

  • 參數處理流程:
    1. 參數分割:

      • sys.argv[1:] 接收命令行參數,例如 ["list", "available", "-c", "xxx.repo"]
      • -c 參數指定自定義配置文件路徑(覆蓋默認的 /etc/dnf/dnf.conf)。
      • xxx.repo 是用戶自定義倉庫文件(需明確路徑,如 /path/to/xxx.repo)。
    2. CLI 解析邏輯:

      • DNF 使用 argparse 解析參數,關鍵模塊在 dnf.cli.cli.Cli 中。
      • list 是子命令,對應 dnf.cli.commands.list.ListCommand 類。
      • availablelist 的子參數,表示列出未安裝但倉庫中存在的包。
      • 關鍵代碼片段:
        # 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()
        

2. 配置初始化與倉庫加載

代碼模塊: dnf.base.Base, dnf.conf.Conf

  • 配置加載順序:

    1. 默認配置:
      • 讀取 /etc/dnf/dnf.conf,初始化全局配置對象 Conf
    2. 自定義配置:
      • -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

  • 元數據加載流程:
    1. 元數據下載:

      • 對每個啟用的倉庫(包括 xxx.repo 中的倉庫),調用 Repo.load() 方法。
      • 下載 repomd.xml 并驗證簽名(若配置了 gpgcheck=1)。
      • 下載 primary.xmlfilelists.xml 等元數據文件到緩存目錄(如 /var/cache/dnf/)。
    2. 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

  • 查詢邏輯:

    1. 初始化查詢對象:
      # dnf/commands/list.py
      query = self.base.sack.query()
      available = query.available()  # 過濾未安裝的包
      
    2. 過濾與輸出:
      • 根據 nameversion 等條件過濾包。
      • 輸出結果到終端,格式化為表格。
  • 關鍵數據結構:

    • Sack 中的 packages 列表存儲所有 Package 對象。
    • Query 對象通過 filter() 方法實現高效檢索(如 name="bash")。

5. 讀取不到特定包的可能場景

以下場景可能導致無法讀取倉庫中的特定包信息:

場景 1: 倉庫配置錯誤
  • 原因:
    • xxx.repo 文件中的 baseurlmetalink 配置錯誤(如 URL 不可達)。
    • 倉庫未啟用(enabled=0)。
  • 現象:
    • 執行 dnf repolist 時目標倉庫未列出。
    • 日志中提示 Repository 'xxx' is missing valid metadata
場景 2: 元數據未更新
  • 原因:
    • 本地緩存過期(metadata_expire 超時)且未主動執行 dnf clean alldnf 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 文件,但元數據中無記錄。

完整流程示例(代碼視角)

  1. 參數解析:

    # main.user_main(["list", "available", "-c", "xxx.repo"])
    args = Cli().parse_commands()  # 解析為 {command: 'list', available: True, config_file: 'xxx.repo'}
    
  2. 配置初始化:

    base = dnf.Base()
    base.conf.config_file_path = args.config_file  # 加載 xxx.repo
    base.repos.repopulate()  # 重新生成倉庫列表
    
  3. 元數據加載:

    base.repos.all().enable()  # 啟用所有倉庫(包括自定義倉庫)
    base.fill_sack()  # 構建 Sack
    
  4. 執行查詢:

    query = base.sack.query().available()
    for pkg in query:print(pkg.name, pkg.version)
    

調試與排查方法

  1. 查看倉庫狀態:
    dnf repolist -v --config=xxx.repo
    
  2. 檢查元數據緩存:
    ls /var/cache/dnf/xxx*/  # 確認 primary.xml 存在
    
  3. 手動下載元數據:
    curl [baseurl]/repodata/repomd.xml  # 驗證倉庫可達性
    

通過以上分析,可系統化定位包信息缺失的根本原因。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/900252.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/900252.shtml
英文地址,請注明出處:http://en.pswp.cn/news/900252.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

k8s 1.23升級1.24

0、簡介 這里只用3臺服務器來做一個簡單的集群,當前版本是1.23.17目標升級到1.24.17 地址主機名192.168.160.40kuber-master-1192.168.160.41kuber-master-2192.168.160.42kuber-node-1 我這里設置的master2可調度pod,將master2的污點去掉 kubectl de…

# 實時人臉識別系統:基于 OpenCV 和 Python 的實現

實時人臉識別系統:基于 OpenCV 和 Python 的實現 在當今數字化時代,人臉識別技術已經廣泛應用于各種場景,從手機解鎖到安防監控,再到智能門禁系統。今天,我將通過一個完整的代碼示例,詳細講解如何使用 Pyt…

Linux:(五種IO模型)

目錄 一、對IO的重新認識 二、IO的五種模型 1.阻塞IO 2.非阻塞IO 3.信號驅動IO 4.IO多路轉接 5.異步IO 6.一些概念的解釋 三、非阻塞IO的代碼實現 1.fcntl 2.實現主程序 一、對IO的重新認識 如果有人問你IO是什么,你該怎么回答呢? 你可能會說…

將電腦控制手機編寫為MCP server

文章目錄 電腦控制手機后,截屏代碼復習MCP server構建修改MCP的config文件測試效果困惑電腦控制手機后,截屏代碼復習 def capture_window(hwnd: int, filename: str = None) -> dict:""&

[ctfshow web入門] web6

前置知識 入口點(目錄)爆破 還記得之前說過網站的入口的嗎,我們輸入url/xxx,其中如果url/xxx存在,那么訪問成功,證明存在這樣一個入口點;如果訪問失敗則證明不存在此入口點。所以我們可以通過遍歷url/xxx,…

【計算機網絡】Linux配置SNAT策略

什么是NAT? NAT 全稱是 Network Address Translation(網絡地址轉換),是一個用來在多個設備共享一個公網 IP上網的技術。 NAT 的核心作用:將一個網絡中的私有 IP 地址,轉換為公網 IP 地址,從而…

Mathematics | Branch

注:本文為“遇見數學”翻譯的 “數學分支概覽” 兩篇文章合輯。 數學世界的版圖:主要分支概覽(上) 原創 遇見數學 2025 年 04 月 03 日 12:02 河南 數學的分支(Areas of Mathematics) 在文藝復興之前&am…

Ubuntu(CentOS、Rockylinux等)快速進入深度學習pytorch環境

這里寫自定義目錄標題 安裝進入系統(如Ubuntu22.04)安裝anacondapip、conda換源pip換源conda換源 安裝nvidia安裝pytorch環境針對于wsl的優化 安裝進入系統(如Ubuntu22.04) docker 、 wsl 、 雙系統 、服務器系統 推薦 Ubuntu 20…

什么是混雜模式?為什么 macvlan 依賴它

在 macvlan 場景中,物理網絡是否支持混雜模式(Promiscuous Mode) 直接影響 macvlan 虛擬接口的通信能力。以下是詳細解釋和操作指南: 一、什么是混雜模式?為什么 macvlan 依賴它? 混雜模式的定義 當物理網絡…

物理數據流圖

物理數據流圖(Physical Data Flow Diagram, PDFD)詳解 物理數據流圖是結構化系統分析中的一種建模工具,用于描述系統在物理環境下的具體實現方式,包括硬件、軟件、人工操作和物理文件等實際組成部分。它與**邏輯數據流圖&#xf…

Linux開發工具——vim

📝前言: 上篇文章我們講了Linux開發工具——apt,這篇文章我們來講講Linux開發工具——vim 🎬個人簡介:努力學習ing 📋個人專欄:Linux 🎀CSDN主頁 愚潤求學 🌄其他專欄&a…

在 Langflow 中構建靈活的自定義組件:從基礎到高級實踐

本文深入探討了如何在 Langflow 平臺中創建功能豐富的自定義組件。通過詳細的目錄結構解析、分步實現指南和多個實戰案例,幫助開發者掌握利用 Python 生態擴展低代碼平臺的方法,打造高效的數據處理流程。 理解組件架構設計 自定義組件是在 Langflow 中創…

stm32+LTR-390UV使用教程含源碼

stm32LTR-390UV使用教程含源碼 (csdn首發源碼),本人大四學生,考研已上岸,畢設做的全向輪小車,這個是環境檢測部分LTR-390UV使用教程 文章目錄 目錄 文章目錄 前言 一、硬件準備與連接 二、數據手冊 1.…

【嵌入式系統設計師】知識點:第2章 嵌入式系統硬件基礎知識

提示:“軟考通關秘籍” 專欄圍繞軟考展開,全面涵蓋了如嵌入式系統設計師、數據庫系統工程師、信息系統管理工程師等多個軟考方向的知識點。從計算機體系結構、存儲系統等基礎知識,到程序語言概述、算法、數據庫技術(包括關系數據庫、非關系型數據庫、SQL 語言、數據倉庫等)…

Java 項目灰度發布的詳細實現與實踐

前言 灰度發布是一種通過逐步將新功能或更新推向一部分用戶來降低上線風險的技術。本文將詳細介紹如何在 Java 項目中實現灰度發布,并提供相關的配置參數、代碼示例以及 uml 圖,幫助您更好地理解和應用這一技術。 一、灰度發布的核心思想 灰度發布的核…

使用 Swift 實現 LRU 緩存淘汰策略

📌 實現思路 一、核心目標 我們要實現一個緩存類: 支持通過 get(key) 獲取緩存的值;支持通過 put(key, value) 寫入緩存;緩存容量有限,當超過容量時要淘汰最久未使用的元素。 二、為什么用「哈希表 雙向鏈表」 功…

C#中為自定義控件設置工具箱圖標

在C#中為自定義控件設置工具箱圖標,可通過以下步驟實現: ### 步驟說明: 1. **準備圖標文件** - 創建或選擇一個16x16像素的位圖(.bmp)文件,建議使用透明背景以確保清晰顯示。 2. **添加位圖到項目** -…

Linux數據庫:【數據庫基礎】【庫的操作】【表的操作】

目錄 一.數據庫基礎 1.1什么是數據庫 1.2基本使用 1.2.1連接服務器 1.2.2服務器,數據庫,表關系 1.2.3使用案例 1.2.4數據存儲結構 ?編輯 1.3MySQL架構 1.4SQL分類 1.5存儲引擎 1.5.1什么是存儲引擎 1.5.2查看存儲引擎 ?編輯 1.5.3存儲引擎…

CKPT文件是什么?

檢查點(Checkpoint,簡稱ckpt)是一種用于記錄系統狀態或數據變化的技術,廣泛應用于數據庫管理、機器學習模型訓練、并行計算以及網絡安全等領域。以下將詳細介紹不同領域中ckpt檢查點的定義、功能和應用場景。 數據庫中的ckpt檢查點…

Redis的公共操作命令

目錄 1.Key操作命令1.1 keys *1.2 exists <key]>1.3 type <key>1.4 del <key>1.5 unlink <key>1.6 ttl <key>1.7 expire <key> <秒數>1.8 move <key> <index> 2.庫操作命令2.1 select <index>2.2 dbsize2.3 flush…