Linux-什麼是二進制包,源碼包,RPM包,軟件倉庫

博文說明【前言】:

    本文將通過個人口吻介紹什麼是二進制包,RPM包,源碼RPM包(SRPM包),源碼包,以及RPM常用命令,源碼rpm的安裝(*.src.rpm),源碼包的安裝步驟知識(./configure,make,make install)相關知識。

     在目前時間點【2017年6月12號】下,所掌握的技術水平有限,可能會存在不少知識理解不夠深入或全面,望大家指出問題共同交流,在後續工作及學習中如發現本文內容與實際情況有所偏差,將會完善該博文內容。


本文參考文獻引用鏈接:

1、http://man.linuxde.net/rpm
2、http://blog.csdn.net/simplekaizai/article/details/70055719
3、http://blog.csdn.net/u014242496/article/details/51645812【rpm包格式】
4、http://www.2cto.com/os/201501/366397.html
5、http://blog.csdn.net/u010154760/article/details/45955857【推薦,必看】
6、https://my.oschina.net/weiweiblog/blog/488919【源碼包三步講解】
7、http://www.cnblogs.com/einyboy/archive/2012/09/13/2683015.html【講解安裝src.rpm】
8、https://yq.aliyun.com/articles/43220【如何將源碼包製作成RPM包】 後期新寫一篇博文
9、http://www.gkstk.com/article/wk-78500000726568.html【Linux軟件包管理基本操作命令入門】
10、http://studys.blog.51cto.com/9736817/1608958【必看,軟件倉庫講解】
11、http://os.51cto.com/art/201109/291547.htm



正文:

從事Linux運維工作的小夥伴們必須要和軟件安裝打交道,我們知道將軟件安裝到服務器上有多種方法,比如源碼包方式單獨安裝(一般格式爲xx.tar.gz),rpm包形式單獨安裝(一般格式爲xx.rpm),通過Linux發行版本提供的軟件包管理軟件進行安裝(例如RHEL和Centos的yum,SUSE的yast和zypper,ubuntu的apt等等),那麼我們安裝的這些軟件包有什麼區別呢。


在Linux中,我們將軟件包分爲三種類型,分別是二進制包、RPM包、源碼包。


一:二進制包

1、概念:

二進制包是軟件包的一種形式,二進制包是已經經過編譯,可以馬上運行的程序軟件包。你只需要下載和解包(安裝)它們以後,就馬上可以使用。軟件包的內容是01二進制代碼(一般以16進制顯示),也就是說,這些文件是計算機能直接識別的(計算機只能識別處理01二進制)


2、格式:

格式1:xxxx-devel-6b-33.x86_64.rpm格式(rpm -ivh安裝之後能直接使用),

格式2:mysql-5.5.32-linux2.6-x86_64.tar.gz格式(tar -zxvf解壓之後就能直接使用),這裏注意和源碼包的區別,二進制格式的包名字很長,一般都會帶有版本號、適應平臺、適應的硬件類型等,而源碼格式僅僅就是一個版本號的tar包,例如httpd-2.4.25.tar.gz。   


我們一般說的二進制包其實默認指的就是RPM包,也就是說二進制包包含RPM包,RPM包是二進制包的一個子集
 

3、特性:

我們可以使用UE編輯器,打開/bin下的文件查看,打開Windows中的.exe文件查看,打開rpm包查看,你會發現,這些文件的內容都是01二進制代碼(一般以16進制顯示),也就是說,這些文件是計算機能直接識別的(計算機只能識別處理01二進制)



二:RPM包


1、概念:

在一個操作系統下,需要安裝實現各種功能的軟件包。這些軟件包一般都有各自的程序,但是同時也有錯綜複雜的依賴關係。同時還需要解決軟件包的版本,以及安裝,配置,卸載的自動化問題。爲了解決這些問題,RedHat針對自己的系統提出了一個較好的辦法來管理成千上百的軟件。這就是RPM管理系統。在系統中安裝了rpm管理系統以後,只要是符合rpm文件標準的打包的程序都可以方便的安裝,升級,卸載


也就是說rpm原本是Red Hat公司專門用來管理Red Hat的Linux發行版本的各項程序套件的管理程序,由於它遵循GPL規則且功能強大方便,因而廣受歡迎。逐漸受到其他Linux發行版本的採用。RPM套件管理方式的出現,讓Linux易於安裝,升級,間接提升了Linux的適用度。
而yum(Yellowdog Update  Manager)是RPM的前端工具,是基於RPM的一個管理工具,他能自動的解決安裝rpm包產生的依賴關係。

RPM包也就是二進制包的一種,rpm包很好區分,以rpm結尾的一般都是rpm包
注意:RPM分爲兩種,分別是:package和srcpackage,也就是binary rpm和source rpm;前者是已經編譯好的二進制包,可以直接安裝使用,而後者是包含了源代碼的rpm包,需要重組rebuild之後纔可以安裝使用,其實從嚴謹的角度上來說,*.src.rpm算是特殊的源碼包,特殊在它能直接生成rpm包

2、格式:

格式1:name-version-release.arch.rpm

格式2:name-version-release.arch.src.rpm


name:表示包的名稱,包括主包名和分包名
version:表示包的版本信息
release:用於標識rpm包本身的發行號,可還包含適應的操作系統
arch:表示主機平臺,noarch表示此包能安裝到所以平臺上面
i386指這個軟件包適用於intel 80386以上的x86架構的計算機(AI32)
i686指這個軟件包適用於intel 80686以上(奔騰pro以上)的x86架構的計算機(IA32)
noarch指這個軟件包於硬件架構無關,可以通用。    

i686軟件包的程序通常針對80686及以上CPU進行了優化,所以,通常可以向前兼容,但是不支持向後兼容。而i386的包在x86機器上都可以用,支持向前兼容。不過現在的計算機,奔騰pro以下的CPU已經很少用,通常配置的機器都使用i686軟件包,也就是說我們認爲i686的效率會更高
總結下就是說i686軟件包不能在i386平臺上運行,而i386的軟件包沒有限制,可以在任何平臺上運行使用

可能會有人會向前向後兼容不太清楚,解釋一下:

向後兼容=向後看,向歷史兼容,也就是現在的新版本能讀取運行舊版本的數據,例如win10能向後兼容win7的軟件,win7能向後兼容win xp的軟件,office 2016能夠打開office2010的文件,64位的CPU能夠向後兼容處理針對32位CPU所開發的32位應用程序

向前兼容=向前看,向新版本或新數據兼容,向新事物兼容,或者說新版本生成的數據,能夠在舊版本上運行處理,例如針對32位CPU開發的應用程序不能再64位CPU上運行,那麼這裏這個應用程序就是向前不兼容,如果假設能運行,那麼就是向前兼容的,office 2007能夠處理office 2016產生的數據,我們就說是向前兼容

示例:
gd-devel-2.0.35-11.el6.x86_64.rpm
gd是這個包的主包名,devel是這個包的分包名,     
2.0.35是表示版本信息,2爲主版本,0爲此版本,35爲修訂號,
11.el6中的11是表示發行號,el6表示是RHEL6,
x86_64是表示包適合的平臺,如果是noarch這表示與平臺無關

3、特性:
RPM包優點:
1)RPM包管理簡單,只需要通過幾個簡單的命令就可以實現軟件包的安裝升級卸載和查詢
2)安裝速度比源碼包形式快(源碼包主要是make編譯花費時間較長)
RPM包缺點:
1)RPM包是事先已經經過編譯的二進制包,可以直接安裝使用,因此無法再看到源碼
2)如上所述,功能已經被固定,無法靈活的刪除或新增功能
3)RPM包存在很強的依賴性,大部分RPM包的順利安裝需要安裝很多個依賴RPM包
4)卸載軟件包的時候,如果不小心,會卸載涉及到依賴關係,很有可能就會卸載移除掉系統所需軟件,導致系統奔潰

對於已經編譯成二進制的rpm包,由於操作系統環境不同,一般不能混用。
但是以src.rpm形式發行的軟件包,由於需要安裝時進行本地編譯,所以通常可以在不同系統下安裝。


【補充】:源碼rpm包(*.src.rpm)和下文所說的tar包形式的源碼包有什麼區別,以及如何安裝*.src.rpm?

解釋:

1、tar包形式包含的內容是明文可見的源代碼,如果有足夠的能力,可以自行修改源代碼,並且在安裝的時候可以自由選擇要安裝的所需功能(./configure中的各種參數),並且卸載移除的時候也比較方便

2、源碼rpm包即*.src.rpm結尾的這類軟件包是包含了源代碼的rpm包,使用rpm -ivh來進行安裝,生成源程序和SPEC文件,能夠直接生成RPM包,而tar形式源碼包是不支持生成RPM包的。針對src.rpm文件,我們有兩大種安裝方式。


源碼rpm包(*.src.rpm)的安裝:


1)、將rpm文件移動到指定目錄下執行,這裏是移動到/usr/src/packages/SRPMS目錄(SUSE系統)下,使用重組命令rpmbuild --rebuild --clean setarch-1.3-1.src.rpm,將源代碼直接編譯成普通的二進制rpm包.執行之後可以到/usr/src/packages/RPMS/x86_64目錄下找到可用的二進制rpm包setarch-1.3-1.x86_64.rpm進行安裝。
重組命令:rpmbuild --rebuild *.src.rpm 或者 rpm --rebuild *.src.rpm 或者 rpm --recompile *.src.rpm)

示例(以SUSE系統安裝setarch-1.3-1.src.rpm爲例):
suse11sp3-1:~ # cp setarch-1.3-1.src.rpm /usr/src/packages/SRPMS/
suse11sp3-1:~ # cd /usr/src/packages/SRPMS/
suse11sp3-1:/usr/src/packages/SRPMS # rpmbuild --rebuild --clean setarch-1.3-1.src.rpm
suse11sp3-1:/usr/src/packages/SRPMS # cd ../RPMS/x86_64
suse11sp3-1:/usr/src/packages/RPMS/x86_64 # rpm -ivh setarch-1.3-1.x86_64.rpm


2)、在非指定目錄下直接執行rpm -ivh *.src.rpm,切換至/usr/src/packages/SPECS目錄下,執行rpmbuild命令執行spec文件,具體使用什麼參數控制生成源碼包還是rpm包,請自行選擇(-ba參數可以同時生成tar.gz格式的源碼包以及rpm包,-bp是隻生成tar.gz格式源碼包,-bb是隻生成二進制格式rpm包,並且默認的rpmbuild爲i386平臺,如果軟件包是i686平臺軟件包,則需指定到別的平臺,指定參數爲--target=i686)
註釋:直接執行rpm -ivh *.src.rpm之後實際會生成*.tar.gz的源碼包和spec文件,其他文件(例如rpm包等)需要執行其他命令生成。

示例(以SUSE系統安裝setarch-1.3-1.src.rpm爲例):
suse11sp3-1:~ # rpm -ivh setarch-1.3-1.src.rpm 
suse11sp3-1:~ # cd /usr/src/packages/SPECS

suse11sp3-1:/usr/src/packages/SPECS # rpmbuild -bb [–target=i686] setarch.spec  #這裏是直接生成RPM包(-bb參數)
suse11sp3-1:/usr/src/packages/SPECS # cd ../PRMS/x86_64
suse11sp3-1:/usr/src/packages/RPMS/x86_64 # rpm -ivh setarch-1.3-1.x86_64.rpm
or
suse11sp3-1:/usr/src/packages/SPECS # rpmbuild -bp [–target=i686] setarch.spec  #這裏是直接生成源碼包(-bp參數)
suse11sp3-1:/usr/src/packages/SPECS # cd ../BUILD/your-package
suse11sp3-1:/usr/src/packages/BUILD/setarch-1.3 # ./configure
suse11sp3-1:/usr/src/packages/BUILD/setarch-1.3 # make
suse11sp3-1:/usr/src/packages/BUILD/setarch-1.3 # make install 


三:源碼包

1、概念:

源碼包是Linux中軟件包的另一種形式,需要在計算機上進行編譯以後纔可以產生可以直接運行的二進制程序。源代碼包裏面包括了程序的程序代碼,一般就是我們能認識的C語言文件,因此在安裝源碼包的時候通常會檢索系統中是否正確安裝gcc編譯器,並且源代碼安裝的時間會比較長。

源碼包一般的安裝過程是:
1)、解壓、
2)./config、
3)make、
4)make install、
5)

ln -sv /usr/local/xxx/lib/xxx  /usr/lib64/xxx  【動態鏈接庫文件較少的情況下】或者

vim /etc/ld.so.conf   文件末尾追加/usr/local/xxxx/lib,保存退出後執行ldconfig 【建議這種方式】

6)vim /etc/profile,文件末尾添加PATH=/usr/local/xxx/bin:$PATH,然後 source /etc/profile

2、格式:

*.tar.gz、*.tgz、*.bz2

源碼包的格式一般是一個版本號的tar包,例如httpd-2.4.25.tar.gz,文件名包含信息沒有上述提到的二進制包多

3、特性:
tar包形式的源碼包包含的內容是明文可見的源代碼,如果有足夠的能力,可以自行修改源代碼,並且在安裝的時候可以自由選擇要安裝的所需功能(./configure中的各種參數)及路徑等,並且卸載移除的時候也比較方便。 建議在安裝線上的生產服務器軟件包時都用源碼安裝,這是因爲源碼安裝可以自行調整編譯參數,能夠最大化地定製安裝結果。
但是使用源碼包也存在一些缺點不足,例如:
1)安裝過程步驟過多,尤其安裝較大及較多軟件時,添加各種參數時容易出現問題
2)編譯時間較長,執行make編譯的時間通常較長,一會都會比安裝二進制包時間長
3)因爲編譯手動安裝,涉及系統環境比較複雜,可能會出現各種問題,一旦出現問題,新手很難解決(一般都會出現問題)

【補充】:./configure、make、make install等概念講解

./configure
1)、定義需要的功能選項
2)、檢測系統環境是否符合安裝要求
3)、把定義好的功能選項和檢測環境系統信息都寫入Makefile文件,用於後續的編輯
注意1:每個源碼包都會有configure命令,就算極個別沒有這個命令也會用其他的命令取代(例如openssl的./config)
注意2:執行過./configure之後,會生成Makefile文件,make和make install都是依賴這個文件進行編譯安裝的

make
1)將源碼包翻譯成機器能識別的語言(也就是將源代碼-->可執行的二進制文件,類似生成Windows中的.exe可執行文件)
2)一旦編譯出錯,需要修改之後再次編譯,請使用make clean,清除之前的編譯產生的緩存文件。
注意:這一步執行時間一般是最長的。

make install
1)真正的安裝(例如在windows中執行qq.exe或者wechat.exe安裝qq和微信到電腦)
2)一旦這步出錯,需要執行make clean,並刪除對應的目錄(例如./configure使用--prefix參數指定安裝到/usr/local/openssl,則需要刪除該目錄)


四:軟件源/軟件倉庫(repository)


1、概念:

軟件源,顧名思義就是軟件的來源,軟件的來源就是存放各種軟件包的軟件倉庫或者官方發佈的ISO文件,其中包含各種應用軟件。


多數Linux發行版都有自己的軟件安裝、配置方案,同時還有各自的軟件包管理系統。爲了省去用戶四處尋找合適軟件安裝包的麻煩,這些發行版將常用的軟件集中到一個服務器上,併爲用戶提供了自動下載、安裝軟件的接口,這就是我們所說的“軟件倉庫”。爲了方便大衆訪問,人們爲這些軟件倉庫建立了大量的“鏡像”,使世界各地的用戶都能方便地使用。不同發行版的軟件倉庫一般不同,如用戶接口各異、軟件豐富程度不同、鏡像分佈不同等等


軟件倉庫管理軟件,例如yum和zypper,配置文件格式爲*.repo,可以在倉庫中自動地定位並獲取正確的RPM軟件包。多數Linux發行版都有自己的軟件安裝、配置方案,同時還有各自的軟件倉庫管理系統,例如RHEL的yum,suse的zypper,Debian和Ubuntu的apt。


2:、格式:

軟件倉庫有幾種類型:

1)、在線網絡訪問獲取方式,包含各類軟件的二進制包或者源碼包,可以自定義軟件種類及數量,軟件倉庫的獲取方式可以是http、FTP、nfs等,一般官方也會提供這種軟件倉庫。

2)、離線本地訪問獲取方式,官方發行版本的離線ISO文件,內部包含的軟件都是經過篩選的,掛載出來後也可以稱之爲是一個軟件倉庫

軟件倉庫的的配置文件格式一般是:*.repo(RHEL的yum,SUSE的zypper)


3、特性:

軟件倉庫中包含的不止只有軟件包,還有其他信息(軟件包的信息,位置信息,軟件包的依賴關係,索引文件等),就好比我們實際生活中的圖書館,不可能把書塞進去就可以,我們會有一個表格,詳細記錄每本書的摘要信息(作者,發表時間,國家等),所屬類別,所在位置等信息,以後就可以快速的檢索到該書

在Linux操作系統中,軟件包的安裝其實是文件的拷貝,即把軟件所用的各個文件拷貝到特定目錄。當然RPM安裝軟件包,也不例外。但RPM更“先進”一些,因爲它在安裝前,還會執行檢查軟件包的依賴(Dependency)、檢查軟件包的衝突(Conflicts)。最後纔將軟件包裏面的相關文件解出並存放到相應位置。也就是說軟件倉庫中包括了所有RPM包的頭信息(header)描述,比如依賴性等。客戶端使用例如yum等倉庫管理軟件在安裝的時候就會去下載header文件並加以分析,這樣才能自動地從服務端下載相關軟件,並正確地完成安裝任務。

注意:Linux軟件包的基本組成部分通常有:共享庫、應用程序、依賴關係,服務和文檔。對軟件包的使用和管理被稱爲包管理。


五:補充知識點

1、軟件包卸載:

1)源碼包卸載:直接刪除安裝目錄即可,不會殘留任何垃圾,如果創建了軟鏈接及編輯了額外文件請自行記錄移除。
2)RPM包卸載:rpm -e 軟件名(注意,這裏不要帶.rpm,帶的是安裝後系統顯示的軟件名)
不過RPM卸載軟件包的時候,如果不小心,會卸載涉及到依賴關係,很有可能就會卸載移除掉系統所需軟件,導致系統奔潰,所以卸載的時候務必小心




結尾:


     感謝閱讀,祝有收穫的一天,謝謝!






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章