linux軟件包管理

linux軟件包管理

簡介

    在Linux系統中,軟件包的安裝和管理是很重要的知識,而linux/unix一個麻煩的地方就是軟件安裝程序比較麻煩和復雜,尤其是當所安裝的軟件包要處理較多的包依賴關系,這就更讓人頭疼了,最常見linux軟件安裝方式有三種:

    本文主要介紹Linux中RedHat或CentOS發行版的軟件包管理。

一、軟件包的表現形式:

(1)、軟件的源代碼,需要自己動手編譯它。這種軟件安裝包通常是用gzip壓縮過的tar包(后綴為.tar.gz)。
源碼安裝的好處是不會受到平臺的限制,而且能夠根據自己的系統和平臺自己優化一些選項,所以這個是比較推薦的一種安裝方式,缺點是對于軟件的依賴關系只能靠自己的經驗來解決了。
(2)軟件的可執行程序,也是二進制軟件包。
其實可以細分為rpm包與yum包安裝。RPM為最常見的兩類軟件包管理工具,他們的安裝的時候不要需要網絡,只要下載下來在系統上安裝即可。rpm包的使用容易受平臺和系統的限制,所以要根據自己的linux的分支版本以及cpu平臺等來決定下載和使用何種軟件包。而且需要自己處理軟件的依賴關系。
   redhat系列軟件安裝包通常被是一個RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后綴是.rpm。
   二進制更方便的一種安裝形式就是yum。這種方式的安裝軟件的時候需要聯網,好處是能自動處理軟件間的依賴關系,比較推薦。
   Yum(全稱為 Yellow dog Updater, Modified)是一個在Fedora和RedHat以及CentOS中的Shell前端軟件包管理器?;赗PM包管理,能夠從指定的服務器自動下載RPM包并且安裝,可以自動處理依賴性關系,并且一次安裝所有依賴的軟件包,無須繁瑣地一次次下載、安裝. [百度百科]
(3)腳本安裝,其實就是安裝命令的堆積,當然也要對系統比較了解才能寫出好的腳本,既可以包含yum這類,也可以使用rpm這類命令。如lnmp一鍵安裝腳本。

二、軟件軟件安裝:

      第一部分:搞定rpm

      RPM是Red Hat公司隨Redhat Linux推出了一個軟件包管理器,通過它能夠更加輕松容易地實現軟件的安裝、卸載、升級、查詢、校驗、數據庫維護。

   1.安裝軟件:
      命令:rpm {-i|–install} [install-options] PACKAGE_FILE …
      選項:-v: verbose表示顯示附加信息 [可選]
            -h: 以#顯示程序包管理執行進度;每個#表示2%的進度 [可選]
            -i:install 不能省略,表示安裝
      [install-options]
         –-test: 測試安裝,但不真正執行安裝過程;dry run模式;
         –-nodeps:忽略依賴關系;(這樣比較麻煩,而且通常無法使用)
         –-replacepkgs: 重新安裝;
         –-nosignature: 不檢查來源合法性;
         –-nodigest:不檢查包完整性;
         –-noscipts:不執行程序包腳本片斷;
            %pre: 安裝前腳本; –nopre
            %post: 安裝后腳本; –nopost
            %preun: 卸載前腳本; –nopreun
            %postun: 卸載后腳本;  –nopostun

   2.軟件包升級:
      命令:rpm {-U|–upgrade} [install-options] PACKAGE_FILE …

       或  rpm {-F|–freshen} [install-options] PACKAGE_FILE …
            -U:安裝有舊版程序包,則“升級”;如果不存在舊版程序包,則“安裝”;
            -F:安裝有舊版程序包,則“升級”;如果不存在,則不執行升級操作;
                –-oldpackage:降級;
                –-force: 強行升級;

   3.卸載rpm包:
      命令:rpm {-e|–-erase} [–-nodeps] [–-noscripts] [–-notriggers] [–-test] PACKAGE_NAME …
      選項:-e: earse表示從系統中刪除軟件,軟件包必須是已安裝的軟件包名稱,不是軟件包的文件名

   4.安裝軟件:
      命令:rpm {-q|–query} [select-options] [query-options]

      [select-options]
         –a: 所有包;
         –f: 查看指定文件是由哪個包安裝生成;
         –p:不檢查包完整性;
         –whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供;

         –whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個包所提供;

      [query-options]
         –c: 查詢程序包的配置文件;
         –d: 查詢程序包的幫助文檔;
         –i:程序包的詳細信息;

          –l:指定程序安裝完成后生成的所有文件;

          -R:查詢指定的程序包所依賴的CAPABILITY;

         –provides:列出指定程序包所提供的CAPABILITY;

    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

        D Device major/minor number mismatch

        L readLink(2) path mismatch

        U User ownership differs

        G Group ownership differs

        T mTime differs

        P caPabilities differ

      包來源合法性驗正及完整性驗正:

          完整性驗正:SHA256

         來源合法性驗正:RSA

     導入所需要公鑰:

      命令:rpm –import /PATH/FROM/GPG-PUBKEY-FILE

       CentOS 7發行版光盤提供的密鑰文件:RPM-GPG-KEY-CentOS-7

軟件依賴關系: 

   由于開源的多態性,Linux 操作系統中的軟件之間的依賴性關系處理一直令人感到頭疼。如果 package_a 依賴于 package_b,那么在一個沒有安裝 package_b 的系統中,package_a 是不被系統推薦安裝的,強制安裝很可能會導致軟件無法正常工作。基于以上 package_a 和 package_b 的關系,在一個干凈的系統中 ( 未安裝 package_a 或 package_b),欲安裝 package_a,錯誤通常會表現為:

 [root@vm227 Packages]# rpm -ivh php-5.3.3-26.el6.x86_64.rpm 

 error: Failed dependencies: 

        httpd is needed by php-5.3.3-26.el6.x86_64 

        httpd is needed by php-5.3.3-26.el6.x86_64

        php-cli(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64  

        php-common(x86-64) = 5.3.3-26.el6 is needed by php-5.3.3-26.el6.x86_64 

嵌套的依賴關系:

  如上示例為最理想的依賴關系,實際應用中往往最令人頭疼的是 package_a 依賴于 package_b/c/d/e/f 等多個包 , 而 package_b/c/d/e/f 等包又依賴于 package_b1,b2,b3/c1,c2/d1,d2/e1,e2/f1,f2 等等 … … 為保證軟件的正常使用,必須找到所有依賴包以及子依賴包并且安裝。過多的依賴關系大大降低了 Linux 軟件安裝的用戶友好性。所以針對此類問題,使用了更高級的包管理策略去解決 – Yum 。

      第二部分:搞定YUM

      YUM:RPM包的前端管理工具,解決包依賴性,可以在多個庫中定位軟件包。

   1.YUM命令的使用:
      命令:rpm {-i|–install} [install-options] PACKAGE_FILE …
      顯示倉庫列表:repolist [all|enabled|disabled]
            list:
            # yum list [all | glob_exp1] [glob_exp2] […]
               # yum list {available|installed|updates} [glob_exp1] […]
      安裝程序包:
               # yum install package1 [package2] […]
      重新安裝:
               # yum reinstall package1 [package2] […]  
         升級程序包:
               # yum update [package1] [package2] […]
         降級程序包:
               # yum downgrade package1 [package2] […]
         檢查可用升級:
               # yum check-update
         卸載程序包:
               # yum remove | erase package1 [package2] […]
         查看程序包information:
               # yum info […]
         
查看指定的特性(可以是某文件)是由哪個程序包所提供:
               # yum provides | whatprovides feature1 [feature2] […]
         清理本地緩存:
               # yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
         構建緩存:

               # yum makecache

      搜索:以指定的關鍵字搜索程序包名及summary信息;

               # yum search string1 [string2] […]
          查看指定包所依賴的capabilities:
               # yum deplist package1 [package2] […]
          查看yum事務歷史:
                 # yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
            包組管理的相關命令:
                   * groupinstall group1 [group2] […]
                   * groupupdate group1 [group2] […]
                   * grouplist [hidden] [groupwildcard] […]
                   * groupremove group1 [group2] […]
                   * groupinfo group1 […]

   2、配置額外YUM庫(客戶端):

        方法一:在/etc/yum.repos.d目錄下新建.repo結尾的文件或者修改原有的repo文件,更方便的是直接下載第三方的yum源的配置文件,如網易163的源文件。

       方法二:用光盤搭建本地yum源,但是你會發現很多光盤包含的軟件包都比較舊。        

    yum客戶端:

            配置文件:

                /etc/yum.conf:為所有倉庫提供公共配置

                /etc/yum.repos.d/*.repo:為倉庫的指向提供配置

            倉庫指向的定義:

                [repositoryID]

                name=Some name for this repository

                baseurl=url://path/to/repository/

                enabled={1|0}

                gpgcheck={1|0}

                gpgkey=URL

                enablegroups={1|0}

                failovermethod={roundrobin|priority}

                默認為:roundrobin,意為隨機挑選;

                cost=1000(默認

第三部分:搞定linux源碼安裝

   程序包編譯安裝:
    源代碼 –> 預處理 –> 編譯(gcc) –> 匯編 –> 鏈接 –> 執行
    源代碼組織格式:
    多文件:文件中的代碼之間,很可能存在跨文件依賴關系;
        C、C++: make (configure –> Makefile.in –> makefile)
        java: maven
    C代碼編譯安裝三步驟:
        ./configure:
            (1) 通過選項傳遞參數,指定啟用特性、安裝路徑等;執行時會參考用戶的指定以及Makefile.in文件生成makefile;
            (2) 檢查依賴到的外部環境;
        make:
            根據makefile文件,構建應用程序;
        make install

    開發工具:
        autoconf: 生成configure腳本
        automake:生成Makefile.in

    建議:安裝前查看INSTALL,README
    第一步:configure腳本
    選項:指定安裝位置、指定啟用的特性

    –help: 獲取其支持使用的選項
    選項分類:
    安裝路徑設定:
    –prefix=/PATH/TO/SOMEWHERE: 指定默認安裝位置;默認為/usr/local/
    –sysconfdir=/PATH/TO/SOMEWHERE:配置文件安裝位置;

    System types:

    Optional Features: 可選特性
    –disable-FEATURE
    –enable-FEATURE[=ARG]

    Optional Packages: 可選包
    –with-PACKAGE[=ARG]
    –without-PACKAGE

    第二步:make

    第三步:make install

    安裝后的配置:
    (1) 導出二進制程序目錄至PATH環境變量中;
    編輯文件/etc/profile.d/NAME.sh
    export PATH=/PATH/TO/BIN:$PATH

    (2) 導出庫文件路徑
    編輯/etc/ld.so.conf.d/NAME.conf
    添加新的庫文件所在目錄至此文件中;

    讓系統重新生成緩存:
    ldconfig [-v]

    (3) 導出頭文件
    基于鏈接的方式實現:
    ln -sv

    (4) 導出幫助手冊
    編輯/etc/man.config文件
    添加一個MANPATH

   如果遇到錯誤提示,也別急,通常是十分簡單的問題:
      1)沒有安裝C或C++編譯器;
      確診方法:執行命令gcc(C++則為g++),提示找不到這個命令。
      解決方法:將Linux安裝光盤mount上來,然后進入RPMS目錄,執行命令:
      #rpm -ivh gcc* (哈哈,我們用到了第二種安裝方式)
   2)沒有安裝make工具;
      確診方法:執行命令make,提示找不到這個命令。
      解決方法:將Linux安裝光盤mount上來,然后進入RPMS目錄,執行命令:
      #rpm -ivh make*
   3)沒有安裝autoconf工具;
      確診方法:執行命令make,提示找不到這個命令。
      解決方法:將Linux安裝光盤mount上來,然后進入RPMS目錄,執行命令:
      #rpm -ivh autoconf*
   4)缺少某些鏈接庫;
      確診方法:在make時,提示需要某些文件。
      解決方法:安裝包含這個文件的包,這就需要積累了。
   5)軟件依賴;
      這時候只有安裝軟件的依賴關系,按照先后順序安裝軟件。

  第四部分:搞定bin文件安裝

  1.以bin結尾的安裝包,這種包類似于RPM包,安裝也比較簡單
  2.給文件加上可執行屬性:chmod +x ******.bin
  3.執行命令:./******.bin
  4.ok:

總結

本文linux下,程序包的幾種形式以及安裝方法水平有限, 如果有錯誤及時指出;
作者:chrony 
感謝: MageEdu

原創文章,作者:chrony,如若轉載,請注明出處:http://www.www58058.com/15839

(0)
chronychrony
上一篇 2016-05-05 10:07
下一篇 2016-05-05 13:53

相關推薦

  • corosync + pacemaker搭建高可用mysql

    一、實驗圖     二、環境準備  1)確保時間同步 [root@SQL1 ~]# crontab -e  */5 * * * * /usr/sbin/ntpdate 172.16.2.15 [root@SQL2 ~]#…

    Linux干貨 2015-06-30
  • 優云Automation:實現IT服務彈性伸縮的利器

    隨著互聯網業務快速持續增長,IT資源使用量按需變化成為常態,這就要求信息部門能快速響應資源使用的變化要求,對運維提出不小挑戰。比如電商、在線教育等企業經常推出一些秒殺、搶紅包活動,在特定時間段對資源的利用處于高峰期,之后基本處于空閑。 幾年前,我們從申請采購到應用部署上線都只能人工操作,需要提前幾個月開始規劃。如今通過云平臺能很好實現資源按需動態管理,運維人…

    系統運維 2017-03-15
  • ?學會用各種姿勢備份MySQL數據庫

                學會用各種姿勢備份MySQL數據庫 前言 為什么需要備份數據? 數據的備份類型 MySQL備份數據的方式 備份需要考慮的問題 設計合適的備份策略 實戰演練 使用cp進行備份 使用mysqldump+復制BINARY …

    Linux干貨 2016-04-27
  • 程序員小抄大全

    你是否會經常忘記一些CSS中的函數名或是一些屬性名,那個時候,你一定覺得,如果手邊有一個“小抄”(Cheat Sheet)就好了。當然,這個“小抄”不是給你作弊用的,這個“小紙條”就是可以讓你馬上知道那個你最想知道的東西。這個“小抄”上也不需要有所有的東西,就需要那些經常用的就行了?,F在,網上有很多這樣的“小抄”,它們可能是PDF格式的,可能是PNG格式的,…

    Linux干貨 2015-04-03
  • 用戶和組及批量創建

    用戶和組       操作系統都有用戶和組,windows,linux等等,用戶和組用來做什么呢?       用戶,是我們進入系統時的憑證,不是每一個人想進就進的。你想吧,如果操作系統沒有用戶就能登錄進系統,那這就帶來了許許多多的安全隱患了。而組則是為了方便管理用戶的一個組容器。 &nb…

    系統運維 2016-08-04
  • Centos圖形界面和命令界面模式切換

    大家都知道,centos有兩種用戶界面模式,一種是圖形界面,也就是我們常說的Xwindows界面;另一種就是命令界面。有時因為方便需要在圖形模式下安裝一些程序,因圖形界面占用的內存等資源較大,影響系統的運行,安裝完后需要把系統切換到命令模式下運行,下面就兩種模式如何進行切換做一下說明。 CentOS的啟動模式共分為7級,分別是: 0-  停機 1-…

    系統運維 2015-07-19
欧美性久久久久