軟件包基礎
軟件包運行環境
硬件、內核、應用程序的關系
包管理器
程序包管理器
Linux不同系統上的包管理器
RPM的優點
rpm包命名方式
一般源代碼的命名
rpm包的命名
rpm包的分類與拆包
包管理工具
RPM包管理器:
程序包管理器:
獲取程序包的途徑:
rpm包管理
CentOS系統上使用rpm
命令管理程序包:
安裝
升級:
降級
降級實例
more
軟件包基礎
包管理過程中,最常用的操作有:安裝、卸載、檢查
軟件包運行環境
硬件、內核、應用程序的關系
-
應用程序運行在內核之外,其中/bin/bash就是各種應用程序之一。
-
內核運行在計算機硬件與應用程序直接。主要工作就是CPU進程、內存的管理,磁盤輸入輸出等工作。
-
應用程序和內核直接的溝通需要接口。
區分以下兩種接口: -
API:應用程序接口。
-
現成的開發包的工具,其動態的庫以so結尾,靜態的庫以a結尾。這種接口中包含C語言中的stdio.h或者math.h這種文件,開發者在math.h中定義了sin()函數,所以在寫C程序時,可以直接引入math.h文件,之后直接調用sin()函數。
-
ABI:應用程序二進制接口(application Binary interface)。
windows系統和linux系統在數據存儲等方面,都存在差異性。所以如果想在windows上模擬linux環境,或者是在linux系統上模擬windows環境,需要編寫模擬的是ABI的應用程序。也就是庫級別的虛擬化:
-
它定義了一組在PowerPC系統軟件上編譯應用程序所需要遵循的一套規則。主要包括基本數據類型,通用寄存器的使用,參數的傳遞規則,以及堆棧的使用等等。它涵蓋了各種細節:如數據類型、大小和對齊;調用約定(控制著函數的參數如何傳送以及如何接受返回值);系統調用的編碼和一個應用如何向操作系統進行系統調用;以及在一個完整的操作系統ABI中,目標文件的二進制格式、程序庫等等。
API與ABI的不同
Java的代碼可以在各個平臺轉移。這是因為java的代碼是二次編譯。
二進制文件hello.class可以在win或linux上運行。主要依靠jvm。jvm將windows命令轉化成它同一的,在linux上也是。
所以二進制文件hello.class可以轉移
包管理器
二進制應用程序的組成部分
二進制文件
庫文件
配置文件
幫助文件
庫文件:共用的程序模塊(可無)
程序包管理器
Linux不同系統上的包管理器
系統名 | 包文件類型 | 包管理器 | 使用命令 | 線上升級機制(命令) |
---|---|---|---|---|
debian/Ubuntu | deb文件 | dpkg包管理器 | dpkg | APT(apt-get) |
redhat | rpm文件 | rpm包管理器(RPM Package Manager) | rpm,rpmbuild,rpmdb(centos7) | YUM(yum) |
RPM的優點
-
rpm包是通過預先編譯并打包而成的,所以免除了重新編譯的困擾
-
避免錯誤安裝:rpm包安裝前,會檢查系統的硬盤容量,操作版本等。
-
更了解軟件:該包本身提供軟件版本資訊、依賴性軟件名稱、軟件用途說明、軟件所含文件等資訊
-
數據庫。RPM的管理方式使用數據庫記錄RPM文件的相關參數,便于升級、移除、查詢與驗證。
rpm包命名方式
-
實例:yum-plugin-security-1.1.30-37.el6.noarch.rpm
其中: -
noarch和硬件平臺無關
-
i686支持32位(也可以裝在64位)
-
x86支持64位
一般源代碼的命名
一般源代碼名:name-VERSION.tar.gz|bz2|xz
其中,VERSION=major.minor.release
rpm包的命名
rpm包命名方式:
– name-VERSION-release.arch.rpm
其中
– VERSION=major.minor.release
– release:release.OS
– OS:上例中,el7是表示OS的,代表RHEL7
– 常見的arch有:
架構系列 | 常見架構 | 說明 |
---|---|---|
x86系列 | i386,i486, i586, i686 | i針對的是intel兼容的CPU的意思,后面的XXX表示不同的等級,不同的等級的CPU在針腳等方面或許會有不同 |
x86_64系列 | x64, x86_64, amd64 | 針對64位的CPU進行最佳化編譯配置。包括Intel Core2以上等級,AMD Athlon64以上等級,都是這類。 |
powerpc | ppc | |
noarch | 沒有硬件等級上的限制(跟平臺無關) | 一般來說,這類型的RPM文件,里面應該沒有二進制文件的存在,較常出現的就是屬于Shell Script方面的軟件 |
-
軟件版本號:
主版本號,此版本號,修正版本號:在主版本的架構下,更動部分原始碼內容,而釋放出一個新的版本,就是次版本號。在此版本中,修正一些bug等,就是修正版本號。
-
軟件的編譯次數:
為何會有重新編譯?因為某些原因(比如某些bug或者安全上的考慮),必須要進行小幅度的打補丁或重設一些編譯參數。配置完成后重新編譯打包,形成了新的rpm包。不同的打包數就出現了。
-
硬件平臺
RPM可以適用在不同的操作平臺上,但是不同的平臺配置的參數還是有所差異的。針對性能比較高的CPU進行最佳化參數的配置,這樣才能夠適用高性能CPU所帶來的硬件加速功能。這就是不同的arch。
rpm包的分類與拆包
如果將所有的功能與模塊,放在同一個包中,不利于后來的管理和排錯。所以最好將包按照功能等分類或拆開:
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm:開發子包
Application-utils-VERSION-ARHC.rpm:其它子包
Application-libs-VERSION-ARHC.rpm:其它子包
包管理工具
在包與包之間,若是有循環依賴的關系,需要有工具來解決以來關系,并安裝。這種循環依賴的安裝,如果只是一步一步的安裝解決依賴關系,那就太耗費人力物力了,這時,就需要使用一些前端工具來自動解決依賴關系。
解決依賴包管理工具:
工具 | 作用 |
---|---|
yum | rpm包管理器的前端工具 |
apt-get | deb包管理器前端工具 |
zypper | suse上的rpm前端管理工具 |
dnf | Fedora 22+ rpm包管理器前端管理工具 |
RPM包管理器:
程序包管理器:
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操作
-
1、包文件組成(每個包獨有)
RPM包內的文件
RPM的元數據,如名稱,版本,依賴性,描述等
安裝或卸載時運行的腳本 -
2、數據庫(公共) <===已經安裝了的包的詳細信息,記錄這些東西,以后可能檢查會用到。檢查現在的程序是否有改變,比如有效用戶等。
程序包名稱及版本
依賴關系
功能說明包
安裝后生成的各文件路徑及校驗碼信息 -
管理程序包的方式:
-
使用包管理器:rpm
使用前端工具:yum,dnf
獲取程序包的途徑:
(1)系統發版的光盤或官方的服務器;
CentOS鏡像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2)項目官方站點
(3)第三方組織:Fedora-EPEL:Extra Packages for EnterpriseLinux
Rpmforge:RHEL推薦,包很全
搜索引擎:(專門用于搜索軟件包)
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
(4)自己制作
需要對源碼分析了解,才能夠制作rpm包
** 注意:檢查其合法性:來源合法性;程序包的完整性**
rpm包管理
CentOS系統上使用rpm
命令管理程序包:
安裝、卸載、升級、查詢、校驗、數據庫維護
安裝
rpm {-i|--install} [install -options] PACKAGE_FILE...
-
-v: verbos
-
-vv
-
-vvv
-
-h:以#顯示程序包管理執行進度(50個)
常用命令:
rpm -ivh PACKAGE_FILE ...
選項:
-
–test:測試安裝,但不真正執行安裝;dry run模式
-
–nodeps:忽略依賴關系
-
–replacepkgs|replacefiles ##保存原來修改過的配置文件,(除非某配置文件沒有,才會寫入)
-
replacepkgs:原來損壞的軟件和現在要裝的包,版本等是相同的。
-
replacefiles:包名都不一樣。原來的和現在的,有些庫等,會重復,可以用這個。有點類似于升級了。
-
–nosignature:不檢查來源合法性
由于現在網絡等問題,無法檢測signature時,也會說不合法 -
–nodigest:不檢查包完整性
-
–noscipts 參數:不執行程序包腳本片斷
腳本 | 名稱 | 對應選項 |
---|---|---|
%pre | 安裝前腳本 | –nopre |
%post | 安裝后腳本 | –nopost |
%preun | 卸載前腳本 | –nopreun |
%postun | 卸載后腳本 | –nopostun |
升級:
-
使用格式:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE... rpm {-F|--freshen} [install-options] PACKAGE_FILE...
-
二者區別
-
upgrade:安裝有舊版程序包,則“升級”(升級意味著,如果有新版本,老版本就沒了)
– 如果不存在舊版程序包,則“安裝” -
freshen:安裝有舊版程序包,則“升級”
– 如果不存在舊版程序包,則不執行升級操作 -
常用命令
rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ...
-
內核的升級
往往不是升級,而是安裝新的內核
這樣新舊內核就可以同時存在,使用新內核過程中出現問題,就繼續使用舊內核。 -
內核也可以降級
notes:
(1)不要對內核做升級操作;Linux支持多內核版本并存,因此,對直接安裝新版本內核
(2)如果原程序包的配置文件安裝后曾被修改,升級時,新版本的提供的同一個配置文件并不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
降級
常在新包不穩定的時候使用降級,獲得穩定的版本使用
-
–oldpackage:降級(這個得配置i才能夠裝的上-i –oldpackage)
-
–force:強行(可以省去好多其他選項:–replacepkgs…..等 )
降級實例
6.8—>6.7
需要安裝的是這兩個包
當前系統內核:
可以看出,爆出來的這個問題,并不是那么嚴重
裝完后,系統中同時存在原來的和現在的,這主要是因為原來版本和現在版本安裝時,很多文件是相同的,沖突了。所以不會直接覆蓋???boot啟動目錄中,都是兩個了。
more
rpm -l可以查看包的文件列表,但是看不到腳本
原創文章,作者:m20-吳清玲,如若轉載,請注明出處:http://www.www58058.com/39858