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

  免費注冊 查看新帖 |

Chinaunix

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

Linux平臺軟件管理系統(tǒng)設計與規(guī)劃-基礎篇(1)-RPM文件認識與格式剖析 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-11-14 23:03 |只看該作者 |倒序瀏覽
本帖最后由 duanjigang 于 2012-11-17 23:03 編輯

轉載請保留作者信息和來自CU的原站
2012-11-17: 更新至27樓
################

在論壇有大半年時間沒寫文章了,今天“發(fā)表帖子”都不知道怎么寫了。看看這個荒蕪的板塊,頓時覺得有些內疚,就跟自家的自留地好久沒有經管一樣,呵呵,忙完了一陣子,終于有空來
總結下了,旨在作為自己工作總結,也為需要的同學提供點參考,

今年年初到現(xiàn)在這斷斷續(xù)續(xù)七八個月都在負責維護公司yum系統(tǒng),進行RPM/YUM的日常支持,渾渾噩噩也學了不少東西,雖然不能對yum/rpm這些做到精通,但是也算是有所了解,于是在9月份,厚著臉皮去CU的架構師大會分享了一把,演講標題是《Linux平臺軟件管理系統(tǒng)設計與規(guī)劃》(可以從此下載PPT:http://72891.cn/thread-3771155-1-1.html)。其中灑灑揚揚對rpm/yum進行了介紹,高可用性/穩(wěn)定的yum系統(tǒng)搭建進行了較為深入的分析,都是結合著在公司的工作內容講的,最后第三部分還就軟件包制作與命名管理規(guī)范就行了一些分享。總覺得架構師大會上一小時的時間太短,說不清好多東西,于是希望在線下進行一個系列的帖子總結和討論,算是對演講PPT的深入吧。廢話不多,開始了。

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

看文章的標題和PPT的內容,很容易理解,要說的對象是RPM和YUM系統(tǒng),鄙人不太喜歡那種太教材方式的介紹,喜歡從個人的最直觀理解去闡述,敘說。呵呵,希望都能適應。

RPM文件

首先說說 RPM 文件,百度下RPM,可以看到英文名字是:RedHat Package Manager, 應該說是一個包管理方式,或者一個包管理工具。提到包管理,就贅述幾句,什么是軟件包呢?我的理解,最原始的包就是一堆需要運行的程序的集合,可能還需要加上一些配置文件,動態(tài)庫之類,就構成了軟件包。
你把自己寫好的腳本或者C代碼編譯生成的二進制文件,加上依賴的某些so文件和conf文件,扔進一個目錄,叫做execute,那么,我們就可以說excute是一個軟件包了。。
有人可能說這怎么能叫軟件包呢?仔細想想,它確實應該是一個軟件包,它包含了要運行的應用需要的基本東西,執(zhí)行程序,配置,依賴庫等,只不過這個包看起來有些原始和過于簡單而已。
    有了基本的軟件包-一個目錄中存放文件的集合,我們就會想著更高級別的軟件包,比如對excute進行壓縮,也是一個包,通過tar或者gzip得到tar.gz,rar,zip格式的文件,你就獲得了一個較為高級的軟件包了,它確實比較高級,因為它把程序和配置變成了一個單一的文件,這樣就方便拷貝了,另外壓縮文件的包方式,也節(jié)省了磁盤空間占用和網絡數(shù)據傳輸?shù)牧。在我之前從?年的單位,我們所在項目組的程序基本都是通過這種方式發(fā)布的,每次發(fā)布程序,都是把動態(tài)庫,二進制程序和配置文件壓縮成一個tgz文件,拷貝到需要運行的2000多臺機器上,解壓縮到指定目錄下,然后直接運行即可?吹某觯@種方式已經比較方便了。

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

有了tgz/rar/zip方式的包管理和存儲方式就夠了嗎?可能對于某些小型應用確實夠了,但是,日常工作中你應該會碰到如下一些問題:
(1):  想看這個軟件包的信息,比如誰制作的,什么時候制作的,描述信息呢?
(2):  給軟件包帶上一些特殊功能,除了文件拷貝功能外,還要有配置文件生成,安裝服務,執(zhí)行命令等操作,壓縮文件怎么用?
(3):  軟件包版本升級時,通過壓縮文件怎么做?
除了以上這3點,應該還有其他方面的問題,你應該都會遇到或者思考到。再思考下。。。壓縮文件格式的軟件包確實存在這些功能上的不足,能不能在文件壓縮存儲之外在能進行更多功能的實現(xiàn)和更多信息的存儲呢?把這些都寫入最終的包文件中?
   答案是肯定的,呵呵。
RPM 就是具有上面提到功能需求的一個包存儲或者管理方式。當然還有其他方式的高級軟件包格式,不過本文和后續(xù)的文章中只對RPM這種方式進行討論。先來看看這中高級軟件包的特點或者說功能吧:

(1): 壓縮存儲數(shù)據。(和tgz方式一樣)
(2):   文件安裝到指定路徑(基本功能)。
(3):  配置文件產生。
(4):  系統(tǒng)服務注冊
(5):  軟件依賴檢查。


除了(1)和(2),后面這三個功能,大概是壓縮方式軟件包都不具有的特性吧。

   壓縮存儲,這個是基本功能,比如我這里有個目錄是5.2M,用它制作好的RPM只有2.4M.
   文件安裝,這個同樣是基本功能,運行命令:

  1.   rpm -qpl ./cmeguard-1.1.2-34.i386.rpm
  2. /etc/init.d/cmeguard
  3. /usr/local/cmeguard/bin/auto_update
  4. /usr/local/cmeguard/bin/cmeguard
  5. /usr/local/cmeguard/bin/cmesync
  6. /usr/local/cmeguard/bin/daemon
  7. /usr/local/cmeguard/bin/genfinger
  8. /usr/local/cmeguard/bin/run
  9. /usr/local/cmeguard/bin/sync_plug
  10. /usr/local/cmeguard/bin/sync_plug_back
  11. /usr/local/cmeguard/conf/cmeguard.conf
  12. /usr/local/cmeguard/conf/cmeproxy.conf
  13. /usr/local/cmeguard/conf/cmesync.conf
  14. /usr/local/cmeguard/conf/error.html
  15. /usr/local/cmeguard/conf/mime.types
  16. /usr/local/cmeguard/data
  17. /usr/local/cmeguard/db
  18. /usr/local/cmeguard/finger
  19. /usr/local/cmeguard/lib
  20. /usr/local/cmeguard/log
  21. /usr/local/cmeguard/pid
  22. /usr/local/cmeguard/tmp
復制代碼
能夠看到這么一大坨文件,這里看到的文件就是將來會安裝的文件列表,如果你用默認安裝命令
  1. rpm -ivh cmeguard-1.1.2-34.i386.rpm
復制代碼
安裝這個包的話,就會在你的系統(tǒng)上找到上面列表中對應的所有文件,而且最少是這些文件(因為安裝時可能會產生新的文件,這個后面會說)。

然后是配置文件產生:配置文件即可以通過安裝列表中的文件來生成,也可以通過安裝過程中的腳本來生成。

服務注冊:如果你用rpm安裝過apache,mysql-server等常見軟件的話,應該會知道,安裝完,會對應在/etc/init.d/底下創(chuàng)建一個httpd或者mysqld的文件,這個文件按照
標準的自啟動腳本格式書寫的(參考chkconfig),當系統(tǒng)以對應的模式啟動時,你安裝的服務程序就會被運行起來。
舉個例子:

  1. rpm --nosignature -qpl ./vsftpd-2.0.5-10.el5.i386.rpm  | grep init
  2. /etc/rc.d/init.d/vsftpd
復制代碼
能夠看到

  1. /etc/rc.d/init.d/vsftpd
復制代碼
這個文件會被安裝,然后你就可以通過

  1. service vsftpd start/stop/restart/status
復制代碼
等方式來控制這個服務的起停了。

軟件依賴檢查: 我們開發(fā)的程序很少是單獨運行的,大多數(shù)都會依賴其它軟件,比如你開發(fā)的數(shù)據庫處理程序可能需要 libmysql,網絡報文處理程序需要libpcap這個包的支持,這時,為了保證你的軟件安裝后能正常運行,而且在安裝時能夠檢查環(huán)境是否就緒,就可以通過軟件依賴的方式來實現(xiàn)(當然,有人可能會問怎么實現(xiàn)這些呢,這個在后面的spec語法中會詳細說明)。
還是舉個例子,比如有個rpm叫:

  1. test_rpm-1.1.1-21.i386.rpm
復制代碼
首先我們看下它require哪些咚咚:

  1. rpm -qp test_rpm-1.1.1-21.i386.rpm --requires
  2. test__require_pkg  
  3. ruby-libs  
  4. /bin/sh  
  5. /bin/sh  
  6. rpmlib(PayloadFilesHavePrefix) <= 4.0-1
  7. rpmlib(CompressedFileNames) <= 3.0.4-1
復制代碼
能夠看到它依賴了這些組件或者包。

然后嘗試安裝下:

  1. rpm -ivh test_rpm-1.1.1-21.i386.rpm           
  2. error: Failed dependencies:
  3.         test__require_pkg is needed by test_rpm-1.1.1-21.i386
復制代碼
能夠看到,系統(tǒng)缺少 test__requre_pkg 這個包,因此 test_rpm-1.1.1-21.i386.rpm
這個包是不能安裝成功的,這樣的邏輯確實是合理和應該的.雖然我們能夠看到

  1. rpm -qa ruby-libs
  2. ruby-libs-1.8.5-5.el5_3.7
復制代碼
這個包已經安裝了,但是在依賴列表中,缺一不可,它們是與的關系。
好了,RPM 這五個特性,我們就說到這里。

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

再來少許贅言對上面起初提的問題進行回答: RPM 是怎樣在壓縮存儲之外又能做到其它功能的呢,比如安裝服務,執(zhí)行某些命令,打印信息,發(fā)郵件,檢查依賴包,還有升級時做版本檢查。這些都怎么實現(xiàn)的?
   在此不做太細致說明,還是留待spec文件那節(jié)再說吧。
RPM有個功能就是對 scripts 的支持功能,除了文件壓縮存儲,它支持在安裝軟件或者卸載軟件的過程中(確切點說,是這個過程的開始,進行和結束后這些不同時間點),執(zhí)行一些命令,常用的有

  1. post install
  2. pre install
  3. post uninstall
  4. pre uninstall
復制代碼
從字面意思就能看到其作用,也就是說能夠在安裝前,安裝完,卸載前,卸載完執(zhí)行某些腳本,這就為擴展包功能提供了極大的空間。
我們看一個例子:

  1. rpm -qp test_rpm-1.1.1-21.i386.rpm --scripts
  2. preinstall scriptlet (using /bin/sh):
  3. echo "pre install scripts by duanjigang"
  4. postinstall scriptlet (using /bin/sh):
  5. echo "post install scripts by duanjigang"
  6. preuninstall scriptlet (using /bin/sh):
  7. #!/bin/bash
  8. echo "pre uninstall by duanjigang"
  9. postuninstall scriptlet (using /bin/sh):
  10. #!/bin/bash
  11. echo "post uninstall by duanjigang"
復制代碼
能夠看到這個軟件包有 5 個 scripts 在 RPM 中帶著,分別在安裝前后,卸載前后,build 這五個點執(zhí)行,這樣,你就可以通過這些 Scripts 來實現(xiàn)想要的功能了。
關于 scripts 在那些不同點執(zhí)行,有什么效果,后面我會詳述。

   還有就是 RPM 怎么做到版本的控制和變化?
通過這個信息

  1. rpm -qpi test_rpm-1.1.1-21.i386.rpm
  2. Name        : test_rpm                    
  3. Version     : 1.1.1                             
  4. Release     : 21                        
復制代碼
能夠看到 版本時1.1.1, Release 號是21,因此它的包名默認就是:
test_rpm-1.1.1-21
當version進行升級,或者 Release 號進行升級后,新版本的 RPM 就可以在老的版本上做版本升級了,而切 RPM 安裝器會檢查版本號,然后確定是否能夠升級。
有時候,制作包時也會用 RPM 的 “Epoch” 這個字段來控制版本,可以稱這個字段是一個神秘數(shù)字吧,他會加在版本的前面,用冒號隔開,比如:

  1. 99:1.1.1-21
復制代碼
這樣的一個版本字符串,和

  1. 1.2.3-xx
復制代碼
來比較,前者始終比后者版本高,后者版本的包就沒法升級前者了,當然這么做并不全是為了控制版本升級,主要目的還是做特殊標識的。
RPM 的基礎介紹部分先到這里。:wink:

論壇徽章:
381
CU十二周年紀念徽章
日期:2014-01-04 22:46:58CU大;照
日期:2013-03-13 15:32:35CU大;照
日期:2013-03-13 15:38:15CU大;照
日期:2013-03-13 15:38:52CU大;照
日期:2013-03-14 14:08:55CU大牛徽章
日期:2013-04-17 11:17:19CU大;照
日期:2013-04-17 11:17:32CU大;照
日期:2013-04-17 11:17:37CU大;照
日期:2013-04-17 11:17:42CU大;照
日期:2013-04-17 11:17:47CU大;照
日期:2013-04-17 11:17:52CU大;照
日期:2013-04-17 11:17:56
5 [報告]
發(fā)表于 2012-11-15 08:29 |只看該作者
感謝分享,坐板凳學習

論壇徽章:
4
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT運維版塊每日發(fā)帖之星
日期:2016-08-11 06:20:00IT運維版塊每日發(fā)帖之星
日期:2016-08-15 06:20:00
6 [報告]
發(fā)表于 2012-11-15 09:28 |只看該作者
蘭蘭V5,感謝分享!

論壇徽章:
0
7 [報告]
發(fā)表于 2012-11-15 09:40 |只看該作者
本帖最后由 duanjigang 于 2012-11-15 10:56 編輯

RPM 文件格式

做過網絡程序開發(fā)或者數(shù)序wireshark (or tcpdump)的同學肯定都對報文文件比較熟悉,我們都知道,網絡報文文件都有它固定的文件格式,或者我覺得叫協(xié)議更容易理解。
這些協(xié)議是人為定下來的,告知大家:我們這個文件前面多少比特寫什么內容,中間哪個數(shù)據結構表示什么意思,后面那個字段又代表什么。?傊,通過這么一種通告的方式向眾生告知,如果你要參與到這種格式的數(shù)據(或者文件)中來,就必須按照我說的格式(協(xié)議)去讀寫,只有這樣,你才能夠讀取到正確的數(shù)據,或者寫成一個正確格式的文件。

報文文件為大家熟知,我們就從報文文件的例子開始。下面是我用wireshark抓取的一個數(shù)據包,用wireshark 查看該文件,能夠清晰看到按照報文文件協(xié)議解析后的數(shù)據包文件的各個字段:
鏈路層
IP層
TCP層
FTP層
每層的各個字段都能看到。


之所以 wireshark 能夠展示出來報文的每個字段,因為它是去按照報文文件的協(xié)議進行解析的,對于 RPM 文件,原理也是一樣的,知曉了文件的數(shù)據格式,然后去逐個解析,就能拿到你想要的信息,RPM 命令其中的大部分功能,也都是這樣實現(xiàn)的。


下面,我們看看 RPM 的文件格式。
就像報文文件由 MAC層,IP層,TCP/UDP/ICMP層,HTTP/SNMP層這些信息塊組成一樣,一個 RPM 文件由一下幾種數(shù)據塊組成:

lead

signature

header

archive

在 一個 RPM 文件中,上面這四種數(shù)據元,會被包含一個或者多個,其中每個數(shù)據元中又有自己的數(shù)據格式,這樣,一層層的存儲協(xié)議,就構成了一個RPM文件。

論壇徽章:
5
摩羯座
日期:2014-07-22 09:03:552015元宵節(jié)徽章
日期:2015-03-06 15:50:392015亞冠之大阪鋼巴
日期:2015-06-12 16:01:352015年中國系統(tǒng)架構師大會
日期:2015-06-29 16:11:2815-16賽季CBA聯(lián)賽之四川
日期:2018-12-17 14:10:21
8 [報告]
發(fā)表于 2012-11-15 09:52 |只看該作者
獲益良多呀

論壇徽章:
0
9 [報告]
發(fā)表于 2012-11-15 10:59 |只看該作者
本帖最后由 duanjigang 于 2012-11-15 11:50 編輯

接著。

首先看 Lead 信息。

rpm-devel 這個包中 的文件 /usr/include/rpm/rpmlib.h  中 對 rpmlead
是如是定義的:

  1. unsigned char magic[4];
  2.     unsigned char major;
  3.     unsigned char minor;
  4.     short type;
  5.     short archnum;
  6.     char name[66];
  7.     short osnum;
  8.     short signature_type;       /*!< Signature header type (RPMSIG_HEADERSIG) */
  9. /*@unused@*/ char reserved[16]; /*!< Pad to 96 bytes -- 8 byte aligned! */
復制代碼
通過字面意思大概能看到幾分意思,最起碼這個結構體包含了包的名字,os 類型, arch數(shù),包類型(二進制包還是源碼包)。

前四個字節(jié),magic,是表示這個文件是否是RPM文件的標識,file 命令和 rpm 命令都是靠這前四個字節(jié)來判斷的
比如:

  1. file test-rpm-1.1.1-15.x86_64.rpm
  2. test-rpm-1.1.1-15.x86_64.rpm: RPM v3 bin i386 test-rpm-1.1.1-15
復制代碼
基本上就是從 lead 中獲取了主要信息輸出的。
目前,這個magic 數(shù)組是 “edab eedb”,可以通過 ultraedit 打開一個RPM 文件 查看前四個字節(jié),如圖示:


接下來兩個字節(jié) major 和 minor 是標識 RPM 文件格式的版本的,這個和 TCP/IP 協(xié)議的版本一樣,就像網絡報文中的 version 大多為 4 和 6 一樣。
RPM文件中能看到的大多數(shù)值都是  major = 3 minor = 0, 也就是 3.0 版本的 RPM 文件。
在上圖中同樣能看到。

下來是 RPM 文件的類型 type,0 是 二進制 RPM 文件,1 是源碼二進制文件,標識了RPM中存的是二進制程序還是源碼包。



下來的archnum 是用標識 包將要安裝的架構信息的,1 標識i368,在最新的 rpm version 3.0 中看到的 這個字段在 x86_64, noarch 和 i386 中都是0,可能已經不用這個字段了,而是采用header來存儲,這個后面再說。

66個字符的 name 是包的名字。
osnum 是標識 操作系統(tǒng)的, 1 標識是 Linux,2 是 IRIX,這些對應的常量定義能在文件 /usr/lib/rpm/rpmrc
中看到:

  1. os_canon:       Linux:  Linux   1   
  2. os_canon:       IRIX:   Irix    2   
  3. # This is wrong
  4. os_canon:       SunOS5: solaris 3
  5. os_canon:       SunOS4: SunOS   4   

  6. os_canon:      AmigaOS: AmigaOS 5
  7. os_canon:          AIX: AIX     5   
  8. os_canon:        HP-UX: hpux10  6
  9. os_canon:         OSF1: osf1    7   
  10. os_canon:       osf4.0: osf1    7   
  11. os_canon:       osf3.2: osf1    7   
  12. os_canon:      FreeBSD: FreeBSD 8
  13. os_canon:       SCO_SV: SCO_SV3.2v5.0.2  9
  14. os_canon:       IRIX64: Irix64  10
  15. os_canon:     NEXTSTEP: NextStep 11
  16. os_canon:       BSD_OS: bsdi    12
  17. os_canon:      machten: machten 13
  18. os_canon:  CYGWIN32_NT: cygwin32 14
  19. os_canon:  CYGWIN32_95: cygwin32 15
  20. os_canon:      UNIX_SV: MP_RAS: 16
  21. os_canon:         MiNT: FreeMiNT 17
  22. os_canon:       OS/390: OS/390  18
  23. os_canon:       VM/ESA: VM/ESA  19
復制代碼
signature_type 字段標識了下一個 數(shù)據塊 signature 的類型,在 RPM version 3.0 中,這個變量的值是 5.

論壇徽章:
49
15-16賽季CBA聯(lián)賽之福建
日期:2016-06-22 16:22:002015年亞洲杯之中國
日期:2015-01-23 16:25:12丑牛
日期:2015-01-20 09:39:23未羊
日期:2015-01-14 23:55:57巳蛇
日期:2015-01-06 18:21:36雙魚座
日期:2015-01-02 22:04:33午馬
日期:2014-11-25 09:58:35辰龍
日期:2014-11-18 10:40:07寅虎
日期:2014-11-13 22:47:15申猴
日期:2014-10-22 15:29:50摩羯座
日期:2014-08-27 10:49:43辰龍
日期:2014-08-21 10:47:58
10 [報告]
發(fā)表于 2012-11-15 13:43 |只看該作者
感謝這么精彩的原創(chuàng)分享啊!
您需要登錄后才可以回帖 登錄 | 注冊

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

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP