對于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,–hash:hash 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自動解決依賴關系,就需要配置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倉庫,且各主機的版本與平臺并不相同,那么若一個個的配置,是相當復雜的。為了解決這些問題,在路徑中我們可以使用一些變量來簡化操作,其常用變量有以下幾種:
l $releasever:當前OS發行版的主版本號;
l $arch:平臺類型
l $basearch:基礎平臺類型
l $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倉庫了。
2、yum命令
配置完成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,我們一般不需要進行特定配置。
在安裝完成后,我們還需要進行一些選項的配置。
l 導出二進制程序目錄至PATH環境變量中;
編輯文件/etc/profile.d/NAME.sh,添加內容:export PATH=/PATH/TO/BIN:$PATH
l 導出庫文件路徑:
編輯/etc/ld.so.conf.d/NAME.conf,添加新的庫文件所在目錄至此文件中;并通過ldconfig [-v]命令讓系統重新生成緩存:
l 導出頭文件
?基于鏈接的方式實現,鏈接至/usr/includeb
l 導出幫助手冊
?編輯/etc/man_db.conf,添加一個MANPATH
原創文章,作者:luoliumeng,如若轉載,請注明出處:http://www.www58058.com/39923