開場白
1、軟體的安裝解除安裝是很平常的事情,但是在linux上面卻也這麼的不簡單。Linux的其中一個哲學思想就是 一個程式隻做一件事,并且做好。 組合小程式來完成複雜任務。這樣做有很多好處。但世界上的東西總是兩面的,有得必有失。各個小程式之間往往會存在着複雜的依賴關系。
2、再往前走一步。軟體最初的安裝方式隻有一種,那就是源代碼編譯安裝,這種方式安裝的軟體更貼近本機的系統運作環境,但也更複雜。不僅要解決軟體之間的依賴關系(所依賴的軟體還要再編譯安裝),還要配置開發編譯環境(可能會抓狂的),一切都完成了以後還要指定各種的編譯參數,而且編譯所耗費的時間也比較長。在問題出現的時候,總是有些人或組織來為我們解決問題。是以這時就有了包管理器,如redhat系的rpm,debian系的dpt,dpkg。
3、包管理器為我們解決了編譯的問題,使用起來非常的快捷。但就像我們第一段所說的,依賴關系還是存在的,雖然簡單了很多,但還是會發生幾個小時過去還沒有安裝上軟體的情況發生。那麼包管理器的前端工具就又出現了,它會為我們自動解決依賴關系,從此安裝軟體變的簡單多了。
4、雖說前端工具貌似可以解決所有問題,但在我們使用系統的過程中,它也是有局限性的。源代碼安裝也是很常用到的,但前端工具可以很簡單的解決開發環境和依賴關系的問題。
目錄:
一、rpm包管理器
1、程式包簡介。
2、rpm包管理器。
3、rpm指令的使用。
二、yum使用
三、源代碼安裝軟體
實驗環境:
系統:CentOS_7.1
rpm版本:RPM version 4.11.1
yum版本:3.4.3
一、rpm包管理器。
rpm 是redhat的軟體包管理器。全稱為:redhat package manager。成為工業标準以後的全稱為:rpm is package manager。它的軟體包字尾也為.rpm。
debian 的軟體包管理工具為dpt,dpkg, 軟體包字尾為.deb。
S.u.S.E的軟體包管理器也是使用的redhat的rpm。隻不過因為打包路徑的不同,是以并不通用。
程式包管理器分為兩個部分:包管理工具和打包的檔案。管理工具後面再說,我們先來看一下程式包所包含的東西:
- 編譯好的二進制程式檔案。
- 配置檔案。
- 幫助文檔。
- 編譯好的二進制庫檔案。
程式包還有一種拆包的概念:
源代碼安裝時可以指定功能,但程式包都是别人或組織以大衆需求進行編譯而成的,為了避免安裝一堆用不到的功能,是以常常是不同功能的檔案打包在不同的包内。以主包為基準包含主要的功能,後面就是各種不同的支包(開發包,庫包,工具包等等)。
如以bind為例:
bind 主包;bind-devel 開發包;bind-libs 庫包;bind-utils 工具包。
rpm包命名方式:
源代碼: name-version.tar.{gz|bz2|xz} 注意是源代碼包的命名方式。
VERSION: major.minor,release
major主版本 重大的版本分支
minor 次版本 其中的一個功能有了重大變化,而不是所有的變化
release 發行号。 修正了某個BUG,修正了某一段代碼。
RPM格式:
name-VERSION-relese.arch.rpm
version: 這是源代碼的版本。就是上面的majob,minor,release。
release.arch:打包版本号。rpm的發行号。
arch(archetecture)是硬體架構或系統的平台類型。
如: bash-4.3.2-2.e16.x86_64.rpm
4.3.2是程式版本号 ,2.el6是release(2是rpm的打包版本,el6是軟體平台),後面的x86_64是硬體平台。
硬體架構平台常用到的。
x86_64
i386, i586, i686, 都是x86系列的,新點或舊點。一般都彼此相容。
ppc
noarch 代表通用硬體平台,如解釋型語言寫的程式。
擷取程式包的途徑:
(1) 系統發行版的CD光牒或官方的檔案伺服器(或鏡像站點):
http://mirrors.aliyun.com,
http://mirrors.sohu.com,
http://mirrors.163.com
(2) 項目的官方站點
(3) 第三方組織:
(a) EPEL
(b) 搜尋引擎
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
(4) 自已動手制作。
來源合法性驗正:
不能随意安裝來路不明的軟體包。 源碼包也一樣。
源程式: 通過md5或sha1校驗碼驗證;
rpm包: 發行商提供的合法性一定要是可信的
驗正包完整性: 校驗碼
驗正來源合法: 公鑰驗證來源是正确的。
一定要找合法的來源管道, 不要在google上随便找一個就用。
驗正方法,我們下面會說到。
2、程式包管理器
功能:将編譯好的應用程式的各組成檔案打包成一個或幾個程式封包件,進而更友善地實作程式包的安裝、更新、解除安裝和查詢等管理操作;
1、程式包的組成清單(每個程式包都單獨實作);
檔案清單
安裝或解除安裝時運作的腳本
2、資料庫(公共)
程式包的名稱和版本;
依賴關系;
功能說明;
安裝生成的各檔案的檔案路徑及校驗碼資訊;
等等等
包管理基本功能:打包、安裝、查詢、更新、解除安裝、校驗、資料庫管理
rpm的所有管理功能都是建立在資料庫上面的,是以rpm資料庫是非常重要的。 如果不小心給弄沒了,可以找台軟體包安裝相近的機器,複制一份。rpm自帶的生成資料庫的指令不一定有用。
Centos上的rpm資料庫位置/var/lib/rpm/
3、rpm指令的使用:
rpm [OPTIONS] [PACKAGE_FILE]
安裝:-i, --install
更新:-U, --update, -F, --freshen
解除安裝:-e, --erase
查詢:-q, --query
校驗:-V, --verify
資料庫維護:--builddb, --initdb
rpm在man文檔各個功能都是不同的部分,我們這裡也按不同的部分分開來說,文檔中的GENERAL OPTIONS是穿插在所有功能中的。
1、安裝
rpm {-i|--install} [install-options] PACKAGE_FILE ...
最常用到的組合: rpm -ivh PACKGE_FILE
常用到的選項:
[GENERAL OPTIONS]:
-v:verbose,詳細資訊
-vv:更詳細的輸出
[install-options]:
-h:hash marks輸出進度條;每個#表示2%的進度;
--test:測試安裝,檢查并報告依賴關系及沖突消息等;
--nodeps:忽略依賴關系;不建議;
--replacepkgs:重新安裝
--noscripts 安裝或解除安裝時不運作rpm包自帶的以下四種腳本。
--nopre 不運作安裝過程之前要運作的腳本。
--nopost 不運作安裝過程完成之後要運作的腳本。
--nopreun 不運作解除安裝過程開始之前要運作的腳本。
--nopostun 不運作解除安裝過程完成之後要運作的腳本。
注意:rpm可以自帶腳本;
四類:--noscripts
preinstall:安裝過程開始之前運作的腳本,%pre , --nopre
postinstall:安裝過程完成之後運作的腳本,%post , --nopost
preuninstall:解除安裝過程真正開始執行之前運作的腳本,%preun, --nopreun
postuninstall:解除安裝過程完成之後運作的腳本,%postun , --nopostun
可以把src的rpm包解開以後,檢視它的sepc檔案,其中一部分以%pre,%post之類開頭的腳本段。
--nosignature:不檢查包簽名資訊,不檢查來源合法性;
--nodigest:不檢查包完整性資訊;
最常用到的恐怕就是ivh了。安裝,顯示詳細資訊,以#号顯示過程。
[root@localhost ~]# rpm -ivh zsh-5.0.2-7.el7_1.2.x86_64.rpm
warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-7.el7_1.2 ################################# [100%]
[root@localhost ~]#
--test隻是用來測試安裝,不會真的安裝。用來檢測依賴關系或其它問題。隻執行到上面的例子中的Preparing階段。
--nodeps 忽略依賴關系,如果依賴的僅僅是一些文檔類的包,倒也可以用。
--replacepkgs 重新安裝,不會覆寫已有的配置檔案。如果想完全的重新安裝,最好是先解除安裝再安裝。
腳本的作用,如安裝之前建立要用到的使用者和目錄,安裝之後設定權限,解除安裝之前保證環境,解除安裝之後清理檔案等等。
包的簽名資訊和合法性,是基于包自帶的簽名和制做者的公鑰來實作的。在沒有導入制作者公鑰之前就會報上面例子中第一行的錯誤。我們加上—nosignature試一下:
[root@localhost ~]# rpm -ivh --nosignature zsh-5.0.2-7.el7_1.2.x86_64.rpm
Preparing... #################################
[100%]
Updating / installing...
1:zsh-5.0.2-7.el7_1.2
################################# [100%]
[root@localhost ~]#
注意隻加--nodigest是沒有效果的,因為包完整性是基于軟體包的指紋資訊,而沒有公鑰之前是得不到指紋資訊的。是以還是會報沒有KEY的錯誤。
大家都知道非對稱密鑰吧,以一種算法計算得出私鑰,然後再從私鑰中得出公鑰。
以私鑰加密的檔案隻能用公鑰解密,而以公鑰加密的檔案則隻能用私鑰解密。
這裡解釋一下rpm包是如何做到這種驗證的。
首先軟體包在剛開始,會以單向加密計算出軟體包的校驗嗎。校驗嗎就相當于一個檔案或一些資料的指紋資訊,基本上可以完全做到唯一的标示一個檔案,隻要程式包發生一丁點的變化,加密得出的校驗碼就是完全不同的。
然後制作者會以一些算法(如RSA)生成自己的私鑰和公鑰,再以自己的私鑰把特征碼加密,也就形成了簽名資訊。隻有制作者的公鑰可以解密此簽名資訊。
而因為一對的公鑰和私鑰隻能互相解密,是以隻要拿到制作者的公鑰,可以對簽名解密,也就證明了軟體包的來源合法性。 因為如果是另外的人加密的,用這個公鑰是無法解開的。
把簽名解開以後也就得到了程式包的特征嗎。 此時就可以用相同的單相加密計算出程式包的特征碼。隻要與從簽名解開的特征碼一樣,也就證明了程式包的完整性。
大體上就是從能否解開簽名資訊而知道程式包是否正确。 從特證碼知道程式包是否缺損。
所有的操作都依賴與公鑰是正确的,這也就是CA的功能了,不過我們的程式包還用不到用CA來保證公鑰的正确性。
導入制作者公鑰:
擷取并導入信任的包制作者的密鑰:
對于CentOS發行版來說,安裝完系統以後 /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7,或是CD光牒根目錄裡面的RPM-GPG-KEY-CentOS-7。centos6也一樣,隻不過7是6而已。
驗正:
(1) 安裝此組織簽名的程式時,會自動執行驗正;
(2) 手動驗正:rpm -K PACKAGE_FILE
使用:rpm --import 公鑰檔案 來導入公鑰。
在CentOS7上面還可以用rpmkeys --import指令,而且man文檔中就是rpmkeys指令。
rpmkeys --import PUBKEY ...
rpmkeys {-K|--checksig} PACKAGE_FILE ...
[root@localhost cdrom]# rpmkeys --import RPM-GPG-KEY-CentOS-7
[root@localhost cdrom]# rpm -ivh Packages/zsh-5.0.2-7.el7.x86_64.rpm
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost cdrom]#
可以看到現在沒有報任何錯誤。
[root@localhost ~]# rpm -K zsh-5.0.2-7.el7_1.2.x86_64.rpm
zsh-5.0.2-7.el7_1.2.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
[root@localhost ~]#
單獨的驗證程式封包件也可以。
2、更新:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-U:更新或安裝;如果原本就沒有安裝此軟體,則安裝。
-F:更新,如果沒有安裝些軟體,則不更新。
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
--oldpackage:降級;
--force:強制更新;有時候低版本的程式可能被其它程式所依賴,這時更新會報錯。如果強制更新很可能會導緻一些程式不能使用。這也是還要使用源代碼安裝軟體的一個原因。
注意:(1) 不要對核心做更新操作; 4.0之前的核心必須要重新開機才能使用,可能會發生重新開機以後發現系統起不來了。可以直接安裝新版本核心。Linux支援多核心版本并存,可以直接安裝新版本核心;
(2)隻要新更新安裝的包的配置檔案與老版本的配置檔案不同,新的配置檔案會重命名為*.rpmsave或*.rpmnew之類的名稱。 是根據校驗碼之類的進行的比較。
[root@localhost ~]# rpm -Uvh zsh-5.0.2-7.el7_1.2.x86_64.rpm
warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing... ################################# [100%]
Updating / installing...
1:zsh-5.0.2-7.el7_1.2 ################################# [ 50%]
Cleaning up / removing...
2:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost ~]#
3、解除安裝:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ...
--allmatches:解除安裝所有比對指定名稱的程式包的各版本;
--nodeps:忽略依賴關系
--test:測試解除安裝,dry run模式
[root@localhost ~]# rpm -evh zsh
Preparing... ################################# [100%]
Cleaning up / removing...
1:zsh-5.0.2-7.el7_1.2 ################################# [100%]
[root@localhost ~]#
4、查詢:
rpm {-q|--query} [select-options] [query-options]
-q是基本,可以組合以下各選項。
[select-options]
PACKAGE_NAME:查詢指定的程式包是否已經安裝,及其版本;
-a, --all:查詢所有已經安裝過的包;
-f FILE:查詢指定的檔案由哪個程式包安裝生成;
-p, --package PACKAGE_FILE:用于實作對未安裝的程式包執行查詢操作;
--whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程式包提供;
--whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個包所依賴;
CAPABILITY表示的是一種能力,如生成的可執行程式,提供的web服務,提拱的shell功能等等。
[query-options]
--changelog:查詢rpm包的changlog;修改日志,這裡隻是rpm包的修改日志,而不是源碼的changelog.
-l, --list:程式安裝生成的所有檔案清單;
-i, --info:程式包相關的資訊,版本号、大小、所屬的包組,等;
-c, --configfiles:查詢指定的程式包提供的配置檔案;
-d, --docfiles:查詢指定的程式包提供的文檔;
--provides:列出指定的程式包提供的所有的CAPABILITY;
-R, --requires:查詢指定的程式包的依賴關系;
--scripts:檢視程式包自帶的腳本片斷;
常用到的組合:
-qi PACKAGE:查詢已安裝程式的詳細資訊。
-qf FILE:查詢某個檔案是由哪個程式包所提供的
-qc PACKAGE:查詢已安裝程式的配置檔案。
-ql PACKAGE:查詢已安裝程式所生成的檔案。
-qd PACKAGE:查詢已安裝程式包所提供的文檔。
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE: 這些與上面都一樣,隻不過不是查詢已安裝程式的,而是查詢還沒有安裝的程式封包件。
[root@localhost ~]# rpm -qf /etc/fstab
setup-2.8.71-5.el7.noarch
[root@localhost ~]#
[root@localhost ~]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost ~]#
[root@localhost ~]# rpm -qa | grep zs.*
zsh-5.0.2-7.el7_1.2.x86_64
[root@localhost ~]#
[root@localhost ~]# rpm -qpc zsh-5.0.2-7.el7_1.2.x86_64.rpm
warning: zsh-5.0.2-7.el7_1.2.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost ~]#
最後一個例子是直接提供的程式封包件,而不是程式名稱。倒數第二個用來在不知道某個程式具體的名稱的時候很有用。
5、校驗:
rpm {-V|--verify} [select-options] [verify-options]
有沒有懷疑過你的程式檔案被改了,并且植入了後門。那麼來校驗一下吧。用來校驗已安裝的程式有沒有被修改過,程式的所有檔案。
有可能會報的錯誤:
S file Size differs 大小變化
M Mode differs (includes permissions and file type) 權限變化
5 digest (formerly MD5 sum) differs 校驗碼變化,rpm資料庫中記錄了所有程式的校驗嗎。
D Device major/minor number mismatch 裝置主次号變化。
L readLink(2) path mismatch (readlink)路徑變化。
U User ownership differs 屬主變化。
G Group ownership differs 屬組變化。
T mTime differs 修改時間變化
P caPabilities differ CAPABILITY變化。
[root@localhost ~]# rpm -V zsh
[root@localhost ~]#
沒有消息就是最好的消息。
[root@localhost ~]# chmod o-x /usr/bin/zsh
[root@localhost ~]# rpm -V zsh
.M....... /bin/zsh
[root@localhost ~]#
[root@localhost ~]# touch /usr/bin/zsh
[root@localhost ~]# rpm -V zsh
.M.....T. /bin/zsh
[root@localhost ~]#
[root@localhost ~]# rpm -V -a
S.5....T. c /etc/issue
S.5....T. c /etc/yum.repos.d/CentOS-Base.repo
S.5....T. c /etc/sudoers
.......T. c /root/.bash_logout
S.5....T. c /root/.bash_profile
S.5....T. c /root/.bashrc
.....
修改權限的,修改時間的,最下面這個可以看到配置檔案修改也是會報出來,也是程式的組合部分。
6、資料庫重建:
rpm管理器資料庫路徑:/var/lib/rpm/
無論是更新、查詢、删除操作還有yum安裝都是需要rpm的資料庫的。是以資料庫是非常重要的。
擷取幫助:
CentOS 6:man rpm
CentOS 7:man rpmdb
rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY]
--initdb:初始化資料庫,目前無任何資料庫可實始化建立一個新的;目前有時不執行任何操作;
--rebuilddb:重新建構,通過讀取目前系統上所有已經安裝過的程式包進行重新建立;
但我自己在測試中發現,一點用也沒有,雖然出現一堆檔案,但卻沒有任何軟體安裝的資料。不知道是不是我的虛拟機問題。朋友們如果可以重新生成資料庫一定要告訴我一下啊。
加進去一條:指定目錄為根目錄安裝,救援模式常用。
rpm --root=DIRECTORY -ivh
我們知道,rpm包程式安裝的時候,是把各種檔案以絕對路徑複制到各個目錄,而絕對路徑是以根開頭的。而--root參數就是以某個目錄為根進行安裝。
rpm --replacepkgs --root=/mnt/sysp_w_picpath -ivh base*.rpm