Linux程序包管理相關

前言

首先說說一個軟件的誕生過程:

程序員用編程語言寫文本格式的源代碼,但是計算機只能讀懂二進制文件,那么就需要將源代碼轉換成二進制格式,這個過程稱為編譯。編譯用的工具稱為編譯器,編譯器有很多種,在Linux上常用gcc這個編譯器。利用編譯器,得到二進制格式的文件(二進制程序(Windows上.exe.msi,Linux.elf)、庫文件、配置文件、幫助文件)。

手動編譯是一個麻煩的事情,所以軟件發行商將程序照平臺編譯好之后,成為二進制的程序包。Windows的程序包就兩個步驟:安裝和卸載。
Linux的程序包根據發行版的不同,格式也不一樣。主要是RedHat系的RPM包和debian系的deb包。主要介紹RPM包,以后再介紹deb包的使用。

Linux不是,Linux的哲學有一點是:Linux由眾多功能單一的程序構成,只做一件事,并做到最好。那么這些功能單一的程序怎么去實現復雜的工作呢?

分工和協作嘛,我不會的事讓別人去做,我會的事我還可以讓其他比我做得更好的人去做。所以在Linux的程序包之間有著復雜的包間依賴關系,A程序需要B程序,B程序又依賴于C程序…

如果要單個單個的去安裝包的話是一件很折磨人的事情,A包裝上了告訴你沒裝B包,我運行不了,沒滿足依賴關系,那就裝B包,B包裝好了說你沒裝C包,C包又裝好了,又缺D包…這可咋整2333。而且包的格式還不一樣。

Linux的程序包根據發行版的不同,格式也不一樣。主要是RedHat系的RPM包和debian系的deb包。主要介紹RPM包,以后再介紹deb包的使用。

下面進入正題:介紹RPM包、rpm命令、前端工具yum

RPM包

紅帽系Linux用rpm命令管理RPM程序包RPM包:

主要實現的是 :安裝、升級、卸載、查詢、校驗和數據庫維護

語法: rpm [OPTION] [PACKAGE_FILE]
    安裝: -i,--install
    升級: -u,--update,-F,--freshen
    卸載: -e,--erase
    查詢: -q,--query
    檢驗: -V,--verify
    數據庫維護: --builddb,--initdb

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

            rpm -ivh PACKAGE_FILE
                -v:
                -vv
            [install-options]:
                -h:顯示進度,hash marks,每個#表示2%
                --test:測試安裝
                --nodeps:不檢測依賴直接安裝
                --replace:重新安裝(不會修改配置文件,如果是想通過重裝恢復默認配置,將那個配置文件刪除后replace)
                --noscript

            注意:rpm可以自帶腳本:
                preinstall:安裝前進行,%pre,--nopre
                postinstall:安裝后運行,%post,--nopost
                preuninstall:卸載前運行,%preun,--unpreun
                postuninstall:卸載完運行,%postun,--nopsdtun

                --nosignature:不檢查包簽名信息,不檢查來源合法性
                --nodigest:不檢驗包完整性信息
    升級:
        rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
            -U:升級或安裝
        rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
            -F:只升級,如果原來沒有,不安裝

            rpm -Uvh PACKAGE_FILE
            rpm -Fvh PACKAGE_FILE

                --oldpackage:降級為較老版本的;回滾
                --force:強制升級;
        注意:
            1.不要對內核進行升級操作;Linux支持多內核版本共存,因此,直接安裝新版本內核
            2.如果某原程序包的配置文件被修改過,升級后同名的配置文件不會被更新,而是把新配置文件重命名提供;一般叫filename.rpmnew(原文件的新版)

    查詢:
        rpm {-q|--query} [select-options] [query-options]

        [select-options]:
            PACKAGE_NAME:查詢指定程序包是否安裝,
            -f, --file:查詢文件是由哪個程序生成的
            -g, --group:
            -a, --all:查詢所有已經安裝過的包

            -p, --package PACKAGE_FILE:用于實現對未安裝的程序包執行查詢操作

            --whatprovides CAPABILITY:查詢指定的CAPABILITY由哪個程序包提供

            --whatrequires CAPABILITY:查詢指定的CAPABILITY被哪個程序包所依賴

            [query-option]
            --changelog:查看版本更迭
            -l, --list:程序安裝生成的文件列表
            -i, --info:程序包相關的信息,版本號、大小
            -c, --configfiles:List only configuration files (implies -l).
            -d, --docfiles:List only configuration files (implies -l).
            --provides:List capabilities this package provides.
            -R, --requires:List capabilities on which this package depends.
            --scripts:List  the  package  specific  scriptlet(s)  that  are used as part of the installation and uninstallation processes.

            用法:
                -qi PACKAGE,-qf FILE,-qc PACKAGE,-ql PACKAGE,-qd PACKAGE
                -qpi PACKAGE_FILE,-qpl PACKAGE_FILE,-qpc PACKAGE_FILE...
        
        包相關信息查詢:-i, --info
            有這些信息:版本、配置文件、文檔文件、安裝生成的文件、包間依賴、包的腳本

    校驗:
        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
        文件大小、權限、校驗碼、主次設備號、屬主、屬組、修改時間、功能

        包來源合法性驗證和完整性驗證:
        來源合法性驗證:
            GPG密鑰
            數字簽名:
                包制作者將包的特征碼非對稱加密,
            1.將源包提取特征碼a
            2.用私鑰加密特征碼a,放在包的后面
            3.用戶用公鑰得到特征碼a,再算得到包的特征碼b,匹配ab特征碼
        獲取并導入信任的包制作者的密鑰:
            對于CentOS發行版來說:
                rpm --imprt /etc/pkl/rpm-gpg/RPM-GPG-KEY-CentOS-7
            通過光盤導入數字簽名: 
                rpm --import /media/cdrom/RPM-GPG-KEY-CentOS-7
        完整性驗證:
            驗證: 
            1.安裝此組織簽名的程序時,會自動執行驗證;
            2.手動驗證:rpm -K PACKAGE_FILE

    數據庫(database)(包的數據庫)重建:
        
        rpm管理器數據庫路徑:/var/lib/rpm/
            查詢操作:通過此處的數據庫進行

        rpm {--initdb|--rebuilddb}
            --initdb:初始化數據庫,當前無任何數據庫時新建,有數據庫時不操作
            --rebuilt:根據已安裝的程序包首部信息(headers)重建數據庫

但是rpm只是解決了包的安裝卸載的問題,有個困擾用戶的巨大問題沒有被解決:包間依賴!在紅帽系列的上采用了yum這個前段工具。

所以我們通常使用yum管理軟件,很好用哦。

yum

yum能干什么呢?yum能根據所要安裝的軟件,分析軟件的依賴關系,并且在軟件倉庫中下載軟件到本地安裝,也就是說,只需要輸入一條yum指令就可以直接裝好軟件并使用了特別方便。下面介紹yum的用法:

yum命令用法:
yum [OPTIONS] [COMMAND] [PACKAGE]

   看看有哪些command可以用:
    * install package1 [package2] [...]
    * update [package1] [package2] [...]
    * update-to [package1] [package2] [...]
    * update-minimal [package1] [package2] [...]
    * check-update
    * upgrade [package1] [package2] [...]
    * upgrade-to [package1] [package2] [...]
    * distribution-synchronization [package1] [package2] [...]
    * remove | erase package1 [package2] [...]
    * autoremove [package1] [...]
    * list [...]
    * info [...]
    * provides | whatprovides feature1 [feature2] [...]
    * clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
    * makecache [fast]
    * groups [...]
    * search string1 [string2] [...]
    * shell [filename]
    * resolvedep dep1 [dep2] [...]
       (maintained for legacy reasons only - use repoquery or yum provides)
    * localinstall rpmfile1 [rpmfile2] [...]
       (maintained for legacy reasons only - use install)
    * localupdate rpmfile1 [rpmfile2] [...]
       (maintained for legacy reasons only - use update)
    * reinstall package1 [package2] [...]
    * downgrade package1 [package2] [...]
    * deplist package1 [package2] [...]
    * repolist [all|enabled|disabled]
    * repoinfo [all|enabled|disabled]
    * repository-packages <enabled-repoid> <install|remove|remove-or-reinstall|remove-or-distribution-synchronization> [package2] [...]
    * version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
    * history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    * load-transaction [txfile]
    * updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all | check-running-kernel]
    * fssnapshot [summary | list | have-space | create | delete]
    * fs [filters | refilter | refilter-cleanup | du]
    * check
    * help [command]
    
    有點多了,常用的選項有這些:
    
    顯示倉庫列表:repolist [all|enable|disable]
    顯示程序包:list
        # yum list [all| glob_exp1] [glob_exp2] [...]
        # yum list {available|installed|updates} [glob_exp1] [...]
    安裝程序包:install
        install package [package2] [...]
        reinstall package1 [package2] [...] (重裝)
    升級程序包:
        update [package1] [package2] [...]
        downgrade package1 [package2] [...] (降級)
    檢查升級:check-update
    卸載程序包:
        remove| erase package1 
    查詢包信息:info
        info [...]
    查看指定特性或文件是由哪個程序包所提供的:
        provides | whatprovides feature1 [feature2] [...]
    清除本地緩存(包):
        clean [ package | metadate | expire-cache | rpmdb | plugins | all ]:我愛用all選項
    構建緩存:
        makecache 
    搜索關鍵字:
        search string1 [string2] [...]
        以指定的關鍵字搜索程序包及summary信息
    依賴關系分析:
        deplist package1 [package2] [...]
    yum歷史事務:
        history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
    安裝及升級本地的包:
        localinstall rpmfile1 [rpmfile2] [...]
        localupdate rpmfile1 [rpmfile2] [...]
    包組管理相關的命令:groups
        groupinstall group1 [group2] [...]
        groupupdate group1 [group2] [...]
        grouplist [hidden] [groupwildcard] [...]
        groupremove [groupr1] [groupr2] [...]
        grouprinfo group1 [group2] [...]

yum倉庫

再來說說倉庫,repository,倉庫又被稱為源,有本地源和網絡源,可以用光盤作為本地源獲取軟件并安裝,這樣不用擔心軟件來源和安全問題。網絡源國內有阿里源(吐槽一下阿里源太慢了),搜狐源,還有清華大學的源。

將光盤作為本地源

首先掛載光盤:

mount -r /dev/cdrom /media/cdrom
# -r只讀掛載,將光盤掛載到/media目錄下的cdrom目錄

修改本地的yum倉庫文件,/etc目錄下的/etc/yum.repos.d/目錄下的以.repo文件。

vi /etc/yum.repos.d/locationcdrom.repo
# 格式如下

[repositoryID]
#自定義一個軟件倉庫的ID
name=
#
baseurl=
enabele=
gpgcheck=

然后用yum repolist查看是否已經建立好的倉庫

#yum repolist還會更新一下本地軟件倉庫列表的緩存

如果想將定義一個網絡源,.repo文件需要將baseurl選項修改為網絡源的URL即可。

那么我平常只會用到幾款軟件并不想讓本地緩存變得特別大,怎么辦?
可以自建yum倉庫。用createrepo一鍵輕松搞定!

eg:我有100個RPM包放在~/software目錄下
    createrepo ~/software
    于是就建立了一個repodate目錄,就可以提供給本地使用了

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/90826

(0)
耗奇害死貓耗奇害死貓
上一篇 2018-01-04
下一篇 2018-01-04

相關推薦

  • ?grub應用之提供單獨bash系統

    grub應用之提供單獨bash系統     1.掛載新硬盤,并創建好三個分區,第一分區為boot分區,第三分區為根分區              2.創建掛載目錄,并掛boot分區   &n…

    Linux干貨 2017-01-13
  • N26 第七周作業

    1、創建一個10G分區,并格式為ext4文件系統;(1) 要求其block大小為2048, 預留空間百分比為2, 卷標為MYDATA, 默認掛載屬性包含acl; [root@localhost ~]# fdisk /dev/sdb Welcome to fdisk (util-linux 2.23.2). Changes will remain in mem…

    Linux干貨 2017-02-07
  • mv命令總結

    mv命令是move的縮寫,可以用來移動文件或者將文件改名,是Linux系統下常用的命令,經常用來備份文件或者目錄。 命令格式:mv  源文件或目錄 目標文件或目錄 2.命令功能:視mv命令中第二個參數類型的不同(是目標文件還是目標目錄),mv命令將文件重命名或將其移至一個新的目錄中。當第二個參數類型是文件時,mv命令完成文件重命名,此時,源文件只能…

    2017-07-24
  • vim編輯器

    回顧:     正則表達式(BRE, ERE)     BRE:字符匹配:., [], [^]     次數匹配:*,\?,\+,\{m\},\{m,n}     位置錨定:^,$,\<,\>     分組及引用:(),\1,\2,…&…

    Linux干貨 2016-12-23
  • Mariadb數據庫備份恢復系列(一):mysqldump邏輯備份工具實戰

    實驗一:利用mysqldump+二進制日志實現備份恢復數據庫 1、查看原始數據 2、mysqldump執行備份 3、模擬在備份后修改數據,模擬利用二進制日志還原的場景 4、還原mysqldump備份的數據 5、導出二進制日志的事件 6、還原二進制日志事件   

    Linux干貨 2016-11-24
  • 第九周作業

    1、寫一個腳本,判斷當前系統上所有用戶的shell是否為可登錄shell(即用戶的shell不是/sbin/nologin);分別這兩類用戶的個數;通過字符串比較來實現; 2、寫一個腳本     (1) 獲取當前主機的主機名,保存于hostname變量中;     (2) 判斷此變量的值是否為loc…

    2017-04-20

評論列表(1條)

  • 馬哥教育
    馬哥教育 2018-01-07 17:59

    博文描述的有點簡單哈~可以深入一點,類似yum中遇到的問題、搭建網絡yum源等~

欧美性久久久久