天天看點

rpm-yum-編譯

.1. 安裝

文法格式:

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

常用指令選項:

-v:verbose,輸出詳細的過程資訊;

-vv:very verbose,輸出更為詳細的過程資訊;

安裝選項(install-options):

-h:hash marks輸出進度條;hash标記符為#,每個#表示2%的進度;

--test:測試安裝,檢查并報告依賴關系及沖突資訊等;相當于dry run;

--nodeps:忽略依賴關系,不建議使用;

--replacepkgs:重新安裝;

--noscripts:指定不運作腳本;

--nosignature:不檢查包簽名資訊,即不檢查程式包的來源合法性;

--nodigest:不檢查包完整性資訊;

用法:

rpm -ivh PACKAGE_FILE ...

注意:rpm可以自帶腳本

最多有四類腳本:(--noscripts可指定不運作這四類腳本)

preinstall:安裝過程開始之前運作的腳本,%pre;--nopre可指定不運作;

postinstall:安裝過程完成之後運作的腳本,%post;--nopost可指定不運作;

preuninstall:解除安裝過程真正開始執行之前運作的腳本,%preun;--nopreun可指定不運作;

postuninstall:解除安裝過程完成之後運作的腳本,%postun;--nopostun可指定不運作;

指令示範:

安裝zsh,首先挂載CD光牒:

[root@osyunwei ~]# mkdir /media/cdrom

[root@osyunwei ~]# mount /dev/sr0 /media/cdrom

mount: block device /dev/sr0 is write-protected, mounting read-only

用rpm下載下傳zsh:

[root@osyunwei ~]# cd /media/cdrom/Packages/

[root@osyunwei Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm

Preparing... ########################################### [100%]

1:zsh ########################################### [100%]

8.2. 更新

文法格式:

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

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

常用選項:

-U:更新或安裝;

-F:更新;

-v:同“安裝”;

-vv:同“安裝”.

安裝選項(install-options):

--oldpackage:降級 --> 某些程式更新後遇到不相容的情況,此時需要降級;

--force:強制更新 --> 某些程式更新後會引起依賴性問題,此時可能會用到此選項;

其他安裝選項同“安裝”。

用法:

rpm -Uvh PACKAGE_FILE ...

rpm -Fvh PACKAGE_FILE ...

8.3. 解除安裝

文法格式:

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

解除安裝選項(erase options):

--allmatches:解除安裝所有比對指定名稱的程式包的各版本;

--nodeps:忽略依賴關系;

--test:測試解除安裝,dry run模式。

用法:

rpm -e PACKAGE_NAME

8.4. 查詢

文法格式:

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

[select-options]:

PACKAGE_NAME:查詢指定的程式包是否安裝,及其版本;

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

-f, --file FILE:查詢指定的檔案由哪個程式包安裝生成;

-p, --package PACKAGE_FILE:用于實作對未安裝的程式包執行查詢操作;

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

--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴。

[query-options]:

--changelog:查詢rpm包的changelog;

-i, --info:程式包相關的資訊,版本号、大小、所屬的包組等

-l, --list:程式包安裝生成的所有檔案清單;

-c, --configfiles:查詢指定的程式包提供的配置檔案;

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

--provides:列出指定的程式包提供的所有的CAPABILITY;

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

--scripts:檢視程式包自帶的腳本片段。

8.5. 校驗

用途:可檢查程式包中的資料是否被修改過。

文法格式:

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

用法:

rpm -V PACKAGE_NAME

8.6. 資料庫重建

預設rpm管理器的資料庫路徑為/var/lib/rpm,剛才的查詢操作正是通過此處的資料庫進行。

擷取幫助:

CentOS 6:man rpm

CentOS 7:man rpmdb

文法格式:

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

常用選項:

--initdb:初始化資料庫,目前無任何資料庫可初試化建立一個新的資料庫;目前有時不執行任何

操作;

--rebuilddb:重新建構,通過周遊讀取目前系統上所有已經安裝過的程式包進行重新建立;

對于CentOS發行版來說,假設已擷取正确的公鑰,那麼導入信任的包制作者的公鑰(或簽名密鑰)操作如

下:

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

1. yum概述

之前在上一篇文章裡提到的rpm包管理器雖然在資料庫中為使用者指定了程式包之間的依賴關系,但用

戶仍需根據程式包的依賴關系去手動使用rpm指令來安裝每個程式包,過程略為繁瑣。而yum作為前端管

理工具則為使用者解決這一問題。

yum的全稱為:Yellow dog Updater, Modifier,是通過修改Yellow Dog Linux的Yellow Dog

Updater開發而成。

yum是基于rpm包管理器的前端程式包管理器,可以從指定伺服器上自動下載下傳程式包,并自動分析程

序包的中繼資料、自動處理程式包之間的依賴關系,能一次性安裝完所有依賴的包,而無須繁瑣地一次次

安裝所有依賴包。

需要注意的是,yum前端管理工具是基于rpm管理功能的,是以yum不能脫離rpm而存在。yum隻是讓程

序包管理起來更為友善,但不意味着可以取代rpm。另外,yum通路檔案伺服器(倉庫)的模式是基于C/S

架構的,而檔案伺服器(倉庫)則需要以某種共享服務方式将其提供的程式包及包相關的中繼資料提供給

其他主機使用,通常使用到的協定有http、https、ftp、nfs等。此外,還可以使用CD光牒作為本地倉庫或

者自己制作本地倉庫,通常使用到的協定是file。

當使用者使用yum去請求安裝某一個程式包時,yum工具會先去yum配置檔案中查找yum倉庫指向的路徑,根

據該路徑去通路遠端或本地的檔案伺服器,這個伺服器作為yum倉庫并且存儲了衆多的rpm包以及包相關

的中繼資料檔案。當yum根據倉庫路徑通路到倉庫後,會首先嘗試請求擷取rpm包的中繼資料檔案并緩存至本

地(/var/cache/yum目錄),而這個中繼資料檔案包括了該倉庫所有rpm包的程式包名、版本号、依賴性以及

每個程式包所提供的capabilities等。而後,yum根據使用者要安裝的程式包名去中繼資料檔案裡查找,看看

倉庫裡是否有使用者請求下載下傳的程式封包件,如果找到了則根據中繼資料檔案分析該程式包的依賴關系并分

析本地系統上有哪些包已安裝、哪些包還沒安裝,再将所有使用者需要安裝且本地尚未安裝的程式包名列

出來,并以用戶端的角色發送至檔案伺服器(倉庫)請求下載下傳之。如果請求成功,則yum将要安裝的程式

封包件也緩存至本地并執行安裝操作。安裝完成之後将緩存的程式封包件删除以節約空間,而緩存中隻

留下中繼資料檔案。

為什麼隻緩存中繼資料而不緩存程式包呢?因為程式包一般隻安裝一次即可,很少會再安裝第二次,而且

基于節約空間的考慮,是以yum在安裝完程式包後會将緩存中的程式包删除。而緩存中繼資料好處則是當下

一次使用者使用yum請求安裝程式包時可以節約帶寬,無需再次重新請求擷取全部的中繼資料檔案,并且可以

提高本地分析程式包的速度。

當使用者第二次使用yum請求安裝程式包時,基于實時同步更新緩存以及節約帶寬的考慮,yum會先請

求下載下傳yum倉庫下rpm包中繼資料的校驗碼檔案至本地,将其與本地緩存上的中繼資料校驗碼相比較,如果

相同,說明無須更新;如果不同,則說明倉庫中rpm包已經更新,是以yum會重新請求下載下傳倉庫上的元數

據檔案以更新中繼資料緩存。接着同樣是分析程式包依賴性、請求要安裝的全部程式包等。

3. yum用戶端配置檔案

yum的配置檔案主要有/etc/yum.conf和/etc/yum.repos.d/*.repo,

其中/etc/yum.conf為主配置檔案,為所有yum倉庫提供公共配置;

而/etc/yum.repos.d目錄下以.repo結尾的檔案則為各yum倉庫的指向提供配置資訊。

需要注意的是,在CentOS發行版中,/etc/yum.repos.d目錄下使用多個以.repo結尾的

倉庫配置檔案是為了友善管理,既可以用多個以.repo結尾的檔案分别配置多個不同的倉庫指向,又可以

在一個.repo檔案中配置多個倉庫指向。而且,當同時存在多個同一類的倉庫時,每個倉庫稱為鏡像,

yum支援鏡像清單插件并且隻使用其中的一個倉庫指向即可,因為同一類倉庫中的程式包是相同的。這時

應該使用離使用者較近的鏡像站點,在repo選項中可通過開銷(cost)指定具體使用哪一個倉庫。當同時存

在多個不同類的倉庫時,每個倉庫中的程式包各不相同,yum也可同時分析、使用這些倉庫。

我們通常在/etc/yum.repos.d目錄下配置yum的指向路徑相關資訊,而在這個配置檔案中的倉庫指向

的定義選項主要有以下幾項:

[repositoryID] //倉庫名

name=Some name for this repository //對repo作功能性說明;

baseurl=url://path/to/repository/ //倉庫指向的路徑,可指向多個路徑;

enabled={1|0} //是否啟用該倉庫,預設為1(啟用);

gpgcheck={1|0} //是否要對程式包資料的來源合法性和資料完整性做校驗;

gpgkey=URL //指定GPG密鑰檔案的通路路徑,可由倉庫提供;

enablegroups={1|0} //是否允許以組的方式管理倉庫;

failovermethod={roundrobin|priority}

yum的子指令用法:

(1)顯示倉庫清單:

# yum repolist [all|enabled|disabled]

(2)顯示程式包:

# yum list [all | glob_exp1] [glob_exp2] [...]

# yum list {available|installed|updates} [glob_exp1] [...]

(3)安裝程式包:

# yum install package1 [package2] [...]

(4)重新安裝:

# yum reinstall package1 [package2] [...]

相當于:rpm -ivh --replacepkgs

(5)更新程式包:

# yum update [package1] [package2] [...]

(6)降級程式包:

# yum downgrade package1 [package2] [...]

相當于:rpm -Uvh --oldpackage

7)檢查可用更新:

# yum check-update

(8)解除安裝程式包:

# yum remove | erase package1 [package2] [...]

注意:依賴于此包的程式會一同被解除安裝。

(9)檢視程式包information:

# yum info [...]

(10)檢視指定的特性(可以是檔案)是由哪個程式包所提供:

# yum provides | whatprovides feature1 [feature2] [...]

相當于rpm -qf FILE;

(11)清理本地緩存:

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

(12)建構緩存:

# yum makecache [fast]

(13)搜尋:

# yum search string1 [string2] [...]

以指定的關鍵字搜尋程式包名及summary資訊;比對方式為模糊比對;

(14)檢視指定包所依賴的capabilities:

# yum deplist package1 [package2] [...]

(15)檢視yum事務曆史:

# yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollbac

k|new|sync|stats]

僅能查到有改動的曆史,例如安裝、更新、解除安裝等。

(16)安裝及更新本地程式包:

# yum localinstall rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use install)

# yum localupdate rpmfile1 [rpmfile2] [...]

(maintained for legacy reasons only - use update)

注意:本地程式包指非倉庫的程式包,可以是從網際網路上下載下傳的程式包。當本地程式包的安裝存在依賴

關系并且該包依賴于倉庫裡的程式包時,使用此選項可借助yum安裝這個本地程式包。但從CentOS 6/7後

,直接install選項指定本地rpm程式包即可,即:# yum install local_rpmfile.

17)包組管理的相關指令:

# yum groupinstall group1 [group2] [...]

# yum groupupdate group1 [group2] [...]

# yum grouplist [hidden] [groupwildcard] [...]

# yum groupremove group1 [group2] [...]

# yum groupinfo group1 [...]

1. 編譯安裝概述

前面兩篇關于程式包管理器的文章談到,無論是使用rpm指令還是yum指令安裝的都是已編譯好的程

序包,在整個安裝過程中使用者隻需執行一條指令即可完成安裝。這樣帶來的好處是友善,但因為是安裝

的是已編譯好的包,是以使用者的系統平台環境必須與rpm包制作者的系統平台環境相同。此外,如果使用者

要安裝使用某程式上的某個功能,而rpm包制作者在編譯過程中預設沒有指定該功能的實作,這時候該怎

麼辦呢?更何況如果某程式隻是提供源碼而沒有現成的rpm包。這時就需要使用者手動編譯安裝了,而編譯

安裝就是将程式源代碼編譯成完全适合自己平台類型的程式包。

是以,使用者首先得獲得程式源碼包(SRPM, Source RPM)。RPM包的命名格式為:name-VERSION-

release.arch.rpm,而程式源碼包(SRPM)的命名格式為:name-VERSION-release.src.rpm。可以發現,

SRPM與RPM相比,将arch替換為src,說明SRPM包去掉了arch這一平台類型限制,是以經過使用者自己編譯

安裝可以編譯成适合自己平台的程式包。

以下為編譯過程圖解(以C源代碼為例):

我們知道,程式源代碼一般為多檔案組織格式,是以檔案中的代碼檔案之間很有可能存在跨檔案的依賴

關系,這将給使用者自行編譯安裝帶來了極大麻煩,因為對先編譯哪些檔案、後編譯哪些檔案根本無從知

曉,是以這就需要項目管理器(或者項目建構器)了。

C/C++的項目管理器為make,make工具可以在編譯過程中指定使用哪個預處理器進行預處理、使用哪個編

譯器進行編譯以及先編譯什麼程式檔案、後編譯什麼程式檔案,甚至完成更為複雜的操作等,能幫助用

戶快速地編譯安裝。

make工具的執行依賴于makefile配置文檔,是以make執行的所有操作皆由makefile指定。makefile可由

執行configure腳本生成。而在執行configure腳本時,configure會結合使用者通過指令行指定的選項以及

各個Makefile.in模闆檔案來生成makefile檔案。編譯完成之後即可使用make install指令将編譯好的程

序包複制到使用者指定的各個目錄下。

2. C代碼編譯安裝三步驟

(1) 執行configure腳本(# ./configure [option...])

常用選項:

--help:獲得其支援使用的選項

--prefix=/PATH/TO/SOMEWHERE:指定預設安裝位置;預設為/usr/local/;

--sysconfdir=/PATH/TO/SOMEWHERE:配置檔案安裝位置;

--enable-FEATURE[=ARG]:開啟指定特性以及安裝路徑;預設開啟時無須指定;

--disable-FEATURE:關閉指定特性;預設關閉時無須指定;

--with-PACKAGE[=ARG]:安裝指定依賴包以及其安裝路徑;

--without-PACKAGE:不安裝指定依賴包;

執行configure腳本的作用:

①使用者可以通過選項傳遞參數給configure腳本,以指定啟用的功能特性、安裝路徑等;而configure腳

本在執行的過程中會參考使用者的指定以及Makefile.in檔案生成makefile檔案;

②檢查程式指定要啟用的功能特性所依賴到的外部環境。

(2) 執行make程式

作用:

make會執行真正的編譯操作,但make本身并不是編譯器,它隻是一個項目建構工具

make程式會根據執行configure腳本所生成的makefile檔案,并調用所需要用到的編譯器來建構應用程式

(3) 執行make install安裝操作

作用:

在前面的make程式執行之後,在目前目錄下會建立出已編譯完成的目标二進制格式的應用程式(包括二

進制程式、庫檔案、配置檔案及幫助文檔等),而make install則會執行安裝操作,即把目前目錄下已

編譯好的程式包(二進制程式、庫檔案、配置檔案及幫助文檔等)複制到使用者指定的各個目錄下。

注意:各個程式在編譯安裝過程中可能不盡相同,是以建議安裝前檢視INSTALL, README。

3. 編譯安裝後的配置

(1) 導出目标二進制程式目錄至PATH環境變量中

方法:

在生産環境中如果該二進制程式作為全局變量,可以在/etc/profile.d/目錄下創

建/etc/profile.d/NAME.d檔案,其中'NAME'可定義設定名稱。在該檔案中寫入下面一行:

export PATH=PATH:/PATH/TO/BIN

這裡的/PATH/TO/BIN即為目标二進制程式所在目錄。

(2) 導出庫檔案路徑

方法:

①在/etc/ld.so.conf.d/目錄下建立/etc/ld/so.conf.d/NAME.conf,其中NAME為自定義設定名稱。而後

,添加新的庫檔案所在目錄至此檔案中即可。

②做完這一步之後,需要讓系統重新生成緩存:

# ldconfig [-v]

3) 導出頭檔案(位于include目錄)

程式編譯安裝完成之後,一般在安裝路徑中會有include目錄,這個include目錄就是頭檔案,頭檔案的

功能是把外部檔案的内容包含到源檔案中,例如外部函數等。在程式開始編譯之前,會執行一段預處理

指令,而預處理指令則把頭檔案的内容包含到源檔案中。

如果要導出頭檔案,可基于軟連結的方式來實作:

# ln -sv 頭檔案目錄 連結頭檔案目錄

(4) 導出幫助手冊

方法:

在CentOS 6上:

編輯/etc/man.config檔案,添加一個MANPATH:

# MANPATH /PATH/TO/MAN

這裡'/PATH/TO/MAN'為目标程式的安裝路徑下的幫助手冊目錄。

在CentOS 7上:

編輯/etc/man_db.conf檔案,添加一個MANPATH:

# MANPATH_MAP /PATH/TO/BIN /PATH/TO/MAN

這裡/PATH/TO/BIN是目标二進制程式所在目錄,/PATH/TO/MAN則是該程式的幫助手冊所在目錄。