程序包管理之----rpm

程序是什麼?指令+數據也好,算法+數據結構也罷。它的存在形式有兩種:

    1.源代碼:包含了整個應用程序的編程語言的所有代碼的文本文件

    2.二進制:將源代碼經過一系列轉換之後得到的直接執行的文件

其中,使用源代碼安裝的過程如下:

  預處理(用到預處理器) --> 編譯(編譯器) --> 字節碼Bitcode 進行彙編(彙編器) --> systemcall直接運行;libcall需要鏈接(鏈接器);最終得到可執行的二進制程序文件

  彙編時,不一樣的硬件往往不能兼容互通。因此誕生了一個國際化標準:

  POSIX:Portable Operating System  可移植操作系統。至於IX是向unix致敬一下下

  最終二進制文件到底能不能執行,取決於計算機的ABI接口。在不同OS上有着明顯的差異,類unix系統上,ABI往往是ELF格式,如果是Windows系列 ;一般是exe或者msi格式.

我們再來回顧一下編程語言的分類

應用級編程語言:

    Java(做應用程序很強,做系統菜雞)

      hadoop2-大數據處理平臺,hbase-數據庫,ELK-日誌查詢和分析檢索系統

      這些軟件運行環境需要專有的一個環境叫:JVM

    Python(離底層硬件距離太遠,剛開始太消耗系統資源。現在來說,消耗已經可以忽略了 )

      Openstack--雲棧,saltstack--自動化運維管理工具 運行環境:PVM

    perl、ruby(日本流行,開發很多曾經的經典遊戲。)

    PHP、go

    而JVM PVM 和其他應用級語言所需要的解釋器,都是由C語言開發的;

系統級編程語言:

    C/C++

      Linux、Unix的內核編程語言

      編譯開發環境:預處理器、編譯器、頭文件、開發庫文件(能夠讓編譯庫運行的庫)

    (而像Java或者Python等應用級語言的開發環境:預處理器、編譯器、開發庫文件;)

通常情況下,源代碼文件有多個,這些文件之間存在着一定的關聯關係;我們稱之爲依賴關係;


軟件項目構建工具:

  C/C++:make

  Java:maven

  Python:buildout

儘管有了這些構建工具,編譯源代碼還是十分困難,因此有一些人把常用的代碼打包封裝成程序包,發佈開源社區,方便使用


程序包的管理器:


不同的linux發行版本,有着不同的程序包管理器

  Debian:dpt-Debian Package Toolkits。所有軟件包封裝成.deb後綴名的包文件,命令行工具 dpkg

  Redhat:rpm-Redhat Package Manager ,rpm工具,.rpm後綴名

    rpm稱爲linux的程序包管理器的行業標準

    開始使用的是perl語言編寫,後來用C語言重寫了rpm,公佈後改名爲rpm is package manager。

  Slackware(S.u.S.e):用的是rpm,但是對rpm進行了修改,以至於得到Redhat認可


  Gentoo:從內核開始,可以供用戶任意選擇挑選軟件;

          採用的包管理器 : FreeBSD 的 portage的程序包管理機制,emerge工具

  Archlinux:pacman


以CentOS爲例,介紹下rpm程序包管理器的相關內容:

 1.程序包的命名規則:

  源代碼包:software_name-VERSION.tar.gz

    VERSION:major.minor.release

      major:主版本號,通常代表重大功能改進的版本分支;

      minor:次版本號,代表在某個版本的分支中的某個功能發生變化;

      release:發行版本號,修復了某些BUG或者對某段代碼進行了優化;

  rpm程序包:  

    源代碼包:software_name-VERSION.src.rpm

    二進制文件包:

      software_name-VERSION-[release].[os].arch.rpm

        VERSION:major.minor.release

        [release]:rpm包的發行版本號

        [os]:軟件所支持的操作系統版本信息,el6、el7、suse11、fedora22...

        arch:硬件架構類型:i386 i686 x64(amd64) ppc sparc noarch...

        例如 gcc-4.8.5-4.el7.x86_64.rpm

在製作rpm程序包的時候,通常其製作者會採用分包技術來構建rpm程序包:根據程序的不同功能,構建多個程序包;被分包的一般分爲兩類

    1.主程序包:

      software_name-VERSION-[release].[os].arch.rpm

    2.附屬功能包:

      software_name-function-VERSION-[release].[os].arch.rpm

    一般來講,主程序包和附屬功能包具有相同版本號 發行版本號 操作系統要求和硬件架構類型

    所以 主程序包往往被所有的附屬程序包所依賴;依賴關係:A --> B -->C D --> A 構成一個依賴黑洞 因此rpm存在着諸多'不與人爲善'的弊端


獲取程序包的途徑:

  1.系統發行版的光盤,或鏡像

  2.官方的文件服務器或者鏡像站點:

    http://mirrors.aliyun.com

    http://mirrors.sohu.com

    http://mirrors.163.com

    http://mirrors.tuna.tsinghua.edu.cn

    http://mirrors.hust.edu.cn

    ...

  3.某項目的官方站點 例如apache

  4.第三方組織製作的rpm程序包站點

    Fedora EPEL:紅帽官方的社區組織,在鏡像站點中也包含EPEL鏡像

    搜索引擎:

      http://pkgs.org  基本可以搜索到所有

      http://rpmfind.net 法國的一個站點

      http://rpm.pbone.net

  5.自己製作 咯

  建議:在獲得程序包之後實施校驗,完整性檢查:

    1.來源合法性

      通過程序提供者的數字簽名加密的數據,我們可以通過其公鑰進行解密驗證;

    2.程序包完整性

      sha-1校驗碼

rpm命令行工具:

  安裝 卸載 升級(降級) 查詢 文件校驗

  【通用選項】:

    -v --verbose:顯示安裝歷程詳情,僅僅顯示安裝軟件名

    -vv  顯示非常詳細的操作信息

  安裝:

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

    [install-options]

     -h --hash      用50個“#”來表示安裝進度

     --test:      並不是真正的安軟件包,僅僅是測試是否在安裝時能夠正常完成,dry run

     --nodeps :    忽略因爲依賴關係導致的安裝錯誤,不建議使用

     --replacefiles  安裝軟件包時,軟件包中的文件會直接將原來安裝的文件替換

     --replacepkgs   不卸載軟件包 而是重新裝一遍

     --noscripts    不運行任何腳本

     --nopre

     --nopost

     --nosignature   不考慮軟件包的來源是否合法

     --nodigest     不考慮軟件包是否完整

  升級:

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

      可以升級也可以全新安裝

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

      僅僅是對已經安裝的低版本的程序包進行升級安裝

      常用選項與安裝相同

      特殊的選項:

        --oldpackage   降級安裝

        --force      強制升級

  注意:

    1.強烈建議:不要對內核進行升級操作;linux支持多內核

    2.升級後帶來文件的變化,系統默認不會直接更改之前的配置文件,新程序包的配置文件會被重命名,通常是:FILENAME.rpmnew

  卸載:

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

     --allmatches:卸載所有匹配指定名稱的程序包的各個版本

     --nodeps:忽略依賴關係

     --test:測試卸載

     --nopreun 

     --nopostun

  查詢:

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

      [select-options]

        -a,--all:查詢所有已安裝的程序包名

 

        -f,--file FILE 查找指定的文件是由哪個程序包提供的

        -p,--package PACKAGE_FILE : 對還沒安裝的程序包文件中執行查詢操作

        --whatprovided CAPABILITY 查詢指定的 CAPABILITY是由哪個程序包提供的

        --whatrequires CAPABILITY

      [query-options]

        -c,--configfiles:  查看相關配置文件

        -i,--info          查詢程序包相關信息,包括版本號,發行號,等等

        -l,--list          列表顯示安裝程序包會生成哪些文件

        --providers:       列出指定程序包提供的所有的 CAPABILITY;

        -R,--requires      查詢指定的程序包的依賴關係

        --scripts:        查詢程序包的腳本

  校驗:

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

    [select-options] 與查詢的[select-options]相同

  認證:

   --import PUBKEY ...導入相應的/PATH/TO/KEY_FILE

   {-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE ...

    手動測試 驗證軟件包的合法性

  數據庫管理:

    數據庫的初始化和重建:/var/lib/rpm

      rpm {--initdb|--rebuilddb}

        [--dbpath DIRECTORY]


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章