亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 59582 | 回復(fù): 65
打印 上一主題 下一主題

Linux平臺軟件管理系統(tǒng)設(shè)計與規(guī)劃-中級篇(3)-深入理解和使用yum來管理RPM包 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-12-29 13:36 |只看該作者 |倒序?yàn)g覽
本帖最后由 duanjigang 于 2013-01-05 11:23 編輯

本篇涉及的內(nèi)容有:
(1): RPM 在 linux系統(tǒng)上如何運(yùn)行淺解與要點(diǎn)總結(jié)
(2): YUM 服務(wù)出現(xiàn)和要素分析
(3): 怎樣搭建和使用 yum 服務(wù)
(4): createrepo 和 RPM 的索引文件分析
(5): yum 本地cache
(6): yum clean 源碼淺析
(7): yum 配置文件詳解
(: yum插件剖析與開發(fā)


========================================
在寫完 “RPM認(rèn)知” 和 ”RPM制作與SPEC文件“ 兩篇后,本來計劃再整理學(xué)習(xí)下一篇 ”RPM如何在linux系統(tǒng)上工作“的,但是考慮了下,因?yàn)槲覍?RPM 的源碼還沒有閱讀,只能說出
大概的動作/流程等,細(xì)節(jié)言不明,難以從開發(fā)人員的角度來分析,只好就粗糙點(diǎn)從運(yùn)維人員的角度來總結(jié)下。

關(guān)于 ”RPM如何在linux系統(tǒng)上工作“的內(nèi)容,就簡單總結(jié)了幾點(diǎn)常用的知識,在本篇開頭來講下。

很慶幸有這個空閑的周末,蝸居西溪旁,小雨漫天下,臥室微冷,聆聽聽著《夜的鋼琴曲》,慢慢總結(jié)一下這篇,廢話不多,開始。

評分

參與人數(shù) 2可用積分 +18 收起 理由
Godbach + 6 很給力!
send_linux + 12 很給力!

查看全部評分

論壇徽章:
0
2 [報告]
發(fā)表于 2012-12-29 14:02 |只看該作者
本帖最后由 duanjigang 于 2012-12-29 14:10 編輯

從宏觀上來說,linux操作系統(tǒng)(只看OS層面,不談硬件)就是由靜態(tài)的文件系統(tǒng)和動態(tài)的進(jìn)程組成的(不知道這樣說合適不合適)。文件系統(tǒng)記錄了 ”我是什么樣的,我有什么“,而進(jìn)程則能夠用文件系統(tǒng)的這些功能動態(tài)的改變OS的狀態(tài)或者對外提供服務(wù)。
  其實(shí)這樣的OS也就能夠運(yùn)行了,為什么還要出現(xiàn)軟件包呢?大概是人們?yōu)榱朔奖愕墓芾聿僮飨到y(tǒng)吧,就跟一個國家都是零散的百姓而沒有組織機(jī)構(gòu)一樣,那樣會很難于管理,為此才把地方劃為郡縣,省市,縣,鄉(xiāng),村,甚至大隊~~。理想狀況下,這樣任意一個人需要服務(wù),都可以直接找自己歸屬的組織去尋求幫助。工作起來效率提高。
   操作系統(tǒng)當(dāng)然不能夠只是零散的文件組成,也需要對這些文件/程序進(jìn)行管理,因此,就有了軟件包的概念。某些文件屬于某個軟件包,某個軟件包有某些文件。這樣的有序性
是提供了管理效率,但是也是有付出的,那就是存儲,需要有額外的空間來記錄文件和包的對應(yīng)關(guān)系。當(dāng)然,在一個包內(nèi)部,這是不需要的,因?yàn)槿魏芜诉硕紝儆谒诘倪@個包,當(dāng)環(huán)境轉(zhuǎn)移到OS層面之后,多個軟件包要在OS上共存,有序管理,我們不僅要記錄文件到包的關(guān)系,有時也要記錄包和包之間的關(guān)系。
    逐漸的,當(dāng)這些信息被梳理并且記錄時,就形成了軟件包數(shù)據(jù)庫的概念。對 RPM 而言就是 RPM數(shù)據(jù)庫。

以前沒有包的概念時,是人類直接通過工具操作文件,現(xiàn)在介入了數(shù)據(jù)庫的操作。簡單畫了個圖,表達(dá)此改變,如下:


自然而然,我們大概也就猜到了 RPM 是如何在OS上工作的: 用戶通過工具(rpm命令)管理軟件包,也就是對文件系統(tǒng)進(jìn)行增刪查改,在增刪查改的同時(也可能先于或者晚于),也對RPM的數(shù)據(jù)庫進(jìn)行了增刪查改操作,總之,RPM數(shù)據(jù)庫是為了方便用戶通過工具來管理系統(tǒng)上的文件系統(tǒng)或者說軟件包。

下面我們列舉下比較重要的幾個方面,都是跟RPM在OS上的管理相關(guān)的。

論壇徽章:
0
3 [報告]
發(fā)表于 2012-12-29 14:11 |只看該作者
本帖最后由 duanjigang 于 2012-12-29 14:17 編輯

(1)關(guān)于 linux 主機(jī)上的 RPM 數(shù)據(jù)庫

RPM 在 linux 機(jī)器上工作原來是比較明確的,首先有實(shí)際的rpm解壓縮并且安裝后的文件;另外有Rpm 的DB文件,
存儲這些安裝了的 rpm 的信息,這些庫中信息在 RPM進(jìn)行安裝,升級和卸載時進(jìn)行更新。

RPM命令對兩者的操作有: (1):對DB庫進(jìn)行增刪查該 (2):對文件系統(tǒng)進(jìn)行增加和刪除和讀取。
結(jié)合起來看:

(1): RPM的安裝/升級,寫入DB庫,寫文件系統(tǒng),生成安裝列表和服務(wù),配置等,執(zhí)行安裝時腳本。
(2): RPM卸載,刪除DB庫,刪除文件系統(tǒng)中歸屬于該軟件包的文件,執(zhí)行卸載時腳本。
(3): RPM查詢, 讀取DB庫/文件并且顯示。



RPM 的在主機(jī)上的數(shù)據(jù)庫有好多個,根據(jù)不同的應(yīng)用類型,采用不同的訪問方法,可以看下:

  1. file /var/lib/rpm/* | grep Berkeley
  2. /var/lib/rpm/Basenames:      Berkeley DB (Hash, version 8, native byte-order)
  3. /var/lib/rpm/Conflictname:   Berkeley DB (Hash, version 8, native byte-order)
  4. /var/lib/rpm/Dirnames:       Berkeley DB (Btree, version 9, native byte-order)
  5. /var/lib/rpm/Filemd5s:       Berkeley DB (Hash, version 8, native byte-order)
  6. /var/lib/rpm/Group:          Berkeley DB (Hash, version 8, native byte-order)
  7. /var/lib/rpm/Installtid:     Berkeley DB (Btree, version 9, native byte-order)
  8. /var/lib/rpm/Name:           Berkeley DB (Hash, version 8, native byte-order)
  9. /var/lib/rpm/Packages:       Berkeley DB (Hash, version 8, native byte-order)
  10. /var/lib/rpm/Providename:    Berkeley DB (Hash, version 8, native byte-order)
  11. /var/lib/rpm/Provideversion: Berkeley DB (Btree, version 9, native byte-order)
  12. /var/lib/rpm/Pubkeys:        Berkeley DB (Hash, version 8, native byte-order)
  13. /var/lib/rpm/Requirename:    Berkeley DB (Hash, version 8, native byte-order)
  14. /var/lib/rpm/Requireversion: Berkeley DB (Btree, version 9, native byte-order)
  15. /var/lib/rpm/Sha1header:     Berkeley DB (Hash, version 8, native byte-order)
  16. /var/lib/rpm/Sigmd5:         Berkeley DB (Hash, version 8, native byte-order)
  17. /var/lib/rpm/Triggername:    Berkeley DB (Hash, version 8, native byte-order)
復(fù)制代碼
能夠看到,主要是 HASH 和 BTREE 這兩種訪問方式。(很奇怪,version 8 的是 HASH, version 9的是BTREE ?是應(yīng)用相關(guān),還純粹是作者愛好呢?)

RPM 的所有DB,都是從 /var/lib/rpm/Packages 生成的?梢宰鰝實(shí)驗(yàn),把除了 Packages 以外的其它文件全部刪掉。
然后重新 rpm --rebuilddb -vv
這些文件都會一一生成,因?yàn)闃?gòu)成這幾個新的db文件的信息都在Packages中包含了。(如果你把這個文件干掉了,那就悲催了,
曾經(jīng)遇到有人把這個文件給刪掉了,只好從同組配置接近的機(jī)器給他拷貝了一個os和arch一樣的機(jī)器的Packages,重新生成了下db,還好,能繼續(xù)用,呵呵)。因?yàn)檫@個文件中記錄了你的機(jī)器安裝的所有RPM和文件列表,一旦這個文件丟失了,rpm就不知道你的機(jī)器上有哪些rpm了,當(dāng)你通過
rpm -qf path 查詢某個二進(jìn)制文件屬于哪個rpm時,也不會有結(jié)果輸出。


關(guān)于 /var/lib/rpm/Packages 這個 DB 文件的最初來源,我分析(結(jié)合猜測)是這樣的:

首先,在安裝(或者OS安裝時)每一個 rpm 文件的時候,rpm 命令都會把要安裝的 rpm 包的信息分析出來,包括我們在第一篇看到的所有TAG還有文件列表等信息;
然后會把這些信息寫入 /var/lib/rpm/Packages 文件中,如果這個文件不存在,就創(chuàng)建;當(dāng)刪除包時,就會從 /var/lib/rpm/Packages 中
刪除與該包相關(guān)的所有信息。該文件中記錄了所有 rpm 的全量信息,因此,我們通過 rpm 命令查詢時,才能夠看到那么多燦爛和豐富的信息。

以rpm -qf 和 rpm -ql 為例:
比如,為了能從 xshell 拷貝文件到windows機(jī)器,我經(jīng)常會用 sz/rz命令,但是有些機(jī)器上就是沒這個命令,
要安裝,又不知道它在哪個包,怎么辦,這時就需要用 rpm -qf 來查詢了:

找一臺安裝了 sz/rz 命令的機(jī)器:

  1. # which sz
  2. /usr/bin/sz
  3. # rpm -qf /usr/bin/sz
  4. lrzsz-0.12.20-22.1
復(fù)制代碼
喔,我們發(fā)現(xiàn)sz和rz是在 lrzsz 這個包中的,然后在需要的機(jī)器上 rpm/yum 安裝 lrzsz 包即可。

那么,rpm -qf 命令路徑 就能查到這個命令屬于那個包,這是怎么做到的呢?

首先我們知道安裝 lrzsz 時 rpm 會把 這個包的所有信息寫入 /var/lib/rpm/Packages 文件,這個包包含的文件列表也會寫入
到 這個文件中,然后才會更新生成 /var/lib/rpm 中的其它DB文件(個人理解,其它DB文件就是為了查詢加速而用生成的cache.)

然后,當(dāng)執(zhí)行

  1. rpm -qf /usr/bin/sz
復(fù)制代碼
時,rpm 就會去 /var/lib/rpm/Packages 中(或者其它c(diǎn)ache文件中)查詢包含 /usr/bin/sz 這個路徑的
包,當(dāng)然就查到了是 lrzsz.

有人說,可能查到多個包么?這個是不可能的,因?yàn)?rpm 在安裝 rpm 文件的時候,也就是往 /var/lib/rpm/Packages
中寫數(shù)據(jù)的時候,會檢查這個rpm 中包含的文件列表是否已經(jīng)在本機(jī)安裝的其它包中出現(xiàn)了,如果找到了,就會警告: 這個文件和其它某個包中的
某某文件沖突了的錯誤信息,這個現(xiàn)象做SA的同學(xué)應(yīng)該都見過。

實(shí)驗(yàn):

  1. ls -alt /var/lib/rpm/Packages
  2. -rw-r--r-- 1 rpm rpm 19234816 Dec 27 09:30 /var/lib/rpm/Packages
復(fù)制代碼
我們能夠看到,這個文件只對root 可以寫,我們嘗試改下它的屬性:

  1. chattr +i /var/lib/rpm/Packages
復(fù)制代碼
設(shè)置不可改變屬性,然后嘗試安裝包:

  1. rpm -ivh RPMS/i386/test-baby-1.1-1.i386.rpm
  2. error: cannot open Packages index using db3 - Permission denied (13)
  3. error: cannot open Packages database in /var/lib/rpm
復(fù)制代碼
因?yàn)閞pm 沒有權(quán)限去寫 Packages  這個數(shù)據(jù)庫文件。

  1. # chattr -i /var/lib/rpm/Packages
  2. rpm -ivh RPMS/i386/test-baby-1.1-1.i386.rpm
  3. Preparing...                ########################################### [100%]
  4.    1:test-baby              ########################################### [100%]
復(fù)制代碼
這下就成功了,再次驗(yàn)證了 rpm 在包安裝時對 /var/lib/rpm/Packages 的寫操作確實(shí)是存在的。
同樣,你也可以同樣方法測試下卸載包時對 /var/lib/rpm/Packages  文件的寫操作是否存

論壇徽章:
0
4 [報告]
發(fā)表于 2012-12-29 14:20 |只看該作者
本帖最后由 duanjigang 于 2012-12-29 14:25 編輯

(2)關(guān)于 /var/log/rpmpkgs 和 /etc/cron.daily/rpm

在linux系統(tǒng)上能夠看到

  1. # rpm -qf /etc/cron.daily/rpm
  2. rpm-4.4.2-37.el5
復(fù)制代碼
/etc/cron.daily/rpm 是 rpm 這個包帶的一個每日執(zhí)行的crontab任務(wù)。
/etc/crontab 中配置每天4:02執(zhí)行 cron.daily 里面的計劃任務(wù)。
看下這個腳本的內(nèi)容:

  1. cat  /etc/cron.daily/rpm
  2. #!/bin/sh

  3. /bin/rpm -qa --qf '%{name}-%{version}-%{release}.%{arch}.rpm\n' 2>&1 \
  4. | /bin/sort > /var/log/rpmpkgs
復(fù)制代碼
就是把 系統(tǒng)上所有 rpm 的列表導(dǎo)出下,排序存儲在  /var/log/rpmpkgs 這個文件中。
這個文件有什么作用呢?個人分析應(yīng)該有以下兩個作用:

(1): 可以作為rpm -qa 的 cache文件,如果這個文件在很短時間內(nèi)剛更新,rpm -qa 直接打印該文件內(nèi)容即可。
(2): 有人可能已經(jīng)想到了,它可以幫助恢復(fù)你的rpm 數(shù)據(jù)庫文件,如果你不小心把 /var/lib/rpm/Packages  弄壞或者丟了,
但是很幸運(yùn),var/log/rpmpkgs 這個文件還在,而且是比較新的,然后你就可以如下恢復(fù)你的rpm 數(shù)據(jù)庫了。
   
第一: 找到 系統(tǒng)的安裝鏡像包,也就是包含了所有OS的RPM列表。
第二:寫個腳本,讀取 var/log/rpmpkgs 文件,每行是一個rpm 文件,進(jìn)行安裝,這里的安裝可不是實(shí)際安裝。而是
        要采用一個特殊的功能,看下 rpm 的 man 手冊:

  1.         --justdb
  2.               Update only the database, not the filesystem.
復(fù)制代碼
只是更新rpm 的數(shù)據(jù)庫,并不更新系統(tǒng)文件(好像這個安裝過程也是 --noscripts的,如果你真的走到這一步,可以檢驗(yàn)下,然后告訴我,呵呵)。

論壇徽章:
0
5 [報告]
發(fā)表于 2012-12-29 14:27 |只看該作者
本帖最后由 duanjigang 于 2012-12-29 14:30 編輯

(3) rpm/rpmq/yum/rpmDB hang 住,死鎖的情況

在實(shí)際工作中,有時會碰到執(zhí)行rpm/yum 等命令時,沒有任何反應(yīng),進(jìn)程 hang 住的現(xiàn)象,用 strace -p pid 會發(fā)現(xiàn)進(jìn)程 hang 在對 對futex 的操作上,
據(jù)有些文章說這個是berkeley db 支持多進(jìn)程操作不好導(dǎo)致DB死鎖的結(jié)果。曾經(jīng)嘗試尋找原因,但是未能跟蹤到,只總結(jié)了下解決辦法,希望對碰到的同學(xué)
有幫助。

首先查看是哪些進(jìn)程,一般無非是 rpm rpmq yum 這三個其中的若干個,直接

  1. sudo killall -9 yum rpm rpmq;
復(fù)制代碼
然后清除臨時庫文件:

  1. sudo rm -fr /var/lib/rpm/__db.00*
復(fù)制代碼
這樣就可以了。我一般給同事提供的三板斧就是:

  1. (1): sudo killall -9 rpm rpmq yum  
  2. (2): sudo rm -fr /var/lib/rpm/__db.00*
  3. (3): sudo yum clean all
復(fù)制代碼
當(dāng)然,別的原因?qū)е碌?hang 住情況,就要另當(dāng)別論了。視具體情況處理。

論壇徽章:
0
6 [報告]
發(fā)表于 2012-12-30 09:33 |只看該作者
本帖最后由 duanjigang 于 2012-12-30 17:54 編輯

開始 yum 的介紹
用 yum 服務(wù) 對 RPM 進(jìn)行管理

類似于 RPM 的出現(xiàn)一樣,yum 的出現(xiàn)也是為了方便管理而生,對于軟件包的管理,采用 rpm 文件來做載體; 安裝,部署等操作時,用 rpm 命令,基本上也夠了。
好多人現(xiàn)在可能還處于這個狀態(tài),我一年之前也是如此:只知道 rpm 能夠查看 rpm 包信息,安裝,卸載等操作,小日子得過且過也就夠了。后來,接觸的環(huán)境稍微大點(diǎn),就遇到一些問題了,大概總結(jié)了下,面臨的問題已以下幾點(diǎn)最為典型:

(1):作為開發(fā)人員,我只在32位的 rhel5.4 系統(tǒng)上開發(fā),測試。每次修改代碼后都會重新 rpmbuild包, 然后把rpm 交給同事去安裝,而且同事的操作步驟大概會是:先卸載原來的rpm, 清空安裝目錄,然后安裝新的rpm,這期間,他還可能還要備份自己的配置文件。忽然有一天,同事報告:這臺機(jī)器不能安裝你的rpm,仔細(xì)一看,是x86_64平臺的系統(tǒng),或者是4u8的系統(tǒng),也可能是6u3的系統(tǒng)。顯然,這種不同 arch 和 os release version 的環(huán)境,是單用 rpm 面臨一類問題.

(2):某人開發(fā)的 XXOO.rpm 使用了接近十個第三方庫,運(yùn)行時依賴于這些庫的so,因此安裝時,也就需要依賴于包含這些庫的rpm包, 嚴(yán)格按照規(guī)范,他在編寫 spec 文件時,寫了N 個 require 依賴,結(jié)果每次部署時,只要運(yùn)行命令:

  1. rpm -ivh XXOO.rpm
復(fù)制代碼
,就會報告找不到依賴的若干個包,面對這樣的問題,有的聰明一點(diǎn)的部署人員就會把依賴的包安裝的語句寫在一個腳本中,先執(zhí)行這個腳本安裝依賴包,然后再安裝 XXOO 這個包,這樣做即便能夠解決問題,還是很麻煩,因?yàn)槲覀兡玫絩pm后還要分析它的require list, 人為的標(biāo)明,然后先替他安裝。有木有一種機(jī)制能夠自動檢測XXOO 依賴的 rpm 并且嘗試進(jìn)行安裝呢?

(3):我開發(fā)的軟件生成的 RPM 已經(jīng)有很多版本了,每次為了升級到最新版,都需要記住最新的 RPM 文件的名字,而且是完整的名字,比如:test-daddy-1.1-1.x86_64.rpm,然后再執(zhí)行

  1. rpm -Uvh http://URL路徑/test-daddy-1.1-1.x86_64.rpm
復(fù)制代碼
才能夠安裝成功,有沒有一種機(jī)制,能夠用很簡單的方式:我只給它 RPM 的名字,就能夠自動安裝對應(yīng)包的最新版 rpm 文件呢,而且還能安裝指定版本的 rpm 呢?

(4):幾臺機(jī)器需要安裝或者管理 rpm 時,直接 rpm -i 安裝對應(yīng)OS的包即可,如果成千上萬臺機(jī)器都需要部署該軟件,而且有不同 os 版本,平臺不一樣,那該怎么辦?有同學(xué)可能會自己寫個腳本拷貝到目標(biāo)機(jī)器去執(zhí)行,自己檢查os和arch,然后安裝對應(yīng)的rpm,這也是一種辦法,但是有木有更簡潔的方式呢,通用而且靈活,簡易操作?


(5):有時候我們并不確定要裝哪個版本的包,只想看看已經(jīng)有哪些 rpm 了,然后再選擇安裝哪個。。你會怎么做?登錄rpm服務(wù)器去 find,ls ? 還是高級點(diǎn),安裝個lynx,用

  1. lynx --dump http://URL地址
復(fù)制代碼
瀏覽文件列表,然后grep選擇,再 RPM 安裝? 這樣豈不是有些太費(fèi)事?


對于上面列出的五個問題(也可能更多),yum 給提供了很好的解決方案,或者說功能接口。我想 yum 的出現(xiàn)也是由于最早的rpm使用者遇到了不止上面的五個問題等諸多難題后,總結(jié)問題特征,歸納,才設(shè)計開發(fā)出來的。

下面我們會以庖丁解牛的方式來給您闡述 yum 的強(qiáng)大功能和涉及到的知識點(diǎn),或者詳細(xì)或者粗糙,由于我個人能力有限,就只就自己知道和能夠搜索到的范圍的來說吧,有不對的地方請盡管指出。

論壇徽章:
0
7 [報告]
發(fā)表于 2012-12-30 12:00 |只看該作者
本帖最后由 duanjigang 于 2012-12-30 18:01 編輯

yum 服務(wù)構(gòu)成的要素

構(gòu)成一個完整的 yum 服務(wù),需要以下及部分:

(1):  yum 服務(wù)器上的服務(wù)倉庫 (存儲rpm文件和索引文件)
(2):  提供rpm和索引下載的網(wǎng)絡(luò)服務(wù)(http或者ftp服務(wù))
(3):  安裝客戶端的 yum 命令集 (接收用戶輸入,從服務(wù)器檢索/下載文件)
(4):  客戶端配置文件以及擴(kuò)展功能模塊。


用架構(gòu)師大會的PPT <<2012系統(tǒng)架構(gòu)師大會-Linux平臺軟件管理系統(tǒng)設(shè)計與規(guī)劃.pptx>> 中的一幅圖,來表示下這四個要素的部署關(guān)系圖:



簡單描述一下一個 rpm 從發(fā)布進(jìn) yum, 到客戶端可用的過程:

yum 中 rpm 從發(fā)布到可用的過程

1. 開發(fā)完成,RPM 已經(jīng)通過 rpmbuild 或者其它工具制作好,把 rpm 放到 yum 服務(wù)器的 rpm 倉庫目錄下 。
2. 在 yum服務(wù)器的 倉庫目錄 (具體目錄位置后面會講)執(zhí)行 createrepo 命令,該命令會掃描當(dāng)前目錄(包括子目錄)里面的rpm 文件,記錄rpm 文件的信息,寫入repodata 目錄中的索引文件中。這樣 yum 中就有了新發(fā)布的 rpm 的信息了。
3. 使用者在客戶端安裝了 yum 命令,通過配置 yum 的客戶端配置文件,指定了一個或者若干個安裝源, yum 安裝/檢索包時會去這些安裝源上檢索索引文件。
4. 使用者在客戶端使用 yum install pkgname 方式安裝包,yum命令 會把配文件中配置的 yum服務(wù)器的地址(安裝源)作為目標(biāo)服務(wù)器,通過http/ftp/file服務(wù)去 yum 服務(wù)器上下載索引文件,然后在索引文件中查找有無指定的rpm(適合在本系統(tǒng)安裝),找到的話,就按照配置中的路徑組成url地址,下載rpm, 并且在本地安裝。
5. 安裝后,索引文件和rpm包會cache到本地的cache目錄,方便下次使用,而且把安裝rpm 的信息記錄進(jìn)本地 rpm 的數(shù)據(jù)庫文件中
。


為了讀者能夠?qū)嶋H操作一把,我們給出一個實(shí)際的例子:

論壇徽章:
0
8 [報告]
發(fā)表于 2012-12-30 12:23 |只看該作者
本帖最后由 duanjigang 于 2013-01-03 13:21 編輯

搭建yum服務(wù)的簡單實(shí)例

(1): yum 服務(wù)器為 192.168.1.102, 部署網(wǎng)絡(luò)服務(wù)為 httpd, web 根目錄是 /usr/local/cme/web, 監(jiān)聽端口是TCP的81, 把制作好的 rpm test-baby-1.1-1.i386.rpm 放進(jìn)
/usr/local/cme/web/yum/ 目錄下。

(2): 創(chuàng)建索引文件,在/usr/local/cme/web/yum/  目錄下執(zhí)行命令  createrepo, 看到結(jié)果如下:

  1. createrepo --update -d -p -o . .
  2. 1/1 - test-baby-1.1-1.i386.rpm                                                  
  3. Saving Primary metadata
  4. Saving file lists metadata
  5. Saving other metadata
復(fù)制代碼
然后可以看到多了個 repodata 目錄。內(nèi)容如下:

  1. ll repodata/
  2. total 20
  3. -rw-r--r-- 1 root root  271 Dec 29 23:03 filelists.xml.gz
  4. -rw-r--r-- 1 root root  236 Dec 29 23:03 other.xml.gz
  5. -rw-r--r-- 1 root root  755 Dec 29 23:03 primary.xml.gz
  6. -rw-r--r-- 1 root root  951 Dec 29 23:03 repomd.xml
  7. drwxr-xr-x 2 root root 4096 Dec 29 23:03 update-info
復(fù)制代碼
這些就是 createrepo 命令檢索并且讀取 rpm 列表后生成的索引文件。

(3): 配置客戶端的 yum 配置文件,為了為后面的利用智能 DNS 做 yum 優(yōu)化章節(jié)做鋪墊,我們從一開始在網(wǎng)絡(luò)訪問時就采用域名而不是IP地址的方式,
首先在 客戶端的 /etc/hosts 中配置

  1. 192.168.1.102  yum.test.com
復(fù)制代碼
然后,進(jìn)入 /etc/yum.repos.d 目錄,清空該目錄下的文件(或者備份起來),創(chuàng)建 test.repo 文件內(nèi)容如下:

  1. # cat /etc/yum.repos.d/test.repo
  2. [test]
  3. name=just a test reposity
  4. baseurl=http://yum.test.com:81/yum
  5. enabled=1
  6. gpgcheck=0
  7. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
復(fù)制代碼
其中配置的 baseurl 就是告訴 yum 客戶端,檢索 rpm 的路徑是什么,然后 yum 在 list 或者 install 時,就會嘗試用這個路徑 + repodata 構(gòu)造一個索引目錄,然后就能構(gòu)造索引文件路徑,接著下載索引文件,檢索等等,在該例子中索引目錄路徑為:

  1. http://yum.test.com:81/yum/repodata
復(fù)制代碼
(4): 在客戶端執(zhí)行命令

  1. # yum clean all
  2. # yum info test-baby
復(fù)制代碼
能看到輸出如下:

  1. Available Packages
  2. Name   : test-baby
  3. Arch   : i386
  4. Version: 1.1
  5. Release: 1
  6. Size   : 4.4 k
  7. Repo   : test
  8. Summary: GNU test-baby
復(fù)制代碼
顯示了這個包的信息,注意到: Repo: test 這個輸出,表明這個包是從我們配置的 test.repo 中的源上找到的。當(dāng)然你也可以配置多個源,而且多個源之間可以有優(yōu)先級關(guān)系,這些具體配置后面再說。這樣,我們就能檢索到 rpm 了。

(5): 通過命令來安裝:

  1. #sudo yum install test-baby
復(fù)制代碼
輸出如下:

  1. Dependencies Resolved

  2. =============================================================================
  3. Package                 Arch       Version          Repository        Size
  4. =============================================================================
  5. Installing:
  6. test-baby               i386       1.1-1            test              4.4 k

  7. Transaction Summary
  8. =============================================================================
  9. Install      1 Package(s)         
  10. Update       0 Package(s)         
  11. Remove       0 Package(s)         

  12. Total download size: 4.4 k
  13. Is this ok [y/N]: y
  14. Downloading Packages:
  15. (1/1): test-baby-1.1-1.i3 100% |=========================| 4.4 kB    00:00     
  16. Running Transaction Test
  17. Finished Transaction Test
  18. Transaction Test Succeeded
  19. Running Transaction
  20.   Installing: test-baby                    ######################### [1/1]
  21. posttrans_hook----------------------------

  22. Installed: test-baby.i386 0:1.1-1
  23. Complete!
復(fù)制代碼
然后再檢查下:

  1. # rpm -qi test-baby
  2. Name        : test-baby                    Relocations: /usr
  3. Version     : 1.1                               Vendor: (none)
  4. Release     : 1                             Build Date: Thu Dec 27 09:11:07 2012
  5. Install Date: Sat Dec 29 23:23:35 2012      Build Host: localhost.localdomain
  6. Group       : Development/Tools             Source RPM: test-baby-1.1-1.src.rpm
  7. Size        : 9395                             License: GPL
  8. Signature   : (none)
  9. Summary     : GNU test-baby
  10. Description :
  11. The GNU wget program downloads files from the Internet using the command-line.

  12. # tail -1 /var/log/yum.log
  13. Dec 29 23:23:35 Installed: test-baby.i386 1.1-1
復(fù)制代碼
說明 test-baby 確實(shí)安裝成功了。

有幾點(diǎn)要注意下:
(1): 實(shí)驗(yàn)環(huán)境的 yum 服務(wù)器和 客戶端都是 rhel5u4 和 i386 系統(tǒng),你可以試下 服務(wù)器和 客戶端 為不同平臺或者版本的OS時情況如何。
(2): test.repo 中配置的網(wǎng)絡(luò)下載服務(wù)是 httpd,你可以試下ftp服務(wù)和本地file 服務(wù)。
(3): 我們在該例子中只用到了一個test.repo文件,和 yum.test.com 一個源,你可以嘗試配置多個repo 配置和源進(jìn)行測試看看效果,而且 test.repo 中的其他項也沒進(jìn)行說明。
(4): 在客戶端配置中我們只看到了.repo配置文件,其它的 yum.conf 和 插件配置并沒有提及,后面會詳述。
(5): 我們在安裝的時候并沒有指定包的版本,而是只指定了包名,多個版本時,如果要安裝指定版本,yum install 時要寫明版本。

這樣,一個基本的yum 系統(tǒng)就搭建起來了。

由淺入深,后面我們會逐一詳細(xì)的講述上面yum系統(tǒng)中的各個要素,包括:


(1): createrepo 和 索引文件
(2): yum 的本地 cache
(3): yum clean 源碼小解
(4): yum客戶端配置文件分析: yum.conf 和 *.repo
(5): yum 的插件功能


論壇徽章:
0
9 [報告]
發(fā)表于 2013-01-03 07:51 |只看該作者
本帖最后由 duanjigang 于 2013-01-03 08:51 編輯

之一: createrepo 和 索引文件 探秘

首先重復(fù)下 createrepo 出現(xiàn)的原因: yum 服務(wù)器要提供rpm包的下載服務(wù),服務(wù)器的rpm更新對于客戶端是未知的,客戶端安裝更新包時需要找到符合條件的rpm包,而客戶端能夠訪問服務(wù)器的唯一途徑就是ftp或者h(yuǎn)ttp服務(wù),怎樣才能高效的檢索到服務(wù)器上的rpm最新信息呢?前輩們想出了一個辦法,就是對服務(wù)器上的所有 rpm 包進(jìn)行索引化,說白了,就是把所有rpm 的信息收集起來,存儲到若干個小文件中,如果客戶端需要訪問 yum 服務(wù)的話,先把索引文件拿下去在索引文件中檢索,檢索到了,再從服務(wù)器下載文件,安裝。(直接下載所有rpm 文件去檢索的方法肯定是不靠譜的,因?yàn)?rpm 的大小差異很大,但是每個 rpm 的描述信息卻不會很大).

這樣, createrepo 命令便應(yīng)運(yùn)而生: 檢索指定 rpm 文件的信息生成索引文件。

在前面的例子中,我們都看到了,索引文件會存儲在一個叫做 repodata 的目錄中。我們來看個實(shí)際的例子。

  1. [root@localhost yum]# pwd
  2. /var/www/html/yum
  3. [root@localhost yum]# ls *.rpm
  4. cmeguard-1.1.2-20.i386.rpm  test-cmeadmin-1.1.1-21.i386.rpm
  5. [root@localhost yum]# createrepo --update -d -p .                           
  6. Saving Primary metadata
  7. Saving file lists metadata
  8. Saving other metadata
  9. [root@localhost yum]# ls repodata/
  10. filelists.sqlite.bz2  filelists.xml.gz  other.sqlite.bz2  other.xml.gz  primary.sqlite.bz2  primary.xml.gz  repomd.xml
復(fù)制代碼
看到有 7 個文件,其實(shí)也就是四個文件

  1. repomd.xml
  2. primary.xml
  3. other.xml
  4. filelists.xml
復(fù)制代碼
因?yàn)?.xml.gz 文件是對 xml 文件的壓縮,為了減少下載數(shù)據(jù)量(因?yàn)樗饕募南螺d會占用很大流量的),.sqlite.bz2 文件是對應(yīng)于 xml 文件的 sqlite 文件壓縮后的文件。
因?yàn)?createrepo 有個選項是可以把信息存儲成sqlite 數(shù)據(jù)庫格式的(默認(rèn)是xml格式):

  1. -d, --database = generate the sqlite databases.
復(fù)制代碼
每個 xml.gz 和 sqlite.bz2 文件中存儲的原始數(shù)據(jù)是一樣的。

我們先來看看 這幾個文件都是作甚用的。

repomd.xml:
this is the file that describes the other metadata files. It is like an index file to point to the other files. It contains timestamps and checksums for the other files. This lets a client download this one, small file and know if anything else has changed. This also means that cryptographically (ex: gpg) signing this one file can ensure repository integrity.

說的通俗點(diǎn),這個文件就是索引文件的索引文件,回到 createrepo 出現(xiàn)的必要性那段: 我想最初的索引文件很可能就是一個文件,其中記錄了所有包的信息,后來前輩們發(fā)現(xiàn):存在一個文件中還是有些臃腫,那不如分開吧,把不同類的信息存儲到不同文件中,這樣,高級一點(diǎn)的索引文件就成了N個文件,因?yàn)樗砹薔類信息,再后來,前輩們又想:到底有那幾個索引文件,N個到底是幾個,這些文件變化木有,誰知道,都要挨個去檢查么?于是乎,他們又設(shè)計了一個文件,用這個文件來存儲這N個索引文件的信息,于是乎,repomd.xml 這個文件
就誕生了~~~ 以后每次檢查索引更新時,只需要先下載服務(wù)器上的這個文件,從中解析 其它 N 個文件是否改變的特征,如果有改變(這個是需要和本地cache索引做對比的),就下載對應(yīng)的索引文件,更新本地索引,重新下載包,如果沒改變,就用本地索引或者cache的包。
   這樣做的目的是什么呢?個人分析最終一個目標(biāo):就是為了減小從 yum 服務(wù)器 下載到客戶端的網(wǎng)絡(luò)流量,因?yàn)槊看?yum 查詢都可能需要檢索索引的,因此,軟件設(shè)計時,盡量會從節(jié)省資源使用考慮,去把下載量降低到最少。

大家一起來看看廬山真面目:

  1. # cat repomd.xml
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <repomd xmlns="http://linux.duke.edu/metadata/repo">
  4.   <data type="other_db">
  5.     <location href="repodata/other.sqlite.bz2"/>
  6.     <checksum type="sha">2976204b0a2782c6646a0ae60f196292e380d314</checksum>
  7.     <timestamp>1357776838</timestamp>
  8.     <open-checksum type="sha">678b1af45a0cd57d2a040a4332cf867f0c1b9288</open-checksum>
  9.     <database_version>10</database_version>
  10.   </data>
  11.   <data type="other">
  12.     <location href="repodata/other.xml.gz"/>
  13.     <checksum type="sha">714bc82c1dab6cb0ec4a4b7ca57f61efeb02f7ad</checksum>
  14.     <timestamp>1357776838</timestamp>
  15.     <open-checksum type="sha">66810c751bbf93fd44548b7c458ad9ac21e73638</open-checksum>
  16.   </data>
  17.   <data type="filelists_db">
  18.     <location href="repodata/filelists.sqlite.bz2"/>
  19.     <checksum type="sha">7cee73ebffec1c8dcc23ffc9dbab3e4919fbeac0</checksum>
  20.     <timestamp>1357776838</timestamp>
  21.     <open-checksum type="sha">a2a0e5fb9c68b5d0137428bab2a19ebdedf83588</open-checksum>
  22.     <database_version>10</database_version>
  23.   </data>
  24.   <data type="filelists">
  25.     <location href="repodata/filelists.xml.gz"/>
  26.     <checksum type="sha">99c9c6bd6f056a95b164db408b75c4e024173718</checksum>
  27.     <timestamp>1357776838</timestamp>
  28.     <open-checksum type="sha">d4d100a8d52e833579954cf901f845e6bf0e7375</open-checksum>
  29.   </data>
  30.   <data type="primary_db">
  31.     <location href="repodata/primary.sqlite.bz2"/>
  32.     <checksum type="sha">41059e8ff1b76b2cf06dba4f05db6a20fe72056f</checksum>
  33.     <timestamp>1357776838</timestamp>
  34.     <open-checksum type="sha">8baee8d8a213efa1c3cccfefa5a4c16de964704a</open-checksum>
  35.     <database_version>10</database_version>
  36.   </data>
  37.   <data type="primary">
  38.     <location href="repodata/primary.xml.gz"/>
  39.     <checksum type="sha">1f816e4886b0c2bdd378f0d0f876c2666b3bcf86</checksum>
  40.     <timestamp>1357776838</timestamp>
  41.     <open-checksum type="sha">79183262b5e9f945f912a41e23e1555c0f3a71af</open-checksum>
  42.   </data>
  43. </repomd>
復(fù)制代碼
首先,我們能看到它是從 xml 的樹形格式存儲的,每一個 section 定義為一個 data,如本例,包含了六個 data ,也就是六個文件:

  1. # cat repomd.xml | grep -w "<data"
  2.   <data type="other_db">
  3.   <data type="other">
  4.   <data type="filelists_db">
  5.   <data type="filelists">
  6.   <data type="primary_db">
  7.   <data type="primary">
復(fù)制代碼
可以看到,每一個 section 就是對一個 索引文件的描述,我們來深入每一個 data 段來看下:

  1. <data type="primary">
  2.     <location href="repodata/primary.xml.gz"/>
  3.     <checksum type="sha">1f816e4886b0c2bdd378f0d0f876c2666b3bcf86</checksum>
  4.     <timestamp>1357776838</timestamp>
  5.     <open-checksum type="sha">79183262b5e9f945f912a41e23e1555c0f3a71af</open-checksum>
  6.   </data>
復(fù)制代碼
四行數(shù)據(jù),都很容易理解:
href: 該文件的路徑
checksum: 該文件的校驗(yàn)和,采用 sha 的類型校驗(yàn)和,我們都知道文件校驗(yàn)和有crc32,md5sum,sha1,sha2 等方式,這幾種類型校驗(yàn)和的差異可以查閱相關(guān)文檔,還是蠻有意思的,
之前在研究 ICEPATCH2 的時候,發(fā)現(xiàn) ice 也是用 sha1 值給文件打校驗(yàn)和的。
timestamp 修改時間戳
open-checksum 跟 checksum 類似吧,我沒有深究。

好了,repomd.xml 文件介紹完了,我們看看其它幾個文件都是干啥的:

論壇徽章:
0
10 [報告]
發(fā)表于 2013-01-03 11:48 |只看該作者
本帖最后由 duanjigang 于 2013-01-03 12:09 編輯

primary.xml.[gz]

     this file stores the primary metadata information. This includes information such as:

    name, epoch, version, release, architecture
    file size, file location, description, summary, format, checksums header byte-ranges, etc.
    dependencies, provides, conflicts, obsoletes, suggests, recommends
    file lists for the package for CERTAIN files - specifically files matching: /etc*, *bin/*, /usr/lib/sendmail [1]


可以看到 primary.xml 主要存儲包的名字,epoch,version.release等信息。
我們來看下它的內(nèi)容:

  1. $ zcat primary.xml.gz
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <metadata xmlns="http://linux.duke.edu/metadata/common" xmlns:rpm="http://linux.duke.edu/metadata/rpm" packages="2">
  4. <package type="rpm">
  5.   <name>test-daddy</name>
  6.   <arch>i386</arch>
  7.   <version epoch="0" ver="1.1" rel="1"/>
  8.   <checksum type="sha" pkgid="YES">a9f4ad3086dcfcced210361bc72e4d418144cfcc</checksum>
  9.   <summary>GNU test-daddy</summary>
  10.   <description>The GNU wget program downloads files from the Internet using the command-line.</description>
  11.   <packager/>
  12.   <url/>
  13.   <time file="1357185424" build="1357185424"/>
  14.   <size package="4235" installed="9354" archive="4936"/>
  15.   <location href="test-daddy-1.1-1.i386.rpm"/>
  16.   <format>
  17.     <rpm:license>GPL</rpm:license>
  18.     <rpm:vendor/>
  19.     <rpm:group>Development/Tools</rpm:group>
  20.     <rpm:buildhost>yum.test.com</rpm:buildhost>
  21.     <rpm:sourcerpm>test-daddy-1.1-1.src.rpm</rpm:sourcerpm>
  22.     <rpm:header-range start="280" end="2127"/>
  23.     <rpm:provides>
  24.       <rpm:entry name="test-daddy" flags="EQ" epoch="0" ver="1.1" rel="1"/>
  25.     </rpm:provides>
  26.     <rpm:requires>
  27.       <rpm:entry name="rpmlib(PayloadFilesHavePrefix)" flags="LE" epoch="0" ver="4.0" rel="1" pre="1"/>
  28.       <rpm:entry name="/bin/sh" pre="1"/>
  29.       <rpm:entry name="libc.so.6"/>
  30.       <rpm:entry name="rtld(GNU_HASH)"/>
  31.       <rpm:entry name="baby-is-provided"/>
  32.       <rpm:entry name="libc.so.6(GLIBC_2.0)"/>
  33.       <rpm:entry name="rpmlib(CompressedFileNames)" flags="LE" epoch="0" ver="3.0.4" rel="1" pre="1"/>
  34.     </rpm:requires>
  35.     <file>/usr/bin/test_daddy</file>
  36.   </format>
  37. </package>
  38. <package type="rpm">
  39.   <name>test-girl</name>
  40.   <arch>i386</arch>
  41.   <version epoch="0" ver="1.1" rel="1"/>
  42.   <checksum type="sha" pkgid="YES">82828b38c988399f597cceb14d896de6d36cd1c8</checksum>
  43.   <summary>GNU test-girl</summary>
  44.   <description>The GNU wget program downloads files from the Internet using the command-line.</description>
  45.   <packager/>
  46.   <url/>
  47.   <time file="1357185262" build="1357185262"/>
  48.   <size package="4227" installed="9354" archive="4936"/>
  49.   <location href="test-girl-1.1-1.i386.rpm"/>
  50.   <format>
  51.     <rpm:license>GPL</rpm:license>
  52.     <rpm:vendor/>
  53.     <rpm:group>Development/Tools</rpm:group>
  54.     <rpm:buildhost>yum.test.com</rpm:buildhost>
  55.     <rpm:sourcerpm>test-girl-1.1-1.src.rpm</rpm:sourcerpm>
  56.     <rpm:header-range start="280" end="2119"/>
  57.     <rpm:provides>
  58.       <rpm:entry name="test-girl" flags="EQ" epoch="0" ver="1.1" rel="1"/>
  59.       <rpm:entry name="baby-is-provided"/>
  60.     </rpm:provides>
  61.     <rpm:requires>
  62.       <rpm:entry name="rpmlib(PayloadFilesHavePrefix)" flags="LE" epoch="0" ver="4.0" rel="1" pre="1"/>
  63.       <rpm:entry name="/bin/sh" pre="1"/>
  64.       <rpm:entry name="libc.so.6"/>
  65.       <rpm:entry name="rtld(GNU_HASH)"/>
  66.       <rpm:entry name="libc.so.6(GLIBC_2.0)"/>
  67.       <rpm:entry name="rpmlib(CompressedFileNames)" flags="LE" epoch="0" ver="3.0.4" rel="1" pre="1"/>
  68.     </rpm:requires>
  69.     <file>/usr/bin/test_girl</file>
  70.   </format>
  71. </package>
  72. </metadata>
復(fù)制代碼
不用多言,看到 xml 的內(nèi)容,就已經(jīng)明白了它存儲了 rpm 包的哪些信息。

其它三個文件
filelists.xml.[gz]
this file stores the complete file and directory listings for the packages. The package is identified by: name, epoch, version, release, architecture and package checksum id.
看下內(nèi)容:

  1. $ zcat filelists.xml.gz
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <filelists xmlns="http://linux.duke.edu/metadata/filelists" packages="2">
  4. <package pkgid="a9f4ad3086dcfcced210361bc72e4d418144cfcc" name="test-daddy" arch="i386">
  5.   <version epoch="0" ver="1.1" rel="1"/>
  6.   <file>/usr/bin/test_daddy</file>
  7. </package>
  8. <package pkgid="82828b38c988399f597cceb14d896de6d36cd1c8" name="test-girl" arch="i386">
  9.   <version epoch="0" ver="1.1" rel="1"/>
  10.   <file>/usr/bin/test_girl</file>
  11. </package>
  12. <package pkgid="6a6fbc7e58160ffa71b1f91912dc6eaf1cd6e0ae" name="wget" arch="i386">
  13.   <version epoch="0" ver="1.14" rel="1"/>
  14.   <file>/usr/bin/wget</file>
  15.   <file>/usr/etc/wgetrc</file>
  16.   <file>/usr/share/info/wget.info.gz</file>
  17.   <file>/usr/share/locale/be/LC_MESSAGES/wget.mo</file>
  18.   <file>/usr/share/locale/bg/LC_MESSAGES/wget.mo</file>
  19.   <file>/usr/share/locale/ca/LC_MESSAGES/wget.mo</file>
  20.   <file>/usr/share/locale/cs/LC_MESSAGES/wget.mo</file>
  21.   <file>/usr/share/locale/da/LC_MESSAGES/wget.mo</file>
  22.   <file>/usr/share/locale/de/LC_MESSAGES/wget.mo</file>
  23.   <file>/usr/share/locale/el/LC_MESSAGES/wget.mo</file>
  24.   <file>/usr/share/locale/en_GB/LC_MESSAGES/wget.mo</file>
  25.   <file>/usr/share/locale/eo/LC_MESSAGES/wget.mo</file>
  26.   <file>/usr/share/locale/es/LC_MESSAGES/wget.mo</file>
  27.   <file>/usr/share/locale/et/LC_MESSAGES/wget.mo</file>
  28.   <file>/usr/share/locale/eu/LC_MESSAGES/wget.mo</file>
  29.   <file>/usr/share/locale/fi/LC_MESSAGES/wget.mo</file>
  30.   <file>/usr/share/locale/fr/LC_MESSAGES/wget.mo</file>
  31.   <file>/usr/share/locale/ga/LC_MESSAGES/wget.mo</file>
  32.   <file>/usr/share/locale/gl/LC_MESSAGES/wget.mo</file>
  33.   <file>/usr/share/locale/he/LC_MESSAGES/wget.mo</file>
  34.   <file>/usr/share/locale/hr/LC_MESSAGES/wget.mo</file>
  35.   <file>/usr/share/locale/hu/LC_MESSAGES/wget.mo</file>
  36.   <file>/usr/share/locale/id/LC_MESSAGES/wget.mo</file>
  37.   <file>/usr/share/locale/it/LC_MESSAGES/wget.mo</file>
  38.   <file>/usr/share/locale/ja/LC_MESSAGES/wget.mo</file>
  39.   <file>/usr/share/locale/lt/LC_MESSAGES/wget.mo</file>
  40.   <file>/usr/share/locale/nb/LC_MESSAGES/wget.mo</file>
  41.   <file>/usr/share/locale/nl/LC_MESSAGES/wget.mo</file>
  42.   <file>/usr/share/locale/pl/LC_MESSAGES/wget.mo</file>
  43.   <file>/usr/share/locale/pt/LC_MESSAGES/wget.mo</file>
  44.   <file>/usr/share/locale/pt_BR/LC_MESSAGES/wget.mo</file>
  45.   <file>/usr/share/locale/ro/LC_MESSAGES/wget.mo</file>
  46.   <file>/usr/share/locale/ru/LC_MESSAGES/wget.mo</file>
  47.   <file>/usr/share/locale/sk/LC_MESSAGES/wget.mo</file>
  48.   <file>/usr/share/locale/sl/LC_MESSAGES/wget.mo</file>
  49.   <file>/usr/share/locale/sr/LC_MESSAGES/wget.mo</file>
  50.   <file>/usr/share/locale/sv/LC_MESSAGES/wget.mo</file>
  51.   <file>/usr/share/locale/tr/LC_MESSAGES/wget.mo</file>
  52.   <file>/usr/share/locale/uk/LC_MESSAGES/wget.mo</file>
  53.   <file>/usr/share/locale/vi/LC_MESSAGES/wget.mo</file>
  54.   <file>/usr/share/locale/zh_CN/LC_MESSAGES/wget.mo</file>
  55.   <file>/usr/share/locale/zh_TW/LC_MESSAGES/wget.mo</file>
  56.   <file>/usr/share/man/man1/wget.1.gz</file>
  57. </package>
  58. </filelists>
復(fù)制代碼
可以跟 rpm 中的實(shí)際文件列表進(jìn)行對比下:

  1. $ rpm -qpl ../test-daddy-1.1-1.i386.rpm
  2. /usr/bin/test_daddy
  3. $ rpm -qpl ../test-girl-1.1-1.i386.rpm
  4. /usr/bin/test_girl
  5. $ rpm -qpl ../wget-1.14-1.i386.rpm
  6. /usr/bin/wget
  7. /usr/etc/wgetrc
  8. /usr/share/info/wget.info.gz
  9. /usr/share/locale/be/LC_MESSAGES/wget.mo
  10. /usr/share/locale/bg/LC_MESSAGES/wget.mo
  11. /usr/share/locale/ca/LC_MESSAGES/wget.mo
  12. /usr/share/locale/cs/LC_MESSAGES/wget.mo
  13. /usr/share/locale/da/LC_MESSAGES/wget.mo
  14. /usr/share/locale/de/LC_MESSAGES/wget.mo
  15. /usr/share/locale/el/LC_MESSAGES/wget.mo
  16. /usr/share/locale/en_GB/LC_MESSAGES/wget.mo
  17. /usr/share/locale/eo/LC_MESSAGES/wget.mo
  18. /usr/share/locale/es/LC_MESSAGES/wget.mo
  19. /usr/share/locale/et/LC_MESSAGES/wget.mo
  20. /usr/share/locale/eu/LC_MESSAGES/wget.mo
  21. /usr/share/locale/fi/LC_MESSAGES/wget.mo
  22. /usr/share/locale/fr/LC_MESSAGES/wget.mo
  23. /usr/share/locale/ga/LC_MESSAGES/wget.mo
  24. /usr/share/locale/gl/LC_MESSAGES/wget.mo
  25. /usr/share/locale/he/LC_MESSAGES/wget.mo
  26. /usr/share/locale/hr/LC_MESSAGES/wget.mo
  27. /usr/share/locale/hu/LC_MESSAGES/wget.mo
  28. /usr/share/locale/id/LC_MESSAGES/wget.mo
  29. /usr/share/locale/it/LC_MESSAGES/wget.mo
  30. /usr/share/locale/ja/LC_MESSAGES/wget.mo
  31. /usr/share/locale/lt/LC_MESSAGES/wget.mo
  32. /usr/share/locale/nb/LC_MESSAGES/wget.mo
  33. /usr/share/locale/nl/LC_MESSAGES/wget.mo
  34. /usr/share/locale/pl/LC_MESSAGES/wget.mo
  35. /usr/share/locale/pt/LC_MESSAGES/wget.mo
  36. /usr/share/locale/pt_BR/LC_MESSAGES/wget.mo
  37. /usr/share/locale/ro/LC_MESSAGES/wget.mo
  38. /usr/share/locale/ru/LC_MESSAGES/wget.mo
  39. /usr/share/locale/sk/LC_MESSAGES/wget.mo
  40. /usr/share/locale/sl/LC_MESSAGES/wget.mo
  41. /usr/share/locale/sr/LC_MESSAGES/wget.mo
  42. /usr/share/locale/sv/LC_MESSAGES/wget.mo
  43. /usr/share/locale/tr/LC_MESSAGES/wget.mo
  44. /usr/share/locale/uk/LC_MESSAGES/wget.mo
  45. /usr/share/locale/vi/LC_MESSAGES/wget.mo
  46. /usr/share/locale/zh_CN/LC_MESSAGES/wget.mo
  47. /usr/share/locale/zh_TW/LC_MESSAGES/wget.mo
  48. /usr/share/man/man1/wget.1.gz
復(fù)制代碼
每個 <file> 就是一個文件。

other.xml.[gz]

this file currently only stores the changelog data from packages. However, this file could be used for any other additional metadata that could be useful for clients.
看下內(nèi)容:

  1. $ zcat other.xml.gz
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <otherdata xmlns="http://linux.duke.edu/metadata/other" packages="4">
  4. <package pkgid="6a6fbc7e58160ffa71b1f91912dc6eaf1cd6e0ae" name="wget" arch="i386">
  5.   <version epoch="0" ver="1.14" rel="1"/>
  6. </package>
  7. <package pkgid="a9f4ad3086dcfcced210361bc72e4d418144cfcc" name="test-daddy" arch="i386">
  8.   <version epoch="0" ver="1.1" rel="1"/>
  9. </package>
  10. <package pkgid="82828b38c988399f597cceb14d896de6d36cd1c8" name="test-girl" arch="i386">
  11.   <version epoch="0" ver="1.1" rel="1"/>
  12. </package>
  13. <package pkgid="6ce87802e577736bb8b481c157cb9fb8822f8b88" name="wget-debuginfo" arch="i386">
  14.   <version epoch="0" ver="1.14" rel="1"/>
  15. </package>

  16. </otherdata>
復(fù)制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP