8.19_Linux軟件包管理之rpm和yum的使用

rpm命令的使用

什麼是RPM?

rpm:RPM Package Manager (原Redhat Package Manager) Linux 軟件包管理工具

特定的程序由應用程序組成;

    GPL:源碼

    glibs:標準的C庫


常見Linux發行版的軟件包管理器:

     Debian:.deb dpkg

     RadHat: .rpm(perl編寫),rpm(RadHat Package Manager)

              rpm:RPM is Package Manager

     SUSE  :  rpm


軟件運行環境

API:Application Programming Interface 意味開發庫兼容,因此,源代碼可跨平臺

    遵循POSIX規範:Portable Openratin System  可跨平臺調用

    程序的過程:預編譯、編譯、彙編、鏈接

        編譯:源代碼翻譯成cpu指令集的過程

        靜態鏈接:將庫包含在程序中

        動態鏈接:so(shared object)(相當於windows系統的.dll文件)

            庫爲函數,function

            庫:可執行程序,本身不能作爲程序執行入口,但可以被調用是編譯好的二進制格式


ABI:Application Binary Interface 編譯後的程序可以跨平臺


注意:1.os平臺:編譯好的應用程序必須爲特定平臺所支持的版本(linux和windows平臺不兼容)

      2.硬件平臺:應用程序爲特定的cpu所支持


包的組成部分

     二進制程序:/bin,/sbin /usr/sbin,/usr/local.bin,/usr/local/sbin

     自身庫文件:/lib /lib64 /usr/lib /usr/lib64 /usr/local/lib  /usr/local/lib64

                 開發時調用API,運行時調用ABI

                 通過調整  /etc/ld.so.conf   /etc/ld.so.conf.d/*.conf

      配置文件: /etc,無須額外配置

      幫助文件: man文件,info文件,README,INSTALL,ChangeLog

                 man COMMAND

                 到某路徑下查找與命令名同名的通常以。gz結尾的壓縮文件的名字

                 /usr/share/man


包命名格式:

源代碼:

        name-VERSION.tar.gz|bz2|xz

             VERSION:major.minor.release

rpm包命名方式:

         name-VERSION-release.arch.rpm

   例如:bash-4.2.46-19.el7.x86_64.rpm

VERSION: major.minor.release

release:release.OS,通常包含rpm的只做發行號,還包含使用的OS

   例如:el6:redhat enterprise linux6

常見的arch:

x86: i386, i486, i586, i686

x86_64: x64, x86_64, amd64

ppc:powerpc

noarch:跟平臺無關


包分類:

Application-VERSION-ARCH.rpm:       主包

Application-devel-VERSION-ARCH.rpm  開發子包

Application-utils-VERSION-ARHC.rpm  其它子包

Application-libs-VERSION-ARHC.rpm   其它子包


軟件包之間可能存在依賴關係,甚至循環依賴

解決依賴包管理工具:

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

    apt-get:deb包管理器前端工具

    zypper: suse上的rpm前端管理工具

    dnf: Fedora 18+ rpm包管理器前端管理工具


庫文件

查看二進制程序所依賴的庫文件:

    ldd [options] 二進制文件

    ldd /PATH/TO/BINARY_FILE

wKioL1e69a-gMUuoAAAe9fZW7aU822.png

管理及查看本機裝載的庫文件:

    ldconfig

    /sbin/ldconfig -p: 顯示本機已經緩存的所有可用庫文件名及文件路徑映射關係

配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf

緩存文件:/etc/ld.so.cache

wKiom1e6ZufyNdzKAAAuFE1P0f0488.png


包管理器

程序包管理器:

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

1、包文件組成(每個包獨有)

    RPM包內的文件清單

    RPM的元數據,如名稱,版本,依賴關係,功能性描述等

    安裝或卸載時運行的腳本

2、數據庫(公共)

    程序包名稱及版本

    依賴關係

    功能說明

    包安裝後生成的各文件路徑及校驗碼信息


程序包的來源

管理程序包的方式:

    使用包管理器:rpm

    使用前端工具:yum, dnf(這個可能是未來版本)


獲取程序包的途徑:

(1) 系統發版的光盤或官方的服務器;

CentOS鏡像:

    https://www.centos.org/download/

    http://mirrors.aliyun.com

    http://mirrors.sohu.com

    http://mirrors.163.com

(2) 項目官方站點

(3) 第三方組織:

    EPEL:Extra Packages for Enterprise Linux

(4) 自己製作

注意:檢查其合法性:來源合法性,程序包的完整性


rpm包管理

CentOS系統上使用rpm命令管理程序包基本功能:

安裝、卸載、升級、查詢、校驗、數據庫維護


安裝

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

    -i --install:安裝

    -v:顯示安裝信息

    -vv:二級詳細

    -vvv:三級詳細

    -h:hash 以#的個數顯示安裝進度,一個#表示2%的進度


安裝選項[install-options]

    --test: 測試安裝,但不真正執行安裝;dry run模式

    --nodeps:忽略依賴關係

    --replacepkgs| replacefiles 重新安裝 

       原來的配置文件不會被覆蓋,新安裝的配置文件將會重命名爲以.rpmnew爲後綴的文件

    --nosignature: 不檢查來源合法性

    --nodigest:不檢查包完整性

    --noscipts:不執行程序包腳本片斷

        %pre: 安裝前腳本;--nopre

        %post: 安裝後腳本;--nopost

        %preun: 卸載前腳本;--nopreun

        %postun: 卸載後腳本;--nopostun


示例:rpm -ivh PACKAGE_FILE ...

wKioL1e63B_wusxrAAAhTXmNyHU871.png


升級:

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

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

    upgrade:安裝有舊版程序包,則“升級”

             如果不存在舊版程序包,則“安裝”

    freshen:安裝有舊版程序包,則“升級”

             如果不存在舊版程序包,則不執行升級操作

    --oldpackage:降級

    --force: 強行升級

例如:rpm -Uvh PACKAGE_FILE ...

例如:rpm -Fvh PACKAGE_FILE ...

升級注意項

(1) 不要對內核做升級操作;Linux支持多內核版本並存,因此,對直接安裝新版本內核

(2) 如果原程序包的配置文件安裝後曾被修改,升級時,新版本的提供的同一個配置文件並不會直接覆蓋老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)後保留


示例:用centos6.8的內核升級到centos7.2的內核,但是失敗了,原因是沒有安裝相關的依賴文件

如果一定要升級,就需要安裝相關依賴的文件

wKioL1e64FCAMl2fAACisHYmiac555.png

添加 --nodeps忽略依賴包的選項強行升級測試

wKioL1e64WfTpoTiAAC02kwb8eE166.png

升級完內核以後,發現內核掛了,請小夥伴謹慎操作

wKioL1e64eag3PkUAAAE0HtGiyU659.png


查詢:

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

[select-options]

    -q: 查詢某單個包是否安裝

        wKiom1e65y7j7pvTAAAI5eps-Gw962.png

    -qa: 查詢所有已安裝的包

    -qf: 查看指定的文件由哪個程序包安裝生成

        wKioL1e659jAFryDAAAMkQBWD7Y222.png

    -p:查詢尚未安裝的rpm包文件的相關信息

        -qpl rpm_file:針對尚未安裝的程序包文件做查詢操作;

        -qpi rpm_file: 查詢其簡單描述信息wKiom1e66HXC2lrWAAC1dk29hxw000.png

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

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

wKiom1e66Yejr1CSAAAk_5qq_Rk781.png

  rpm2cpio 包文件|cpio–itv :預覽包內文件

  rpm2cpio 包文件|cpio–id “*.conf” :釋放包內文件

查詢選項(配合-q)[query-options]

    -qc: 查詢安裝後生成的配置文件

    -qd: 查詢包安裝後生成的幫助文檔

    wKiom1e66fSD-jEnAAAYWSmc3uM100.png

    -qi: 查詢包的描述信息

wKiom1e66kuBQcx9AACmjaBHNRY043.png    -ql: 查看指定的程序包安裝後生成的所有文件;

wKioL1e66onTiBlJAAAlYt1aRz8817.png

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

wKioL1e66q2Qe3RtAABQ7Q5NlW0980.png

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

wKiom1e66uPh-dNnAAARNYviwTE051.png

    --changelog:查詢rpm包的changelog

wKioL1e66x6iASRNAABVce8DAlg174.png

    -q --scripts:查詢包相關的腳本

            preinstall 安裝前腳本

            postinstall 安裝後腳本

            preuninstall 卸載前腳本

    postuninstall 卸載後腳本


卸載:

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

例如:rpm -e package_name

如果卸載被其他程序所依賴的包

1、把依賴者一同卸載

2、忽略依賴關係:--nodeps

3、不在卸載

wKioL1e63KnQUasHAAAUMRIdlYk322.png


校驗:檢查包安裝後生成的文件是否被修改過

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

    S  大小       file Size differs 

    M  頭文件     Mode differs (includes permissions and file type)

    5  MD5        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  修改時間   mTimediffers

    P  能力改變   capabilities differ


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

包完整性:通過單向加密機制(MD5|sha1)

來源合法性:通過公鑰加密機制(RSA)


公鑰加密:

對稱加密:加密、解密使用同一密鑰;

非對稱加密:密鑰是成對兒的

    public key: 公鑰,公開所有人

    secret key: 私鑰, 不能公開

            

導入所需要公鑰:

rpm  -K|checksig  rpmfile 檢查包的完整性和簽名

    --nosigeature:不檢查來源合法性

    --nodigest:不檢查包完整性

rpm  --import  /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7  導入以後再做驗證

CentOS 7發行版光盤提供:RPM-GPG-KEY-CentOS-7

rpm  -qa  gpg-pubkey*


示例:導入公鑰以後,查詢包的時候,我們會發現沒有提示信息了,這是因爲默認沒有校驗包的公鑰,所以系統會對所有的包對提示報錯的信息

wKiom1e673bRPTx6AAAMsYhRxks881.png

wKioL1e68RTiQ2NSAAAbdamtHQY641.png

wKiom1e67zCCd5DzAAA1rrrAkvI442.png

wKioL1e67zHwXJj-AAAl4HwKgX0273.png


rpm數據庫


數據庫重建:

    /var/lib/rpm

rpm {--initdb|--rebuilddb}

    initdb: 初始化

    如果事先不存在數據庫,則新建之,否則,不執行任何操作

    rebuilddb:重建

    無論當前存在與否,直接重新創建數據庫

wKioL1e68cuBLeMxAACQXTaFCig961.png


yum命令的使用

CentOS前端工具: yum, dnf

yum: YellowdogUpdate Modifier,rpm的前端程序,用來解決軟件包相關依賴性,可以在多個庫之間定位軟件包,up2date的替代工具

    yum repository: yum repo,存儲了衆多rpm包,以及包的相關的元數據文件(放置於特定目錄repodata下)

    文件服務器:通過yum所支持的文件共享機制將各rpm包通過文件服務共享

    ftp  ftp://server/path/to/repo

    http http://server/path/to/repo

    nfs  nfs://servr/nfs_path

    file file:///path/to/path


yum客戶端作用

     1.配置文件:指定各可用的yum倉庫;

     2.緩存元數據:yum會到各可用yum倉庫獲取元數據,並緩存至本地

     3、分析元數據:根據具體的操作請求完成元數據分析,可能包括依賴關係、文件列表等信息

     4.執行具體操作


yum客戶端配置文件:

要使用yum管理應用程序,首先得配置其可用的yum倉庫,保存在配置文件中

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

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

配置文件格式:由兩段組成。類似window的ini配置文件

    [main]:主配置段

    [repo]:倉庫配置段

倉庫指向的定義:

[repositoryID]                         倉庫ID

name=Some name for this repository     倉庫名

baseurl=url://path/to/repository/      倉庫的訪問路徑

enabled={1|0}                          1,表示啓用,0表示不啓用

gpgcheck={1|0}                         1,校驗gpg,0表示不驗證

gpgkey=URL                             公鑰地址(可以是本地,也可以是服務器端路徑)

enablegroups={1|0}

failovermethod={roundrobin|priority}   默認爲:roundrobin,意爲隨機挑選;

cost=                                  定義此倉庫開銷,默認爲1000


yum-config-manager  命令

    --add-repo= URL 添加倉庫

    --disable      “倉庫名” 禁用倉庫

    --enable       “倉庫名” 啓用倉庫


示例:創建一個倉庫

wKiom1e69MjzZFNOAADROXWQ4bs219.pngwKiom1e69Q7Dj0l1AAA3NBFaYBc666.png


yum命令的用法:

yum [options] [command] [package ...]


顯示倉庫列表:

    repolist[all|enabled|disabled]

wKioL1e8-gbDOR4zAABXMJVx-GQ077.png

顯示程序包:

    list

    # yum list [all | glob_exp1] [glob_exp2] [...]

    # yum list {available|installed|updates} [glob_exp1] [...]

示例yum list 支持通配符。由於裏面的安裝包太多。所以這裏用通配符只看部分

wKiom1e8-n_Qv8IyAAAoXVqxCMA942.png

安裝程序包:

    install package1 [package2] [...]

    reinstall package1 [package2] [...] (重新安裝)

wKioL1e8-3jjFHzuAABuDkR6UxU860.png

升級程序包:

    update [package1] [package2] [...]

    downgrade package1 [package2] [...] (降級)

檢查可用升級:

    check-update

wKioL1e8_3rjl3IdAAAj1RIJIvc585.png

卸載程序包:

    remove | erase package1 [package2] [...]

wKiom1e8-4eTTfWjAABgmEGOhfY959.png

查看程序包information:

    info [...]

wKiom1e8_8WQxLTSAABkwJKWUoI517.png

查看指定的特性(可以是某文件)是由哪個程序包所提供:

    provides | whatprovidesfeature1 [feature2] [...]

wKiom1e9EHnR9IM5AABEcawTC5k706.png

清理本地緩存:一般來說,除非倉庫出了問題或者使用新的倉庫,否則一般情況下面不需要清理緩存

    clean [ packages | metadata | expire-cache | rpmdb| plugins | all ]

wKioL1e9ADmgRk5LAAAjQDLMre8442.png

構建緩存:

    makecache

wKioL1e9AIDjvYXcAAAmEv9TzTs844.png

搜索:search string1 [string2] [...]

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

wKioL1e9APGCT7n3AADvM1emR6k767.png

查看指定包所依賴的capabilities:

    deplist package1 [package2] [...]

wKiom1e9ATqAHxYgAAA-zXhX6YQ695.png

查看yum事務歷史:

    history [info|list|packages-list|packages-info|

    summary|addon-info|redo|undo|

    rollback|new|sync|stats]

    yum history

    yum history info 6

    yum history undo 6

wKioL1e9Ah-i6VfTAACCfUYlFFY538.png

 查看指定yum歷史的操作

wKiom1e9AiCzZB22AAB-NKyePuA446.png

撤銷指定歷史操作

wKioL1e9D2zyLuUiAABvwYNEZXI879.png

wKiom1e9D2ziPEQVAAALlpM-z8E612.png


日誌存放位置:

    /var/log/yum.log

wKioL1e9An7jLF0yAAC3J2w3_jM178.png

安裝及升級本地程序包:

    localinstallrpmfile1 [rpmfile2] [...]

(用install替代)

    localupdaterpmfile1  [rpmfile2] [...]

(用update替代)

wKiom1e9A6qwOO8HAABYSEhjHmg225.png

包組管理的相關命令:

    group install group1 [group2] [...]

    group update group1 [group2] [...]

    group list[hidden] [groupwildcard] [...] 加hidden可以顯示隱藏文件

    group remove group1 [group2] [...]

    group info group1   [...]

wKioL1e9BEjQqmUdAACBxguHP-c876.png

注意:包組需要用group install安裝

wKiom1e9BEmwOIldAAC8L9ZJe5k002.png


如何使用光盤當作本地yum倉庫:

(1) 掛載光盤至某目錄,例如/media/cdrom

# mount /dev/cdrom/media/cdrom

(2) 創建配置文件

    [CentOS7]

    name=

    baseurl=

    gpgcheck=

    enabled=

示例:centos7的cdrom當作倉庫配置,注意的是,得先手動配置掛載光盤到該目錄,由於centos7不支持自動掛載,可以把掛載的命令寫入到/etc/profile.d裏面以實現開機自動掛載cdrom

wKioL1e9CAWS_i7_AABI2ZSvofA652.png

wKioL1e9CAaB5ImtAABonNfsbq0637.png

示例:centos6建立yum的光盤倉庫

wKiom1e9Cc3CFw_TAABrL2yLgYY903.png

yum的命令行選項:

    --nogpgcheck:禁止進行gpgcheck

    -y: 自動回答爲“yes”

    -q:靜默模式

    --disablerepo=repoidglob:臨時禁用此處指定的repo

    --enablerepo=repoidglob:臨時啓用此處指定的repo

    --noplugins:禁用所有插件

wKiom1e9Cl2CHFFeAAAi8ja8Fgo470.png

yum倉庫

yum的repo配置文件中可用的變量:

    $releasever: 當前OS的發行版的主版本號,對Yum而言指的是redhat-relrase版本。只替換爲主版本號,如CentOS 7.2 則替換爲7

    $arch: 系統架構平臺,i386,i486,i586,x86_64等

    $basearch:系統基本架構,如i686,i586等的基本架構爲;i386

    $YUM0-$YUM9:在系統定義的環境變量,可以在yum中使用

      獲取當前系統相應宏替換的辦法

        python

        import yum,pprint

        yb=yum.YumBase()

        pprint.pprint(yb.conf,yumvar,width=1)

        quit()

示例:

    http://server/centos/$releasever/$basearch/

    http://server/centos/7/x86_64

    http://server/centos/6/i384

示例:系統自帶的倉庫裏面的url的鏈接均是變量,這樣的話,在生產環境中,如果是有大量的服務器,因爲服務器的系統版本很可能不一樣,這樣配置的話,系統可以自動識別版本號,以免安裝錯了其他系統發行版的包導致出其他問題。

wKiom1e9CvLjQh_bAAAvzpvzAW8118.png

自己創建yum倉庫:

    createrepo[options] <directory>

示例:在/root/treedir下面創建一個倉庫,並且把一個tree的安裝包放在裏面

wKioL1e9PZiRR2fyAADE78QARQM041.png

可以跟cd裏面的repodata目錄對比一下基本是一樣的

wKioL1e9PnGTkVkTAAE3VtYb7IQ027.png編輯/etc/yum.repos.d/base.repo文件,啓動treedir的倉庫,並且關閉其他倉庫

wKiom1e9PZmheXAbAABV3Ni7e1U797.png

安裝tree命令,並且成功,可以查看到tree命令是在tree的倉庫裏面安裝的。


wKiom1e9Qn7gfOGHAABdi1l9Wtk480.png


思考問題

刪除kernel包後,系統無法啓動,怎麼恢復?


一言不合就把內核幹掉了O.O

wKioL1e9m1GCv2aIAAAOVBbyOtY158.png

wKiom1e9m1GyvsYiAAB4w1OOT8A221.png

重啓以後發現內核真的掛了,怎麼辦怎麼辦?T_T

wKioL1e9m1LyQAKkAAAFtUvXMG8462.png

此時我們可以把安裝光盤放進去服務器,然後選擇cd-rom啓動

wKiom1e9m1LQQpP2AAAMXCIeZXg724.png

點擊進去Rescue installed system救援模式

wKioL1e9m1nhUfVNAAa2y6VdH1I174.png

選擇系統語言

wKiom1e9m1mSK0Z0AAAjSD3fbOk318.png

選擇默認鍵盤格局。在天朝都是us的

wKioL1e9m1nQM1aOAAAdBlF3KSQ876.png

是否啓用網絡,這一個可以選擇no,因爲我們是用光盤的,無需聯網

wKiom1e9m1rzC3sjAAAWXN7wL3Y616.png

問你是否繼續,選擇Continue

wKioL1e9m1rC2YBLAAAtQIGaeBk150.png

這裏提示如果你需要用root環境的權限可以輸入chroot /mnt/sysimage

wKioL1e9m1uQx-KSAAAfLMk-AQw191.png

這裏會提示你的系統已經掛載到/mnt/sysimage這個目錄下面

wKiom1e9m1uRqKjrAAAqYUftuww083.png

此時選擇Start shell,然後救援模式就開始了..

wKioL1e9m1vyPKW3AAAVBm7-CJU038.png

因爲是內核不小心卸載掉了(實際上是故意的),所以我們只需要從光盤裏面安裝一個內核即可,我們把光盤掛載到一個空的文件夾裏面。

注意,千萬不要直接掛載/dev/sr0到/mnt下面,不然會出錯的,出錯以後只能重啓又重複這個操作。

掛載完光盤以後,輸入rpm -ivh kernel-2.6.32-642.el6.noarch.rpm --root=/mnt/sysimage

等待安裝完畢以後,重啓電腦

wKiom1e9m1vQ1SPGAAAoi0U82Q8234.png

重啓電腦可能會看見這樣的提示,意味着你要等一個很長的時間才能進入系統,這個就慢慢等一下吧

wKioL1e9m1zwrO9RAAAJxLs89kQ256.png

漫長的等待,看見可以正常進入系統了,並且登陸正常,ok,內核已經修復完

wKiom1e9m-igHk9oAAAK6XQfa3c942.png

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