rpm包管理

庫文件

linux上,庫文件是很是重要的,由於不少的軟件都不是將全部的本身在須要的函數庫本身寫好,而是將一部分本身軟件特有的庫文件本身寫,通用的庫文件所有動態連接到公共庫上去,這樣不只節省空間,同時用起來也是十分的方便。前端

查看二進制程序所依賴的庫文件
  ldd /PATH/TO/BINARY_FILE
java

[root@CT71 ~]#ldd /bin/ls linux-vdso.so.1 =>  (0x00007ffceaa9e000) libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f282277e000) libcap.so.2 => /lib64/libcap.so.2 (0x00007f2822579000) libacl.so.1 => /lib64/libacl.so.1 (0x00007f282236f000) libc.so.6 => /lib64/libc.so.6 (0x00007f2821fae000) libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f2821d4d000) libdl.so.2 => /lib64/libdl.so.2 (0x00007f2821b48000) /lib64/ld-linux-x86-64.so.2 (0x00007f28229b9000) libattr.so.1 => /lib64/libattr.so.1 (0x00007f2821943000) libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f2821727000)

管理及查看本機裝載的庫文件
  ldconfig 加載庫文件
  /sbin/ldconfig -p: 顯示本機已經緩存的全部可用庫文件名及文件路徑映射關係
node

  配置文件: /etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
  緩存文件: /etc/ld.so.cache
linux

[root@CT6 ~]# ldconfig -p | less

1097 libs found in cache `/etc/ld.so.cache'         libz.so.1 (libc6,x86-64) => /lib64/libz.so.1 libx11globalcomm.so.1 (libc6,x86-64) => /usr/lib64/libx11globalcomm.so.1 libxul.so (libc6,x86-64) => /usr/lib64/xulrunner/libxul.so libxtables.so.4 (libc6,x86-64) => /lib64/libxtables.so.4 libxslt.so.1 (libc6,x86-64) => /usr/lib64/libxslt.so.1 libxshmfence.so.1 (libc6,x86-64) => /usr/lib64/libxshmfence.so.1 libxpcom.so (libc6,x86-64) => /usr/lib64/xulrunner/libxpcom.so libxml2.so.2 (libc6,x86-64) => /usr/lib64/libxml2.so.2 ... ...  

 

RPM包命名原則

name-VERSION-release.arch.rpm
數據庫

好比:httpd-2.2.15-15.e16.centos.1.i686.rpmcentos

httpd  軟件包名緩存

2.2.15  軟件版本服務器

15  軟件發佈次數app

e16.centos  適合的linux平臺less

i686  適合的硬件平臺

rpm  rpm擴展包名

常見的arch
  x86: i386, i486, i586, i686
  x86_64: x64, x86_64, amd64
  powerpc: ppc
  跟平臺無關: noarch

rpm包依賴性

  1. 樹形依賴: a->b->c
  2. 環形依賴:a->b->c->a
  3. 模塊依賴:查詢網站:www.rpmfind.net

    通常服務器安裝都是最小化安裝,這樣是爲了下降被攻擊的可能性,因爲服務器的最小化安裝,致使安裝一個軟件須要不少依賴,好比樹形依賴,在安裝依賴a的時候可能須要安裝依賴包g,e,y,j,u等,安裝b依賴時又須要其餘各類依賴,樹形依賴雖然麻煩,能夠依舊能夠解決。環形依賴也不是很難解決,只須要用一條命令a、b、c同時安裝就能解決依賴問題。還有一種依賴時模塊依賴,它依賴的是某個軟件中的程序,咱們能夠經過查詢www.rpmfind.net來安裝依賴。

  RPM包管理包括rpm命令管理yum在線管理rpm命令管理如上所說,遇到各類依賴問題的時候須要咱們本身動手查找依賴包,後手動解決依賴問題,進行後裝。後來人們發現有沒有一種什麼簡單的方法進行安裝軟件,因而就有了yum命令,事先準備一個包含全部rpm包的網站,做爲在線服務器源咱們只要使用在線命令安裝軟件,不管我去依賴那一個包,yum都會自動到服務器上把依賴下載安裝。

 


 包管理器

二進制應用程序的組成部分:
二進制文件、庫文件、配置文件、幫助文件

程序包管理器:
功能:將編譯好的應用程序的各組成文件打包一個或幾個程序包文件,從而方便快捷地實現程序包的安裝、卸載、查詢、升級和校驗等管理操做

包文件組成 (每一個包獨有)
  RPM包內的文件
  RPM的元數據,如名稱,版本,依賴性,描述等
  安裝或卸載時運行的腳本

數據庫(公共): /var/lib/rpm
  程序包名稱及版本
  依賴關係
  功能說明
  包安裝後生成的各文件路徑及校驗碼信息 

程序包管理器
  debian: deb文件, dpkg包管理器
  redhat: rpm文件, rpm包管理器
  rpm: Redhat Package Manager
  RPM Package Manager 

咱們要學習的就是Redhat系列的rpm包管理


 

 程序包的來源

管理程序包的方式:
  使用包管理器: rpm
  使用前端工具: yum, dnf (dnf還未在正式版的紅帽中使用)
獲取程序包的途徑:
  (1) 系統發版的光盤或官方的服務器;
    CentOS鏡像:
         https://www.centos.org/download/
       http://mirrors.aliyun.com
       http://mirrors.sohu.com
       http://mirrors.163.com
  (2) 項目官方站點
  (3) 第三方組織:
    Fedora-EPEL
      Extra Packages for Enterprise Linux
    Rpmforge:RHEL推薦,包很全
    搜索引擎:
      http://pkgs.org
      http://rpmfind.net
      http://rpm.pbone.net
      https://sourceforge.net/
  (4) 本身製做
注意:第三方包建議要檢查其合法性來源合法性,程序包的完整性


 

rpm的安裝更新與卸載

包名:如httpd,操做已經安裝的軟件包時,使用包名,是搜索/var/lib/rpm中的數據庫

包全名:如httpd-2.2.15-15.e16.centos.1.i686.rpm,操做沒有安裝的軟件包時,使用

    包全名,必定要注意路徑。

 

rpm安裝:

rpm -ivh 包全名

  -i(install)  安裝

  -v(verbose)  顯示詳細信息

  -h(hash)  顯示進度

 

    --test: 測試安裝,但不真正執行安裝,即dry run模式
    --nodeps:忽略依賴關係
    --replacepkgs 已安裝過的包重裝。
    --replacefiles 其餘已安裝的RPM包的文件,與即將裝的RPM中的文件衝突時,則覆蓋文件並安裝。
    --nosignature: 不檢查來源合法性
    --nodigest:不檢查包完整性
    --noscripts:不執行程序包腳本
      %pre: 安裝前腳本; --nopre
      %post: 安裝後腳本; --nopost
      %preun: 卸載前腳本; --nopreun
      %postun: 卸載後腳本; --nopostun 

上面就是經過rpm命令安裝的,會產生各類依賴,這是rpm安裝的缺點

@@@@@@@@@@@@@@@@@@@@

rpm更新:

rpm -Uvh 軟件包

rpm -Fvh  軟件包

  -U(upgrade)  升級

  upgrade:安裝有舊版程序包,則「升級」
        若是不存在舊版程序包,則「安裝」
  freshen:安裝有舊版程序包,則「升級」
        若是不存在舊版程序包,則不執行升級操做
  --oldpackage:降級
  --force: 強制安裝

  有時候能夠用更新命令代替安裝命令是沒問題的,這是因爲升級的本質就是將原來的所有或部分軟件包刪除再從新安裝,這對於咱們存在不少重要數據的軟件來講是絕對不容許的,因此升級命令必定要慎用,必定要慎用,除非軟件出現了什麼重大的BUG,不升級不行,這時候將重要數據進行備份,再進行升級。

用強制安裝或降級安裝會保留原來的軟件,咱們之內核爲例,進行降級操做,看看是否會保留兩個內核:

[root@CT6 app]# ll
total 70964
drwxr-xr-x. 2 root root       4096 Jul 18 14:10 2048.dir
drwxr-xr-x. 2 root root       4096 Jul 18 14:27 fk.dir
drwxrwx---. 3 root Java_A     4096 Jul 22 15:50 java
-r--r--r--. 1 root root   33563248 Aug 12 11:35 kernel-2.6.32-696.el6.x86_64.rpm
-rw-r--r--. 1 root root   39071032 Aug 12 11:57 kernel-2.6.32-642.el6.x86_64.rpm
drwx------. 2 root root      16384 Jul 11 15:51 lost+found
  9 #boot=/dev/sda
 10 default=0
 11 timeout=5
 12 splashimage=(hd0,0)/grub/splash.xpm.gz
 13 hiddenmenu
 14 title CentOS 6 (2.6.32-696.el6.x86_64)
 15         root (hd0,0)
 16         kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=6df0d47f-1a62-4419-a49c-e57906aa21    73 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto      KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
 17         initrd /initramfs-2.6.32-696.el6.x86_64.img
~                                                         

進行操做:

-rw-r--r--. 1 root root 33382260 May 12  2016 kernel-2.6.32-642.el6.x86_64.rpm
[root@CT6 app]# rpm -ivh kernel-2.6.32-642.el6.x86_64.rpm --force
Preparing...                ########################################### [100%]
   1:kernel                 ########################################### [100%]

咱們在看/boot/grub/grub.conf(如今雙內核)

  9 #boot=/dev/sda
 10 default=0
 11 timeout=5
 12 splashimage=(hd0,0)/grub/splash.xpm.gz
 13 hiddenmenu
 14 title CentOS (2.6.32-642.el6.x86_64)
 15         root (hd0,0)
 16         kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=UUID=6df0d47f-1a62-4419-a49c-e57906aa21    73 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto      KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
 17         initrd /initramfs-2.6.32-642.el6.x86_64.img
 18 title CentOS 6 (2.6.32-696.el6.x86_64)
 19         root (hd0,0)
 20         kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=6df0d47f-1a62-4419-a49c-e57906aa21    73 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto      KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
 21         initrd /initramfs-2.6.32-696.el6.x86_64.img

注意:
(1) 不要對內核作升級操做; Linux支持多內核版本並存,所以,對直接安裝新版本內核
(2)若是原程序包的配置文件安裝後曾被修改,升級時,新版本的提供的同一個配置文件並不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)後保留

@@@@@@@@@@@@@@@@@@@@

rpm卸載:

rpm -e 包名

  -e(erase)  卸載

  --nodeps  不檢查依賴性 

  通常rpm包的卸載順序是按照安裝順序進行的,安裝時是a->b->c,卸載時也是a->b->c。假如要卸載的rpm包是依賴於其餘包,而沒有其餘軟件包依賴要卸載的件,則卸載應該沒什麼問題,若是有其餘包依賴於要卸載的軟件,則須要考慮依賴,若是你輸入rpm -e httpd命令,系統會提示你有依賴關係,不能卸載。因此要加上--nodeps不檢查依賴強制刪除,這個結果就是隻刪除了httpd,跟他有依賴關係的其它軟件是不會刪除的,可是這些軟件由於系統裏沒有了httpd也會不能運行,這是所謂的沒有刪除乾淨,而yum -y remove httpd這種方式是把與httpd有依賴關係的全部軟件一併刪除。好比PHP,mod_ssl等等。這就乾淨了。


rpm查詢

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

  -q 軟件包名 查詢已安裝過的軟件包名。
  -qa 列出全部的已安裝過的rpm包
    -qa "name*"  
    -qa |grep name
  -qf 查詢一個文件來自於哪個rpm包 (已安裝的rpm)
  -q --changelog 版本更新日誌
  -qc 查詢軟件包的配置文件(不是全部包都有配置文件)
  -qd 查詢軟件包的幫助文檔
  -qi 查詢軟件包的詳細信息
  -ql 查詢軟件包所安裝到系統當中的全部文件路徑
  -q --scripts 查詢軟件包自帶的腳本
  -q --provides 查詢自身的功能(可以提供的依賴)
  -qR 查詢實現自身的功能須要什麼能力(須要的外部依賴)
  -qp[licd] rpm包 查看未安裝的rpm包的各項信息

查詢是否安裝

rpm -q 包名

  -q(query)  查詢

查詢全部已經安裝的rpm包

rpm -qa

  -a(all)  全部

不過咱們經常使用的查詢命令是rpm -qa | grep 包名

查詢軟件的配置文件

rpm -qc

查看軟件的幫助文檔

rpm -qd

查詢軟件的詳細信息

rpm -qip 包名(包全名)

  -i(information)  查詢軟件信息

  -p(package)  查詢未安裝包信息

  查詢軟件包自帶的腳本

  rpm -q --scripts

查詢自身的功能(可以提供的依賴)

  rpm -q --provides

查詢實現自身的功能須要什麼能力(須要的外部依賴)

  rpm -qR

查詢軟件的安裝位置

rpm -qlp  包名(包全名)

  -l(list)  查詢位置

  -p(package)  查詢未安裝的軟件打算安裝的位置

查詢系統文件屬於哪一個rpm包

rpm -qf 系統文件名

  -f(file)  查詢系統文件屬於哪一個軟件包

查詢軟件包的依賴性

rpm -qRp 包名(包全名)

  -R(requires)  查詢軟件包的依賴性

  -p(package)  查詢未安裝包的信息


 

rpm包的校驗

rpm -V 包名

 -V(verify)  校驗指定rpm包中的文件

 若是文件沒有進行修改,不會出現變化,若是文件被修改,則會出現修改信息

S.5. . . . T. c 是有含義的:

S  文件大小是否改變

M  文件類型或文件權限是否改變

5  文件MD5校驗和是否改變,能夠當作文件內容是否改變

D  設備的中,從代碼是否被改變

L  文件路徑是否被改變

U  文件全部者是否改變

G  文件屬組是否被改變

T  文件的修改時間是否被改變

c  配置文件

d  普通文件

g  ghost文件,不該該出現的文件

l  受權文件

r  描述文件

上面的驗證是基於軟件安裝完畢後的驗證,萬一軟件在安裝前就有問題呢?如何驗證一個軟件包有沒有問題呢?方法是有的,咱們的學習平臺是基於centos的,它的軟件包是rpm包,咱們要驗證rpm包是否被人改動過,只須要將祕鑰導入到咱們的系統而後使用rpm -K 來驗證軟件包的完整性:

第一步,導入祕鑰(咱們使用的祕鑰就是光盤鏡像中的)

 

[root@CT6 ~]# rpm --import /mnt/cdrom/RPM-GPG-KEY-CentOS-6

 

第二步,驗證祕鑰是否導入(rpm -qa

[root@CT6 ~]# rpm -qa "gpg-pubkey*"
gpg-pubkey-c105b9de-4e0fd3a3

第三步,驗證軟件包的完整性

[root@CT6 ~]# cp /mnt/cdrom/Packages/httpd-2.2.15-59.el6.centos.x86_64.rpm .
[root@CT6 ~]# ll
total 864
-r--r--r--. 1 root root 854072 Aug 12 16:19 httpd-2.2.15-59.el6.centos.x86_64.rpm
-rw-r--r--. 1 root root  27440 Aug 12 15:17 httpd_change.log
[root@CT6 ~]# rpm -K httpd-2.2.15-59.el6.centos.x86_64.rpm 
httpd-2.2.15-59.el6.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

第四步,修改軟件包,再次驗證

[root@CT6 ~]# echo 123 >> httpd-2.2.15-59.el6.centos.x86_64.rpm 
[root@CT6 ~]# rpm -K httpd-2.2.15-59.el6.centos.x86_64.rpm 
httpd-2.2.15-59.el6.centos.x86_64.rpm: rsa sha1 (MD5) PGP MD5 NOT OK

rpm包中文件提取

rpm2cpio 包全名 | cpio -idv .文件絕對路徑 

  rpm2cpio:將rpm包轉換成cpio格式的命令

  cpio:一個標準的工具,用於建立軟件檔案文件和從文檔文件中提取文件

  cpio 選項 < [文件|設備]

    -i  copy-in模式,還原

    -d  還原時自動新建目錄

    -v  顯示還原過程

接下來有個示例:

  1. 查詢ls屬於哪一個軟件包
  2. 形成ls誤刪的假象
  3. 提取rpm包中的ls命令到當前目錄的/bin/ls下
  4. 把ls命令複製到/bin/目錄下,修復文件

 rpm數據庫

  咱們在安裝完軟件包以後,信息都會被保存在一個數據庫下面,只要咱們不是吧軟件直接卸載掉,咱們均可以直接使用到rpm的查詢命令查詢到咱們須要的信息。

數據庫重建:
  /var/lib/rpm

rpm {--initdb|--rebuilddb}
  initdb: 初始化
  若是事先不存在數據庫,則新建之
  不然,不執行任何操做
  rebuilddb:重建已安裝的包頭的數據庫索引目錄
最好不要去動咱們的數據庫

相關文章
相關標籤/搜索