CentOS程序包管理

對于Linux系統而言,其能執行的程序為二進制格式,而對于程序開發者而言,直接利用二進制開發程序是不太現實的,所以一般都是利用高級語言來進行軟件開發,其程序也即稱為源代碼;那么我們在對一個程序進行安裝、升級、卸載、 查詢、校驗等操作時,需要對每個源代碼進行編譯成為二進制程序,那么顯然是不太現實的。所以在各Linux發行版中一般都帶有程序包管理器。

所謂程序包管理器就是將源代碼編譯成為目標二進制格式后,組織成為一個或有限幾個文件,這些包文件能夠完成安裝、升級、卸載、查詢、校驗等的操作。對于不同發行版,其所采用的程序包管理器也各不相同。我們以應用面較廣的RPM(redhat package manager)為例來對程序包管理器做一下了解。

 

一、RPM程序包管理

1、命名規則

對于RPM程序包而言,其命名也有相應的規則,比如我們以tree為例

[root@luolmcentos7 testdir]# ll /run/media/root/CentOS\ 7\ x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm 
-r--r--r--. 2 root root 47508 Jul  4  2014 /run/media/root/CentOS 7 x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm

我們看到tree程序包的完整名稱為tree-1.6.0-10.el7.x86_64.rpm,其命名規則一般為:

name-version-release.distribution.arch.rpm

軟件名稱軟件版本發布版本.系統發行版本.硬件平臺.擴展名

2、依賴關系

我們知道,Linux的哲學思想中很重要的一部分為:程序為小型、單一用途,通過鏈接程序,共同完成復雜的任務。所以,當我們在安裝某一個程序時,可能往往其會依賴一些其他程序提供的功能才能夠運行或實現相應的功能。比如我們在安裝httpd-devel-2.4.6-40.el7.centos.x86_64.rpm時,其提示信息如下:

[root@luolmcentos7 testdir]# rpm -ivhf /run/media/root/CentOS\ 7\ x86_64/Packages/httpd-devel-2.4.6-40.el7.centos.x86_64.rpm 
error: Failed dependencies:
apr-devel is needed by httpd-devel-2.4.6-40.el7.centos.x86_64
apr-util-devel is needed by httpd-devel-2.4.6-40.el7.centos.x86_64

可以看出,軟件包之間可能存在相互之間的依賴關系,所以對于rpm而言,其同樣能夠提示我們軟件之間的這種關系。

了解了這些,下面我們來具體看一下rpm命令。

3、rpm命令

rpm [options] [package_file]

–dbpath DIRECTORY:指定數據庫目錄,不使用默認值(/var/lib/rpm/)

-v:顯示命令執行過程中的詳細信息;

-vv:顯示命令執行過程中的更加詳細的信息;

對于程序具體的安裝、升級、查詢、卸載校驗等的操作,rpm分別有對應的命令格式與選項,下面分別來看一下。

RPM安裝(install)

rpm {-i|–install} [install-options] PACKAGE_FILE …

-i:安裝RPM

-h,–hashhash marks輸出進度條;每個#號表示2%的進度;

–nodeps:忽略依賴關系;

–replacefiles:允許安裝過程中覆蓋已存在的文件;

–replacepkgs:允許重新安裝已安裝的程序;

–force:強制執行操作

–test:測試安裝,檢查并報告依賴關系及沖突信息等;

–justdb:僅更新程序數據庫,不更新文件;

–nosignature:不檢查包簽名信息,不檢查來源合法性;

–nodigest:不檢查包完整性信息;

–noscript:不安裝程序中的腳本

??preinstall:安裝過程開始之前運行的腳本,%pre;–nopre

??posinstall:安裝過程完成之后運行的腳本,%post;–nopost

??preuninstall:卸載過程真正開始執行之前運行的腳本,%preun;–nopreun

??postuninstall:卸載過程完成之后運行的腳本,%postun;–nopostun

RPM升級與更新(upgrate/freshen)

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

rpm {-F|–freshen} [install-options] PACKAGE_FILE …?

rpm升級與更新的選項與rpm安裝的選項相同,但以下幾個選項需特別說明一下:

-U:升級或安裝;系統中若未安裝后面接的程序,則將予以安裝;

-F:升級;系統中若未安裝后面接的程序,則不會予以安裝;

–oldpackage:允許對程序進行降級;

對于rpm升級與更新,需要注意一下兩點:

1)         不要對內核做升級操作;Linux支持多內核版本共存,因此,可直接安裝新版本內核;

2)         如果某程序包的配置文件安裝后曾被修改過,升級時,新版本的程序提供的同一個配置文件不會覆蓋原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供;

RPM查詢(query)

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

-q:僅查詢,后面接的程序包是否已安裝,及其版本

對于rpm命令的查詢選項,我們按照其命令語法分為兩個部分來說明:

 [select-options]

-a,–all:查詢所有已經安裝過的包

-f FILE:查詢指定的文件是由哪個程序包安裝生成;

-p,–package PACKAGE_FILE:用于實現對程序包執行查詢操作,而非已安裝的軟件;

–whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程序包提供;

–whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;

[query-options]

–changelog:查詢rpm包的changelog;

-l, –list:查詢已安裝程序包生成的所有文件的列表

-i, –info:程序包相關的信息,版本號、大小、所屬的包組等

-c, –configfiles:查詢指定的程序提供的配置文件;

-d, –docfiles:查詢指定的程序包提供的文檔;

–provides:列出指定的程序包提供的所有CAPABILITY;

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

–scripts:查看程序包自帶的腳本片段;

對于rpm的查詢命令,我們需要注意的是:

1)         只要是對程序包進行的查詢(而非已安裝的程序),就需要增加-p選項;

2)         在查詢本機上面RPM軟件的相關信息時,不需要加上版本的名稱,只要加上軟件名稱即可;其會由/var/lib/rpm數據庫查詢;但查詢某個RPM程序包就不同了,我們必須要列出整個文件的完整文件名;

rpm驗證與數字證書

對于開源程序來說,其程序來源對于系統安全而言就比較重要了。所以,我們對程序包及其產生的文件通常要做校驗。其具體命令如下:

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

-V:后面加程序名稱,若該軟件所含的文件被改動過,才會列出來;

-Va:列出目前系統上所有可能被改動過的文件

-Vp:后面加RPM文件,列出該文件內可能被改動過的文件;

-Vf:列出某個文件是否被修改過

[root@luolmcentos7 testdir]# rpm -Va
.M.......    /run/svnserve
S.5....T.  c /etc/cups/cups-browsed.conf

如上圖所示,對于文件前面的代碼分別代表不同的含義,各代碼意義如下所示:

?S file Size differs?文件的容量大小是否被改變

?M Mode differs (includes permissions and file type)?文件的類型或文件的屬性是否被改變

?5 digest (formerly MD5 sum) differs?MD5碼的內容是否已經不同

?D Device major/minor number mismatch?設備的主/次代碼是否已經改變

?L readLink(2) path mismatch?Link路徑已被改變

?U User ownership differs?文件的所有者是否已經改變

?G Group ownership differs?文件的所屬用戶組是否已經改變

?T mTime differs?文件的修改時間是否已經改變

?P caPabilities differ?功能是否已經改變

上述基本上是對已安裝文件的完整性進行的驗證,而要對程序包進行來源合法性與完整性驗證時,我們需要首先導入密鑰,其命令為(對于CentOS7發行版而言):

rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

安裝完成密鑰后,當我們安裝此組織簽名的程序時,會自動執行驗證,我們也可以手動驗證,其命令為:

rpm -K PACKAGE_FILE

rpm卸載

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

?–allmatches:卸載所有匹配指定名稱的程序包的各版本;

?–nodeps:忽略依賴關系;

?–test:測試卸載,dry run模式;

rpm數據庫重建

當我們利用rpm命令去進行查詢等操作時,其通過rpm管理器的數據庫(/var/lib/rpm)來進行查詢。那么對于數據庫,我們同樣可以進行初始化、創建等操作。

rpm {–initdb|–rebuilddb} [-v] [–dbpath DIRECTORY] [–root DIRECTORY]

?–initdb:初始化數據庫,當前無任何數據庫時,可初始化創建一個新數據庫;若當前 有數據庫時,不執行任何操作;

?–rebuilddb:重新構建,通過讀取當前系統上所有已經安裝過的程序包進行重新創建;

以上,就是對于rpm程序包管理器的相關介紹,下面我們利用rpm來安裝tree程序。

[root@luolmcentos7 testdir]# rpm -q tree
package tree is not installed
[root@luolmcentos7 testdir]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 
[root@luolmcentos7 testdir]# rpm -K /run/media/root/CentOS\ 7\ x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm 
/run/media/root/CentOS 7 x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
[root@luolmcentos7 testdir]# rpm -ivh /run/media/root/CentOS\ 7\ x86_64/Packages/tree-1.6.0-10.el7.x86_64.rpm 
Preparing...                          ################################# [100%]
Updating / installing...
   1:tree-1.6.0-10.el7                ################################# [100%]

在以上介紹中,我們知道各軟件間可能會存在相互依賴關系,且在利用rpm安裝程序時需要給定程序包的路徑,那么能不能解決這些問題,從而使得程序安裝更加簡單呢?這時,我們就需要用到程序包管理的前端工具了。對于CentOS而言,其前端管理工具為yum。

 

二、yum

yum是一個rpm包的前端管理工具,在rpm包的依賴關系已經被建成數據庫的前提下,它能夠實現自動查找相互依賴的rpm包,并從repository中下載互相依賴的rpm包到本地。其工作原理如下:

yum工作原理.png

我們看到,若想yum自動解決依賴關系,就需要配置yum,建立yum repository,即yum倉庫,我們先看一下如何建立yum倉庫。

1、yum倉庫的建立

yum的有兩類配置文件,分別為:

/etc/yum.conf:為所有倉庫提供公共配置及yum命令自身的配置;

/etc/yum.repos.d/*.repo:為倉庫的指向提供配置;

如果要新建yum倉庫,那么就要配置yum/etc/yum.repos.d/下的配置文件,其常用的配置選項有以下幾種。

1)         [repositoryID]?代表倉庫的ID,中括號一定要存在,里面的名稱則可以隨意取,但是不能有兩個相同的容器名稱;

2)         name=?只是說明一下這個倉庫的意義而已,重要性不是很高,可以不進行定義;

3)         mirrorlist=?只是一個保存列表的網站,centos 將從中選著一個鏈接來下載更新;

4)         baseurl=?倉庫的實際地址,其地址內必須要有repodata文件夾;baseurl支持http://,ftp://,file:///三種格式;可以有多個baseurl;

5)         enabled={1|0}?1代表倉庫可以使用,為0代表倉庫不可使用;默認為1

6)         gpgcheck={1|0}?1代表需要進行gpg校驗,為0代表不需要進行gpg校驗;默認為1;

7)         gpgkey=URL?指定gpgkey的路徑;一般使用默認值即可

8)         enablegroups={1|0}?1代表在本倉庫啟用包組,為0代表在本倉庫禁用包組;

9)         failovermethod={roundrobin|priority}?失敗后啟用的優先級,roundrobin為隨機挑選,priority為優先選擇,即失敗后優先選擇本倉庫;默認為:roundrobin;

10)     cost= ?默認為1000;花費值,值越低,優先級越高;

在這些配置選項中,baseurl指向的是倉庫的實際地址,那么假如我們要對批量主機配置yum倉庫,且各主機的版本與平臺并不相同,那么若一個個的配置,是相當復雜的。為了解決這些問題,在路徑中我們可以使用一些變量來簡化操作,其常用變量有以下幾種:

$releasever:當前OS發行版的主版本號;

$arch:平臺類型

$basearch:基礎平臺類型

$YUM0~$YUM9:用戶自定義的10個變量;

有了這些變量,我們在配置路徑時就可以像下面這樣配置了。

http://10.1.0.1/cobbler/ks_mirror/$releasever/$basearch/

在配置好配置文件后,那么對于各個程序包的元數據及依賴關系又存放在哪里呢?這些程序都存在與yum配置文件中baseurl指向的路徑的repodata文件夾中,所以,對于倉庫中的所有程序包,我們需要生成repodata文件。這里,我們就要用到createrepo程序了。

了解了以上這些,我們就可以動手配置yum倉庫了,假如我們以CentOS7的安裝光盤作為yum源,將其程序包復制至本地來進行配置,其步驟如下:

a)         復制光盤中的程序包至本地

[root@luolmcentos7 testdir]# mkdir yum
[root@luolmcentos7 testdir]# cp /run/media/root/CentOS\ 7\ x86_64/Packages/* /testdir/yum/

b)         利用createrepo命令來生成repodata文件夾

[root@luolmcentos7 testdir]# cd /testdir/yum/
[root@luolmcentos7 yum]# createrepo .
Spawning worker 0 with 162 pkgs
Spawning worker 1 with 162 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete
[root@luolmcentos7 yum]# ll | grep "repodata"
drwxr-xr-x. 2 root root     4096 Aug 24 20:05 repodata

c)         配置配置文件

[root@luolmcentos7 testdir]# cd /etc/yum.repos.d/
[root@luolmcentos7 yum.repos.d]# vim centosrom.repo 
[root@luolmcentos7 yum.repos.d]# cat centosrom.repo
[centosrom]
name=centosrom
baseurl=file:///testdir/yum
gpgcheck=0
enabled=1

現在,我們就可以使用剛剛配置完成的yum倉庫了。

 

2yum命令

配置完成yum倉庫后,我們來看一下yum命令的具體應用。

yum [options] [command] [package …]

-y:當yum要等待用戶輸入時,此選項可自動提供yes相應

–installroot=/path/to/somewhere:將該軟件安裝在/path/to/somewhere中而不使用默認路徑

–nogpgcheck:禁止進行gpg check

-q,–quiet:靜默模式

–disablerepo=repoidglob:臨時禁用此處指定的repo

–enablerepo=repoidglob:臨時啟用此處指定的repo

–noplugins:禁用所有插件

yum list {all|available|installed|updates} [glob_exp1] […]     列出目前yum所管理的所有的軟件名稱與版本,有點類似于rpm -qa;支持通配符;

all:列出所有軟件名稱與版本;

available:列出yum倉庫中所有可安裝的軟件名稱與版本;

installed:列出yum倉庫中所有已安裝的軟件名稱與版本;

updates:列出在yum倉庫中可供本機升級的軟件的名稱與版本;

yum repolist [all|enabled|disabled]         列出所有yum倉庫的列表

yum info […]    列出目前yum所管理的所有的軟件的相關信息,有點類似于rpm -qai;后面可跟某程序名稱,查詢此程序的相關信息;

yum search string1 [string2] […]     以指定的關鍵字搜索程序包名及summary信息;模糊搜索;

yum provides | whatprovides feature1 [feature2] […]   查看某些文件或特性是由哪些軟件提供的,類似于rpm -qf的功能;

yum install package1 [package2] […]

install:后面接要安裝的軟件

yum update [package1] [package2] […]

update:后面接要升級的軟件,若要整個系統都升級,就直接update即可;

yum check-update   檢查可用升級

yum remove | erase package1 [package2] […]       刪除功能

注:卸載程序時,所有依賴于此程序的程序也會被卸載

yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

清理本地緩存

yum makecache

構建緩存

yum reinstall package1 [package2] […]

重新安裝

yum downgrade package1 [package2] […]

降級

yum deplist package1 [package2] […]

查看指定包所依賴的capabillities

yum version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]

查看rpmdb的版本信息

history[info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]

查看yum事務歷史

安裝及升級本地程序包

localinstall rpmfile1 [rpmfile2] […]

(maintained for legacy reasons only – use install)

localupdate rpmfile1 [rpmfile2] […]

(maintained for legacy reasons only – use update)

包組管理的相關命令:

         * groupinstall group1 [group2] […]          安裝包組

         * groupupdate group1 [group2] […]        升級包組

         * grouplist [hidden] [groupwildcard] […]         列出yum倉庫中的包組

         * groupremove group1 [group2] […]       刪除包組

         * groupinfo group1 […]   查看包組的相關信息

 

3、編譯安裝

在很多情況下,封裝好的程序包并不能夠滿足我們的使用要求,這時候,我們就需要自己進行編譯安裝。對于C代碼進行編譯安裝一般分為三個步驟。

1)         ./configure

主要作用是通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的指定以及Makefile.in文件生成makefile并檢查依賴到的外部環境;

2)         make:根據makefile文件,構建應用程序;

3)         make install

在進行編譯安裝時,首先會檢查所依賴的外部環境,我們需要需要提供開發工具及開發環境。我們可以通過包組來提供所需環境。在CentOS6中,我們需要安裝”Development Tools”"Server Platform Development"包組,在CentOS7中,我們需要安裝”Development and Creative Workstation””Development Tools”包組。下面我們來看一下各步驟中的一些配置。

在第一步運行configure腳本時,我們一般可以使用以下一些選項:

./configure –help獲取其支持使用的選項

–prefix=/PATH/TO/SOMEWHERE:指定默認安裝位置;(默認為/usr/local/

–sysconfdir=/PATH/TO/SOMEWHERE:配置文件安裝位置

System types:交叉編譯;目標系統平臺特性

Optional Features:可選特性

–disable-FEATURE

–enable-FEATURE[=ARG]

Optional Packages:可選程序包(依賴程序包)

–with-PACKAGE[=ARG]

–without-PACKAGE

configure完成后,在源程序文件夾下已經有makefile文件

而在第二步make與第三步make install,我們一般不需要進行特定配置。

在安裝完成后,我們還需要進行一些選項的配置。

導出二進制程序目錄至PATH環境變量中;

編輯文件/etc/profile.d/NAME.sh,添加內容:export PATH=/PATH/TO/BIN:$PATH

導出庫文件路徑:

編輯/etc/ld.so.conf.d/NAME.conf,添加新的庫文件所在目錄至此文件中;并通過ldconfig [-v]命令讓系統重新生成緩存:

導出頭文件

?基于鏈接的方式實現,鏈接至/usr/includeb

導出幫助手冊

?編輯/etc/man_db.conf,添加一個MANPATH

原創文章,作者:luoliumeng,如若轉載,請注明出處:http://www.www58058.com/39923

(0)
luoliumengluoliumeng
上一篇 2016-08-25
下一篇 2016-08-25

相關推薦

  • Redis的編譯安裝

    介紹     redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set –有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集并集和差集及更…

    Linux干貨 2015-02-28
  • 兩張盤合并做yum源

    第一步 先把兩張光盤都連接到系統中 連接上iso文件后重啟電腦 這時桌面會顯示已將連接上的iso文件   然后創建兩個文件夾分別掛載這兩個光盤   mkdir centos6.9-{1,2} 創建兩個文件夾 df 查看系統硬盤   然后把兩個光盤分別掛載到文件中 mount -o ro,loop /dev/sr0 centos6…

    2017-07-12
  • haproxy

    12.1 高性能負載均衡軟件HAProxy介紹 隨著互聯網業務的迅猛發展,大型電商平臺和門戶網站對系統的可用性和可靠性要求越來越高,高可用集群、負載均衡集群成為一種熱門的系統架構解決方案。在眾多的負載均衡集群解決方案中,有基于硬件的負載均衡設備,例如F5、Big-IP等,也有基于軟件的負載均衡產品,例如HAProxy、LVS、Nginx等。在軟件的負載均衡產…

    2018-01-03
  • shell中if條件字符串、數字比對,[[ ]]和[ ]區別

    今天學習shell, if條件流程控制,但發現if[ ]]和if[ ]什么時候用不是清楚,正好看到一篇文章,非常好,轉載,留個備份。 參考: http://www.51testing.com/?uid-7701-action-viewspace-itemid-13731 http://blog.csdn.net/sunboy_2050/article/det…

    Linux干貨 2016-08-12
  • Linux文件類型及顏色標識

    查看文件類型:      指令:ll 文件名或目錄名      –  白色 普通文件(可執行文件)      l  擴寫:sysbolic link 淡藍色 符號鏈接文件   &…

    Linux干貨 2016-10-18
  • 磁盤管理

    1、拿到一塊硬盤,通常來講,第一步是分區,然后是文件系統的創建,管理文件系統,第三步是掛載設備。 2、linux(準確的說是UNIX)哲學,whindows一切皆窗口,一切皆圖形。 3、磁盤是一個硬件設備,存放在/dev/目錄下,會有相應的文件來對應的表示這些設備文件,在這個目錄下存放的全是設備。 4、在/dev目錄下和設備相關的有兩種,一種是c開頭為字符,…

    Linux干貨 2017-04-22
欧美性久久久久