1. 程式人生 > >程序包管理之----rpm

程序包管理之----rpm

程序包管理 rpm

程序是什麽?指令+數據也好,算法+數據結構也罷。它的存在形式有兩種:

1.源代碼:包含了整個應用程序的編程語言的所有代碼的文本文件

2.二進制:將源代碼經過一系列轉換之後得到的直接執行的文件

其中,使用源代碼安裝的過程如下:

預處理(用到預處理器) --> 編譯(編譯器) --> 字節碼Bitcode 進行匯編(匯編器) --> systemcall直接運行;libcall需要鏈接(鏈接器);最終得到可執行的二進制程序文件

匯編時,不一樣的硬件往往不能兼容互通。因此誕生了一個國際化標準:

POSIX:Portable Operating System 可移植操作系統。至於IX是向unix致敬一下下

最終二進制文件到底能不能執行,取決於計算機的ABI接口。在不同OS上有著明顯的差異,類unix系統上,ABI往往是ELF格式,如果是Windows系列 ;一般是exe或者msi格式.

我們再來回顧一下編程語言的分類

應用級編程語言:

Java(做應用程序很強,做系統菜雞)

hadoop2-大數據處理平臺,hbase-數據庫,ELK-日誌查詢和分析檢索系統

這些軟件運行環境需要專有的一個環境叫:JVM

Python(離底層硬件距離太遠,剛開始太消耗系統資源。現在來說,消耗已經可以忽略了 )

Openstack--雲棧,saltstack--自動化運維管理工具 運行環境:PVM

perl、ruby(日本流行,開發很多曾經的經典遊戲。)

PHP、go

而JVM PVM 和其他應用級語言所需要的解釋器,都是由C語言開發的;

系統級編程語言:

C/C++

Linux、Unix的內核編程語言

編譯開發環境:預處理器、編譯器、頭文件、開發庫文件(能夠讓編譯庫運行的庫)

(而像Java或者Python等應用級語言的開發環境:預處理器、編譯器、開發庫文件;)

通常情況下,源代碼文件有多個,這些文件之間存在著一定的關聯關系;我們稱之為依賴關系;


軟件項目構建工具:

C/C++:make

Java:maven

Python:buildout

盡管有了這些構建工具,編譯源代碼還是十分困難,因此有一些人把常用的代碼打包封裝成程序包,發布開源社區,方便使用


程序包的管理器:


不同的linux發行版本,有著不同的程序包管理器

Debian:dpt-Debian Package Toolkits。所有軟件包封裝成.deb後綴名的包文件,命令行工具 dpkg

Redhat:rpm-Redhat Package Manager ,rpm工具,.rpm後綴名

rpm稱為linux的程序包管理器的行業標準

開始使用的是perl語言編寫,後來用C語言重寫了rpm,公布後改名為rpm is package manager。

Slackware(S.u.S.e):用的是rpm,但是對rpm進行了修改,以至於得到Redhat認可


Gentoo:從內核開始,可以供用戶任意選擇挑選軟件;

采用的包管理器 : FreeBSD 的 portage的程序包管理機制,emerge工具

Archlinux:pacman


以CentOS為例,介紹下rpm程序包管理器的相關內容:

1.程序包的命名規則:

源代碼包:software_name-VERSION.tar.gz

VERSION:major.minor.release

major:主版本號,通常代表重大功能改進的版本分支;

minor:次版本號,代表在某個版本的分支中的某個功能發生變化;

release:發行版本號,修復了某些BUG或者對某段代碼進行了優化;

rpm程序包:

源代碼包:software_name-VERSION.src.rpm

二進制文件包:

software_name-VERSION-[release].[os].arch.rpm

VERSION:major.minor.release

[release]:rpm包的發行版本號

[os]:軟件所支持的操作系統版本信息,el6、el7、suse11、fedora22...

arch:硬件架構類型:i386 i686 x64(amd64) ppc sparc noarch...

例如 gcc-4.8.5-4.el7.x86_64.rpm

在制作rpm程序包的時候,通常其制作者會采用分包技術來構建rpm程序包:根據程序的不同功能,構建多個程序包;被分包的一般分為兩類

1.主程序包:

software_name-VERSION-[release].[os].arch.rpm

2.附屬功能包:

software_name-function-VERSION-[release].[os].arch.rpm

一般來講,主程序包和附屬功能包具有相同版本號 發行版本號 操作系統要求和硬件架構類型

所以 主程序包往往被所有的附屬程序包所依賴;依賴關系:A --> B -->C D --> A 構成一個依賴黑洞 因此rpm存在著諸多‘不與人為善‘的弊端


獲取程序包的途徑:

1.系統發行版的光盤,或鏡像

2.官方的文件服務器或者鏡像站點:

http://mirrors.aliyun.com

http://mirrors.sohu.com

http://mirrors.163.com

http://mirrors.tuna.tsinghua.edu.cn

http://mirrors.hust.edu.cn

...

3.某項目的官方站點 例如apache

4.第三方組織制作的rpm程序包站點

Fedora EPEL:紅帽官方的社區組織,在鏡像站點中也包含EPEL鏡像

搜索引擎:

http://pkgs.org 基本可以搜索到所有

http://rpmfind.net 法國的一個站點

http://rpm.pbone.net

5.自己制作 咯

建議:在獲得程序包之後實施校驗,完整性檢查:

1.來源合法性

通過程序提供者的數字簽名加密的數據,我們可以通過其公鑰進行解密驗證;

2.程序包完整性

sha-1校驗碼

rpm命令行工具:

安裝 卸載 升級(降級) 查詢 文件校驗

【通用選項】:

-v --verbose:顯示安裝歷程詳情,僅僅顯示安裝軟件名

-vv 顯示非常詳細的操作信息

安裝:

rpm {-i|--install} [install-options] PACKAGE_FILE ...

[install-options]

-h --hash 用50個“#”來表示安裝進度

--test: 並不是真正的安軟件包,僅僅是測試是否在安裝時能夠正常完成,dry run

--nodeps : 忽略因為依賴關系導致的安裝錯誤,不建議使用

--replacefiles 安裝軟件包時,軟件包中的文件會直接將原來安裝的文件替換

--replacepkgs 不卸載軟件包 而是重新裝一遍

--noscripts 不運行任何腳本

--nopre

--nopost

--nosignature 不考慮軟件包的來源是否合法

--nodigest 不考慮軟件包是否完整

升級:

rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...

可以升級也可以全新安裝

rpm {-F|--freshen} [install-options] PACKAGE_FILE ...

僅僅是對已經安裝的低版本的程序包進行升級安裝

常用選項與安裝相同

特殊的選項:

--oldpackage 降級安裝

--force 強制升級

註意:

1.強烈建議:不要對內核進行升級操作;linux支持多內核

2.升級後帶來文件的變化,系統默認不會直接更改之前的配置文件,新程序包的配置文件會被重命名,通常是:FILENAME.rpmnew

卸載:

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

--allmatches:卸載所有匹配指定名稱的程序包的各個版本

--nodeps:忽略依賴關系

--test:測試卸載

--nopreun

--nopostun

查詢:

rpm {-q|--query} [select-options] [query-options]

[select-options]

-a,--all:查詢所有已安裝的程序包名

-f,--file FILE 查找指定的文件是由哪個程序包提供的

-p,--package PACKAGE_FILE : 對還沒安裝的程序包文件中執行查詢操作

--whatprovided CAPABILITY 查詢指定的 CAPABILITY是由哪個程序包提供的

--whatrequires CAPABILITY

[query-options]

-c,--configfiles: 查看相關配置文件

-i,--info 查詢程序包相關信息,包括版本號,發行號,等等

-l,--list 列表顯示安裝程序包會生成哪些文件

--providers: 列出指定程序包提供的所有的 CAPABILITY;

-R,--requires 查詢指定的程序包的依賴關系

--scripts: 查詢程序包的腳本

校驗:

rpm {-V|--verify} [select-options] [verify-options]

[select-options] 與查詢的[select-options]相同

認證:

--import PUBKEY ...導入相應的/PATH/TO/KEY_FILE

{-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE ...

手動測試 驗證軟件包的合法性

數據庫管理:

數據庫的初始化和重建:/var/lib/rpm

rpm {--initdb|--rebuilddb}

[--dbpath DIRECTORY]


程序包管理之----rpm