Linux_rpm和yum實現程序包管理功能

程序包管理:


內核功能:進程管理、內存管理、網絡協議棧、驅動程序、...

應用程序:


包管理器:打包,包管理(安裝、升級、卸載、查詢及校驗)

deb: debian

rpm: redhat package manager (早起使用perl語言寫)

RPM is Package Manager ————>通過C語言實現,性能大幅提升


程序包的組成部分:

二進制程序:/bin, /sbin,/ /usr/bin, /usr/sbin,  可執行文件

庫文件:/lib64, /usr/lib64  共通的功能通過庫文件進行互通

配置文件:/etc  通過配置文件來定義工作屬性

幫助文件:manual, info,   程序基本使用方式


包管理器:

打包:一個單一的歸檔文件中;

安裝:把打包的文件展開在當前系統上,各種文件放置在正確的路徑下

卸載:把每一個安裝生成的文件蒐集起來,並且刪除

升級:新版本文件替換老版本的文件

查詢:查詢安裝的程序包的信息

校驗:程序包安裝後是否又被篡改等(來源的合法性、完整性)



rpm包:

打包工具:rpmbuild: 基於specs文件進行打包


一個rpm包總共包含10個功能,5個常用,3個少用,2個基本不用;但是打包只打了5個常用功能,此時就需要“分包機制”來解決有些人需要3個少用的情況。


分包機制:

    testapp-VERSION.tar.gz


核心包:testapp-VERSION

支包:testapp-devel-VERSION


VERSION:major(主版本號).minor(次版本號).release(修正版本號)

base-4.2.4.tar.gz

主版本號定義了應用程序最關鍵的功能。

次版本號一般是小功能的改進

修正版本號一般是修復bug等


rpm包的命名機制:

name(報名)-VERSION(RPM包的Version)-RELEASE(發行版本號).ARCH(架構).rpm

bash-4.2.4-1.el7.x86_64.rpm

bash-devel-4.2.4-1.el7.x86_64.rpm



包和包之間:有可能存在依賴關係:

X --> Y    Y的功能需要X來支持。


rpm數據庫:/var/lib/rpm/    記錄了包名,生成的文件,校驗碼等


如何獲取rpm包:

1、發行版提供的程序包;

2、Fedora-EPEL

3、項目的官方站點

4、搜索引擎

http://rpmfind.net

http://rpm.pbone.net

http://pkgs.org


CentOS識別光盤用的設備文件:/dev/cdrom,

首先建立光盤的一個掛載點,然後將光盤進行掛在到這個點上。、

mkdir /var/mnt

mount /dev/cdrom /var/mnt


基於rpm命令實現程序包管理:

安裝:

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

-i:安裝

-v:顯示詳細過程,-vv, -vvv

-h:用#來顯示安裝進度

[root@Centos6 Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.x86_64.rpm 
warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]

            -vv:可以展示出非常具體的安裝信息,哪些個文件被裝到哪個路徑下面等信息。

每個rpm包都提供一個或多個capabilities

[root@Centos6 Packages]# rpm -ivh php-mysql-5.3.3-40.el6_6.x86_64.rpm 
warning: php-mysql-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
error: Failed dependencies:
	php-common(x86-64) = 5.3.3-40.el6_6 is needed by php-mysql-5.3.3-40.el6_6.x86_64
	php-pdo(x86-64) is needed by php-mysql-5.3.3-40.el6_6.x86_64

上圖表示依賴關係沒有解決。不給安裝

            --nodeps:忽略依賴關係安裝

php-mysql-5.3.3-40.el6_6.x86_64.rpm --nodeps
warning: php-mysql-5.3.3-40.el6_6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
   1:php-mysql              ########################################### [100%]

加上參數--nodeps則忽略依賴關係進行安裝。


            --replacepkgs:重裝程序包

對已經存在的包需要重新安裝,則可以使用這個參數

[root@Centos6 Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.x86_64.rpm 
warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
	package zsh-4.3.11-4.el6.centos.x86_64 is already installed

表示zsh這個包已經安裝了。


    使用--replacepkgs參數重新安裝

[root@Centos6 Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.x86_64.rpm --replacepkgs
warning: zsh-4.3.11-4.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY
Preparing...                ########################################### [100%]
   1:zsh                    ########################################### [100%]

        升級:

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

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


        -Uvh: 如果有舊版程序包,則升級之;如果沒有,則安裝之;

升級也是使用Install的選項,比如--nodeps等

        -Fvh: 如果有舊版程序包,則升級之;如果沒有,則不安裝;


        --nodeps

        --oldpackage:降級;升級版本比原先版本要低

        --force:強制升級。老的版本依賴當前的包,如果升級了可能老的其他服務不支持,那麼就會阻止升級,則使用這條參數進行強制升級。


        卸載:

        rpm {-e|--erase} [--nodeps] [--noscripts] [--notriggers] [--test] 包名(比如zsh,而不是xxxxx.rpm)

[root@Centos6 Packages]# rpm -e zsh
[root@Centos6 Packages]#

不會顯示任何信息,如果異常則會出現報錯。如果一個程序包被另外一個程序包依賴,則卸載的時候會報錯,因爲另外一個包存在依賴關係。 


        查詢:

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

[root@Centos6 Packages]# rpm -q zsh
zsh-4.3.11-4.el6.centos.x86_64

表示已經被安裝


        查詢選項:不能更換先後順序,必須q在前。

        -qa: 查詢本機已經安裝的所有程序包;

        -qf /PATH/TO/SOMEFILE: 查詢此處的文件由哪個程序包安裝生成;

        -qc: 查詢指定程序包安裝生成的配置文件

[root@Centos6 Packages]# rpm -qc zsh
                /etc/skel/.zshrc
                /etc/zlogin
                /etc/zlogout
                /etc/zprofile
                /etc/zshenv
                /etc/zshrc


                -qd: 查詢指定的程序包安裝生成的文檔

[root@Centos6 Packages]# rpm -qd zsh
/usr/share/doc/zsh-4.3.11/BUGS
/usr/share/doc/zsh-4.3.11/CONTRIBUTORS
/usr/share/doc/zsh-4.3.11/FAQ
/usr/share/doc/zsh-4.3.11/FEATURES
/usr/share/doc/zsh-4.3.11/LICENCE
/usr/share/doc/zsh-4.3.11/MACHINES

                -qi: 查詢指定的程序包的相關信息;

[root@Centos6 Packages]# rpm -qi zsh
Name        : zsh                          Relocations: (not relocatable)
Version     : 4.3.11                            Vendor: CentOS
Release     : 4.el6.centos                  Build Date: Fri 24 Jul 2015 05:41:25 PM CST
Install Date: Thu 27 Aug 2015 10:15:37 AM CST      Build Host: c6b8.bsys.dev.centos.org
Group       : System Environment/Shells     Source RPM: zsh-4.3.11-4.el6.centos.src.rpm
Size        : 5283457                          License: BSD
Signature   : RSA/SHA1, Sat 25 Jul 2015 04:41:32 AM CST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://zsh.sunsite.dk/
Summary     : A powerful interactive shell

-ql: 查詢程序包安裝生成的所有文件的列表;

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

        preinstall: 安裝前腳本

        postinstall:安裝後腳本

        preuninstall: 卸載前腳本

        postuninstall: 卸載後腳本

[root@Centos6 Packages]# rpm -q zsh --scripts
postinstall scriptlet (using /bin/sh):
if [ ! -f /etc/shells ] ; then
    echo "/bin/zsh" > /etc/shells
else
    grep -q "^/bin/zsh$" /etc/shells || echo "/bin/zsh" >> /etc/shells
fi

if [ -f /usr/share/info/zsh.info.gz ]; then
# This is needed so that --excludedocs works.
/sbin/install-info /usr/share/info/zsh.info.gz /usr/share/info/dir \
  --entry="* zsh: (zsh).			An enhanced bourne shell."
fi
****
***
**
*

                -p: 查詢針對是未安裝的程序包文件;

比如我沒安裝zenity這個rpm包,我可以使用-qpi跟隨這個包的rpm名稱來查詢信息

[root@Centos6 Packages]# rpm -qi zenity
package zenity is not installed
[root@Centos6 Packages]# rpm -qip zenity
error: open of zenity failed: No such file or directory
[root@Centos6 Packages]# rpm -qpi zenity
error: open of zenity failed: No such file or directory
[root@Centos6 Packages]# rpm -qpi zenity-2.28.0-1.el6.x86_64.rpm 
warning: zenity-2.28.0-1.el6.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID c105b9de: NOKEY
Name        : zenity                       Relocations: (not relocatable)
Version     : 2.28.0                            Vendor: CentOS
Release     : 1.el6                         Build Date: Tue 17 Aug 2010 07:12:21 AM CST
Install Date: (not installed)               Build Host: c6b2.bsys.dev.centos.org
Group       : Applications/System           Source RPM: zenity-2.28.0-1.el6.src.rpm
Size        : 4338271                          License: LGPLv2+
Signature   : RSA/8, Sun 03 Jul 2011 01:07:05 PM CST, Key ID 0946fca2c105b9de
Packager    : CentOS BuildSystem <http://bugs.centos.org>
URL         : http://directory.fsf.org/zenity.html
Summary     : Display dialog boxes from shell scripts
Description :
Zenity lets you display Gtk+ dialog boxes from the command line and through
shell scripts. It is similar to gdialog, but is intended to be saner. It comes
from the same family as dialog, Xdialog, and cdialog.


                -whatprovides 查詢哪種功能被哪個程序包所提供

-whatrequires 查詢哪種能力被哪個程序包所依賴

校驗:檢查安裝的rpm包文件是否被改動。如果對安裝完的配置文件進行改動然後使用校驗,則能發現被改動的文件具體路徑。

[root@Centos6 Packages]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@Centos6 Packages]# vim /etc/skel/.zshrc

我對.zshrc進行了改動,之後使用rpm -V zsh就能發現:

[root@Centos6 Packages]# rpm -V zsh
S.5....T.  c /etc/skel/.zshrc


        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  刪除了一個安裝上去的文件,則會報錯


包校驗:

來源合法性驗正:非對稱加密(公鑰和私鑰)

完整性驗正:單向加密


導入密鑰(對方的公鑰):rpm --import /PATH/TO/KEY_FILE

校驗:rpm -K /PATH/TO/RPM_FILE

只要將RPM-GPG-KEY-CentOS-6導入則能進行對Packages下的rpm包進行校驗

[root@Centos6 mnt]# ls /etc/pki/rpm-gpg/
RPM-GPG-KEY-CentOS-6        RPM-GPG-KEY-CentOS-Security-6
RPM-GPG-KEY-CentOS-Debug-6  RPM-GPG-KEY-CentOS-Testing-6

導入密鑰(對方的公鑰):rpm --import /PATH/TO/KEY_FILE

[root@Centos6 mnt]# rpm --import ./RPM-GPG-KEY-CentOS-6 
[root@Centos6 mnt]#


校驗:rpm -K /PATH/TO/RPM_FILE

[root@Centos6 mnt]# rpm -K ./Packages/zsh-4.3.11-4.el6.centos.x86_64.rpm 
./Packages/zsh-4.3.11-4.el6.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

導入公鑰後,則使用rpm安裝不會出現warning告警了。

當RPM依賴關係複雜的時候,就有了YUM這個功能,來解決包之間的依賴關係。


YUM: Yellowdog Updater Modified


yum repositories:

文件服務器:

ftp://hostname/PATH/TO/REPO

http://hostname/PATH/TO/REPO

file:///PATH/TO/REPO


yum程序的配置文件:

/etc/yum.conf

定義全局配置:對所有倉庫都適用的配置

/etc/yum.repos.d/*.repo

一個文件通常用於一個或一組功能相近或相關的倉庫


定義一個倉庫指向:

[REPO_ID]

name=   指明repo名稱

baseurl=  可以使用的路徑 ftp  http  file  可以存在多個,隨機挑選一個使用,所提供的包和源數據需要一樣

mirrorlist=SCHEME://HOSTNAME/PATH/TO/MIRROR_LIST_FILE

enabled={1|0}  1啓用 0禁用

gpgcheck={1|0}  1啓用包校驗  0禁用包校驗

gpgkey=  如果啓用校驗,則指明使用哪個密鑰校驗

cost=  如果多個倉庫,則這個倉庫的開銷,開銷越小越容易被使用


定義倉庫指向可用變量:

$releasever: 引用當前系統的主版本號;

$basearch: 當前系統的基本架構;

i386, i486, i586, i686: i386

                http://mirrors.magedu.com/CentOS/$releasever/os/$basearch


通過yum repolist查看可用yum

[root@Centos6 yum.repos.d]# yum repolist
Loaded plugins: fastestmirror, security
Determining fastest mirrors
repo id                                      repo name                               status
aa                                           aa                                      6,575
repolist: 6,575

yum命令:

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


命令:

安裝:install

[root@Centos6 yum.repos.d]# yum install php-mbstring
Loaded plugins: fastestmirror, security
Setting up Install Process
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package php-mbstring.x86_64 0:5.3.3-40.el6_6 will be installed
--> Processing Dependency: php-common(x86-64) = 5.3.3-40.el6_6 for package: php-mbstring-5.3.3-40.el6_6.x86_64
--> Running transaction check
---> Package php-common.x86_64 0:5.3.3-40.el6_6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===========================================================================================
 Package                 Arch              Version                     Repository     Size
===========================================================================================
Installing:
 php-mbstring            x86_64            5.3.3-40.el6_6              aa            458 k
Installing for dependencies:
 php-common              x86_64            5.3.3-40.el6_6              aa            527 k

Transaction Summary
===========================================================================================
Install       2 Package(s)

Total download size: 985 k
Installed size: 5.0 M

yum自己會自己解決依賴關係


            卸載:remove

依賴此包的其他包也會被卸載

升級:update

yum check-update 檢查哪些升級包可用

yum update 包名

查詢:

info

search KEYWORD

[root@Centos6 Packages]# yum search zsh
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
==================================== N/S Matched: zsh =====================================
python-twisted-core-zsh.x86_64 : Tab completion for Zsh and Twisted Core
zsh-html.x86_64 : Zsh shell manual in html format
zsh.x86_64 : A powerful interactive shell

       search KEYWORD     list all|installed|availiable列出安裝了的包,可用的包,全部的包等

provides /PATH/TO/SOMEFILE: 查詢指定文件由哪個包安裝生成

重新安裝:reinstall

降級:downgrade

清理緩存:clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

清理包,清理元數據,清理過期緩存,清理rpm數據庫文件,清理插件,全部清理

生動生成緩存:makecache


包組:

grouplist

groupinfo "GRP_NAME"

groupinstall "GRP_NAME"

groupremove "GRP_NAME"


倉庫:

repolist [all|enabled|disabled]

repoinfo [all|enabled|disabled]


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

掛載光盤至某目錄

定義倉庫,使用file:///指明其訪問路徑;


簡單yum配置,使用本地光盤內的源:

[aa]
name=aa
baseurl=file:///var/mnt
enable=1
gpecheck=0


創建本地倉庫:

yum install createrepo


createrepo /PATH/TO/RPMFILES/

DNF:yum前端管理升級版,由SUSE研發,在cenots7裏面只要yum install dnf,以後可以使用dnf命令。


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