天天看點

程式包管理(一)rpm

一、程式設計語言與作業系統:

    應用程式

    ____________________

    |lib call |            |

    |-------------------|

    |system call        |

    |———————————----————|

    |各種硬體            |

    ————————————————————|

    API:application program interface

    ABI:application binary interface 

        Api應用層級相容,未必abi層次也相容,有些程式對二進制的識别格式是不相同的

        UNix-like:ELF格式的程式

        windows:exe,msi

            linux:wine模拟windows庫

            windows:Cywin虛拟出linux運作環境

    系統級開發:C/C++:httpd,vsftpd,nginx

        go程式設計語言:新貴

        C/C++程式設計依賴于系統上的标準庫

    應用級開發:java/Python/perl/ruby/php

        java:hadoop,hbase,(jvm)運作環境

        Python:openstack 雲管理平台,(pvm)

        perl:(perl)perl的解釋器

        ruby:(ruby)解釋器/虛拟機{運作環境} 

        php:(php)

        //一般解釋器或者虛拟機{jvm,pvm} 使用C/C++編寫

        php:世界上最好的語言

c/C++程式格式:    

    源代碼:文本格式的程式代碼

        編譯開發環境:編譯器、頭檔案、開發庫

    二進制格式:文本格式的代碼-->編譯器-->二進制格式(二進制程式、庫檔案、配置檔案)

java/python 

    源代碼:編譯成能夠在其虛拟機(jvm/pvm)上運作的格式

        開發環境:編譯器、開發庫

    二進制:

    項目建構工具://不再需要考慮程式編譯主次關系,由項目建構關系負責,項目建構工具借助于配置檔案實作

        c/c++:make

        java:maven

    程式包管理器:

        源代碼 --> 目标二進制格式 -->組織成為一個或有限幾個“包”檔案;

            安裝、更新、解除安裝、查詢、校驗等操作

        程式包管理器:

            debian:kali,ubuntu //dpt,dpkg , ".deb"

            redhat:rhel,centos,fedora //redhat package manager,rpm , ".rpm" //perl-C現在使用的是C語言寫的

                    //rpm:rpm is package manager;成為标準

            slckware:S.u.S.E:  //rpm,suse的rpm和rhel的是不相容的,suse為rpm開發了一個重要的庫,後期被rhel收納

                     //rpm:".rpm" 指令rpm

            Gentoo: //采用了freebsd的機制,ports的包機制

            Archlinux //輕量級,

    源代碼:name-VERSION.tar.[xz,gz,bz2]

        VERSION:major-minor-release

            major:重大改變

            minor:局部改變

            release:修複bug,小串代碼改變

    rpm包指令格式:

        vsftpd-3.0.2-10.el7.x86_64.rpm

        name-VERSION-release.arch.rpm

        release:是制作rpm包的次數

        VERSION.release是源代碼的release

        arch:architecture:i386,x64(amd64),ppc(powerpc),noarch(通用平台)

            i386:支援較老版本的32bit cpu

            i686:支援較新版本的32bit cpu

        拆包:

            redis-3.0.2.tar.gz--> redis.3.0.2-1.el7.x86_64

            //把一個包的多種功能,拆成多個部分,按需組織rpm包

            //主包和分支包

            主包:name-VERSION-release.arch.rpm

            支包:name-function-VERSION-release.arch.rpm

                function:devel,utils(工具程式),libs,plugins(插件)

    依賴關系:每個程式包的功能都很簡單,包之間存在很複雜的依賴關系

        x,y,z

            x-->y,z

                y-->a,c,b

                c-->Y

        前端工具:自動解決依賴關系

            yum:rpm包管理器的前端工具

            apt-get(apt-cache):deb包

            zypper:suse上的rpm包管理器

            dnf:Fedora 22+ 系統上的rpm包管理器的前端工具

    程式包管理:

        功能:将編譯好的應用程式的各組成檔案打包成一個或幾個程式封包件,進而更友善地實作程式包的安裝、更新、解除安裝和查詢等操作

        1.程式包的組成清單(每個程式包單獨實作)

            檔案清單

            安裝或解除安裝時運作的腳本

        2.資料庫(公共)

            程式包的名稱和版本

            依賴關系

            功能說明

            安裝生成的各檔案路徑及校驗碼資訊

            /var/lib/rpm/ rpm資料庫所在

二、擷取程式包的途徑:

    1.系統發行版的CD光牒或者官方的檔案伺服器

        http://mirrors.aliyun.com

        http://mirrors.sohu.com

        http://mirrors.163.com

    2.項目官方站點

        apache官網:www.apache.org

        zabbix:www.zabbix.com

    3.第三方組織

        (a)EPEL:

            mirrors.aliyun.com/epel/7/x86_64

        (b)搜尋引擎

            pkgs.org

            rpmfind.net

            rpm.pbone.net 

    4.自己動手,豐衣足食

    建議:校驗,檢查其合法性

        來源合法性:

        程式包的完整性:

三、Centos上rpm指令管理程式包

(1)安裝

    安裝,更新,解除安裝,查詢和校驗,資料庫維護

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

    -i :install

        -v  verbose通用選項,顯示過程

        -vv 更詳細

        -h 以hash輸出進度條

        --test 僅僅是檢查一下,測試不安裝

        --nodeps //忽略依賴關系,no dependce

        --replacepkgs //替代安裝

        --noscripts //有些程式包安裝過程中,可能需要運作一段自帶腳本,

        rpm可以自帶腳本:

            四類:

                preinstall:安裝之前,%pre

                postinstall:安裝完成之後,%post

                preuninstall:解除安裝開始前,%preun

                postuninstall :解除安裝完成之後,%postun

            --noscripts

            --nopre

            --nopost

            --nopreun

            --nopostun

        --nosignature //來源合法性,不檢查包簽名資訊

        --nodigest //不檢查包完整幸資訊,頭檔案摘要

    -U :update,-F --freshen//使更新

    -e :--erase

    -q:--query

        -l :list生成檔案

    -V:--verify校驗

    資料庫維護:

        --builddb,--initdb

(2)更新

    -U update

    Uvh /Fvh

    rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... //和安裝一樣

        -U 更新或者安裝,有沒有老版本,都會安裝

        -F 更新,有老版本才會安裝

        --oldpackage :降級安裝老的程式包,不相容

        --force:強制更新

        其他和rpm -ivh 一樣

    注意:

        (1)不要對核心做更新操作,更新核心需要重新開機系統

            //linux支援多核心版本并存,是以,直接安裝新版本核心即可

        (2)如果某源程式包的配置檔案,安裝後曾被修改過,更新時,新版本的程式提供的同一個配置那檔案不會覆寫原有的

            配置檔案,而是把新版本的配置檔案,重命名後(filename.rpmnew)後,提供

(3)解除安裝

    -e 

        --allmatches //假如存在多版本的話,多版本一并删除

        --nodeps  //忽略依賴關系

        --test  //dry run 僅僅測試

        --noscripts //不執行腳本

        rpm -e zsh //pack_name zsh即可,資料庫中有檔案儲存

        rpm -ivh 檔案名 

(4)查詢

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

    -q  zsh //查詢指定包zsh是否安裝

        select-options:

            -a,--all 不加選項,查詢所有已經安裝的包

                rpm -qa |grep zsh

            -f /etc/fstab 查詢檔案的安裝包

            -g,--group 組名//查詢指定包組中包含的包

            -p,--packaeg package_file:實作檢視未安裝包的,結合query-optionss實作

                rpm -qpl zsh-5.0.2-14.el7.x86_64.rpm //查詢未安裝程式包的安裝能夠生成檔案

            --wahtprovice CAPABILITY//查詢提供某種能力的包

                rpm -q --whatprovide 'config(bash)'

            --whatrequires CAPABLITY //查詢指定的CAPABILITY被哪個程式包所依賴

        query-options

            --changelog //查詢rpm包的changelog,不是源碼的

                rpm -q --changelog zsh //檢視zsh的改進日志

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

                rpm -ql zsh

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

                rpm —qi bash

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

                rpm -qc  bash

            -d,--docfile :查詢指定的程式包的幫助文檔

                rpm -qd bash

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

                rpm -q --provides bash //bash提供的

                rpm -q --whatprovides 'config(bash)'

            -R requires//查詢指定程式包的所依賴的程式包

                rpm -qR bash

            --scripts //查詢腳本

                rpm -q --scripts bash

                rpm -qp --scripts zsh-5.0.2-14.el7.x86_64.rpm

        ql,qf,qc,qi,qd    //qf文檔的産生源

(5)校驗

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

    -V //rpm -V zsh //安裝完成後,校驗

<code>       </code><code>S file Size differs</code>

<code>       </code><code>M Mode differs (includes permissions and file type)</code>

<code>       </code><code>5 digest (formerly MD5 sum) differs</code>

<code>       </code><code>D Device major/minor number mismatch</code>

<code>       </code><code>L readLink(2) path mismatch</code>

<code>       </code><code>U User ownership differs</code>

<code>       </code><code>G Group ownership differs</code>

<code>       </code><code>T mTime differs</code>

<code>       </code><code>P caPabilities differ</code>

        rpm -ql zsh //随意修改其中一個檔案

        rpm -V zsh //就能看到效果 

        select-options:和查詢的select-options一樣

            -a,-f,-g,-p

        verify-options:

            --nodeps 不校驗依賴

            --nodigest 不校驗標頭,

            --noscripts 不檢查腳本

            --nofiles 不檢查

            --nosignature 不檢查標頭簽名資訊

        //預設檢查所有屬性

         rpm -V --nofiles zsh

(6)包來源合法性驗證和完整性驗證

    來源合法性驗證:

    數字簽名:非對稱加密:一個公鑰,一個私鑰

        包的制作者,

        1.首先使用單項加密,計算出包的特征碼,定長輸出

        2.然後再用自己的私鑰加密特征碼,這叫數字簽名 ,

        3.把加密後的特征碼附加到包後    

    //隻要拿到公鑰,就能解密

        中間者:能夠解密特征碼,因為能拿到對方公鑰,但是不能再次加密,因為沒有作者的私鑰

    //使用者拿到作者的公鑰,進行解密特征碼,解密成功,則認為來源合法

    //我用同樣的方法,進行單項加密計算特征碼,一樣則證明包内容沒有修改過//完整性

    如何拿到對方的公鑰:

        1.從網上下載下傳,不可靠

        2.網際網路上是使用CA來實作,可靠手段拿到對方公鑰

    rpm --import /mnt/RPM-GPG-KEY-CentOS7 //導入公鑰

        /etc/pki/rpm-gpg/ 導入到此地

        對于CentOS發行版:rpm --import

    rpm -ivh zsh-***** //自動進行校驗操作

    rpm -K zsh-5.03..... //手動驗證

    驗證:

        安裝此組織簽名的程式時,會自動執行驗證

        手動驗證:rpm -K PACKAGE_FILE 

        1

    數字簽名:保證來源合法性和資料完整性

(7)資料庫重建

        rpm管理資料庫路徑:/var/lib/rpm/

            查詢操作:就是基于該資料庫查詢

            Centos6:man rpm //rpm --initdb|--rebuilddb

            Centos7:man rpmdb

        rpmdb 

            --initdb  初始化db,目前無任何資料庫時建立一個新的,目前有,不執行任何操作

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

            --dbpath 指定db路徑

            rpmdb --initdb --dbpath=/tmp/rpm

四、rpm指令小結

linux程式包管理器,rpm包管理器

<code>    </code><code>安裝:rpm -ivh ,--nodeps,--replacepkgs</code>

<code>    </code><code>解除安裝:-e,--nodeps</code>

<code>    </code><code>更新:-U|-F vh </code><code>//F隻用于更新,--nodeps,--oldpackage</code>

<code>    </code><code>查詢:-q,-a,f,i,qd,qc,--script,changelog,provides/whatprovides,requires/whatrequires</code>

<code>    </code><code>校驗:-V,</code>

<code>    </code><code>驗證合法性:--import,-K手動驗證,--nodigest,--nosignature</code>

<code>    </code><code>資料庫重建:rpmdb --initdb --rebuilddb</code>

本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1950170,如需轉載請自行聯系原作者