软件包管理 — rpm & yum

软件包管理

包管理器

    二进制应用程序的组成部分:

        二进制文件、库文件、配置文件、帮助文件

    程序包管理器:

        debian: deb文件, dpkg包管理器

        redhat: rpm文件, rpm包管理器

        rpm: Redhat Package Manager

        RPM Package Manager

包命名

QQ截图20160822090403.png

    源代码: 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

        常见的arch:

        x86: i386, i486, i586, i686

        x86_64: x64, x86_64, amd64

        powerpc: ppc

        跟平台无关: 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 /PATH/TO/BINARY_FILE

QQ截图20160822091801.png

    管理及查看本机装载的库文件:/sbin/ldconfig

        ldconfig

             -p: 显示本机已经缓存的所有可用库文件

    名及文件路径映射关系

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

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

程序包管理器:

    功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作

    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) 第三方组织:

            Fedora-EPEL:

            Extra Packages for Enterprise Linux

            Rpmforge:RHEL推荐,包很全

            搜索引擎:

            http://pkgs.org

            http://rpmfind.net

            http://rpm.pbone.net

            https://sourceforge.net/

        (4) 自己制作

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

===================================================================================================================================

rpm包管理

以CentOS 为例 ,CentOS系统上使用rpm命令管理程序包:

    安装、卸载、升级、查询、校验、数据库维护


    安装

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

        -v: verbose

        -vv:

        -h: 以#显示程序包管理执行进度

        rpm -ivh PACKAGE_FILE …

        (PS:安装包的时候经常加ivh 显示安装详细信息以及安装进度)

    rpm包安装

        [install-options]

        –test: 测试安装,但不真正执行安装; dry run模式(但在没有导入公钥时,会报错)

        –nodeps:忽略依赖关系

        –replacepkgs | replacefiles

        –nosignature: 不检查来源合法性

        –nodigest:不检查包完整性

        –noscipts:不执行程序包脚本片断

        %pre: 安装前脚本; –nopre

        %post: 安装后脚本; –nopost

        %preun: 卸载前脚本; –nopreun

        %postun: 卸载后脚本; –nopostun

QQ截图20160822093917.png

    rpm包升级

        升级:

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

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

        upgrade:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”(能当安装使用)

        freshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作(只能当升级使用)

        rpm -Uvh PACKAGE_FILE …

        rpm -Fvh PACKAGE_FILE …

        –oldpackage:降级

        –force: 强行升级

    升级注意项

        (1) 不要对内核做升级操作; Linux支持多内核版本并存,因此,对直接安装新版本内核

        (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留


    包查询

        rpm {-q|–query} [select-options] [query-options] 准确的包名


        [select-options]  

            -a: 所有包(已经安装在系统上的所有包)

            -f: 查看指定的文件由哪个程序包安装生成

            -l :相当于 ls  查看程序安装完之后的文件

            -p rpmfile:针对尚未安装的程序包文件做查询操作;(后跟明确的包名)

            –whatprovides CAPABILITY:查询指定的CAPABILITY

            由哪个包所提供(查看程序的依赖文件)

            –whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖(查该程序文件被哪一个程序所依赖)

            rpm2cpio 包文件|cpio –itv 预览包内文件

            rpm2cpio 包文件|cpio –id “ *.conf” 释放包内文件 (*是指包内所有未见,可用-itv预览包内文件,按需释放,但用次方法释放文件,需要注意元数据的变化,如属主属组等)(注意:释放的路径,按需填写)

QQ截图20160822095711.png

(PS:也可以释放在当前路径,然后cp到所需位置,不过要注意元数据的变化)


        [query-options]

            –changelog:查询rpm包的changelog(查更新版本,更新日志)

            -c: 查询程序的配置文件

            -d: 查询程序的文档

            -i: information

            -l: 查看指定的程序包安装后生成的所有文件;

            –scripts:程序包自带的脚本片断

            -R: 查询指定的程序包所依赖的CAPABILITY;

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

      卸载:(安装有依赖性,卸载也有依赖性,rpm无法解决依赖性,需要手动一个一个安装)

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

            –allmatches   : 全部卸载

            –nodeps  :不考虑依赖性

            –noscripts :不执行脚本

            –notriggers :不触发另一个相关动作(如脚本等)

            –test   :只作测试 ,不会卸载

    包校验

        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

包来源合法性验正及完整性验正: (signature签名等 );包被不合法修改过,或者本机无检测包合法性的机制,则会报错

    /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7      或在光盘下   ./CentOS 7 x86_64/RPM-GPG-KEY-CentOS-7

    完整性验正: SHA256

    来源合法性验正: RSA

    公钥加密:

    对称加密:加密、解密使用同一密钥;

    非对称加密:密钥是成对儿的

    public key: 公钥,公开所有人

    secret key: 私钥, 不能公开

    导入所需要公钥:

    rpm -K|checksig rpmfile 检查包的完整性和签名

    rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

    CentOS 7发行版光盘提供: RPM-GPG-KEY-CentOS-7

    rpm -qa gpg-pubkey*

rpm数据库

    数据库重建:

    /var/lib/rpm

    rpm {–initdb|–rebuilddb}

    initdb: 初始化

    如果事先不存在数据库,则新建之;否则,不执行任何操作

QQ截图20160822100825.png

(PS:新建的数据库里边没有任何信息,相当于一个空表.在新建数据库之前安装了tree,但后来数据库丢失,新建数据库后,若要删除tree,系统会提示没有安装tree,因为新建的数据库是空表!!!

新建数据库要谨慎小左)

    rebuilddb:重建已安装的包头的数据库索引目录.只是新建索引目录文件;无论当前存在与否,rebuilddb都会直接重新创建数据库

QQ截图20160822101248.png

=============================================================================================================================


yum

CentOS: yum, dnf

YUM: Yellowdog Update Modifier, rpm的前端程序,用来解决软件包相关依赖性,可以在多个库之间定位软件包,up2date的替代工具

yum repository: yum repo,存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录repodata下)

    文件服务器:

    ftp://

    http://

    file:///

    yum客户端配置文件:

        /etc/yum.conf:为所有仓库提供公共配置

        /etc/yum.repos.d/*.repo:为仓库的指向提供配置

QQ截图20160822102708.png

    仓库指向的定义:(可以自定义文件指向路径)              

        [repositoryID]                                          

            name=Some name for this repository     

            baseurl=url://path/to/repository/          #仓库的访问路径

            enabled={1|0}                              # 1 :表示启用 ; 0 : 表示不启用

            gpgcheck={1|0}                             # 1 :验证gpg  ; 0 : 表示不验证gpg

            gpgkey=URL                                 #公钥路径,可以是本地,也可以是服务器端路径,也可以不填

            enablegroups={1|0}                         #是否启用包组信息

            failovermethod={roundrobin|priority}       #多个url时如何选择;roundrobin 随机选择;priority默认选择

            cost= 默认为1000                           #定义此仓库开销,默认为10000

    

    yum命令的用法:

        yum [options] [command] [package …]

        yum-config-manager –disable “仓库名" 禁用仓库

        yum-config-manager –enable “仓库名” 启用仓库

        

    显示仓库列表:

       repolist [all|enabled|disabled]

软件包管理 -- rpm & yum

    显示程序包:

        list

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

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

        […]


    安装程序包:

        install package1 [package2] […]

        reinstall package1 [package2] […] (重新安装)

    升级程序包:

        update [package1] [package2] […]

        downgrade package1 [package2] […] (降级)

    检查可用升级:

        check-update

    卸载程序包:

        remove | erase package1 [package2] […]

    查看程序包information:

        info […]

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

        provides | whatprovides feature1 [feature2] […]

    清理本地缓存:

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

    构建缓存:

        makecache

    搜索: search string1 [string2] […]

        以指定的关键字搜索程序包名及summary信息

        查看指定包所依赖的capabilities:

        deplist package1 [package2] […]

    查看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

        日志 : /var/log/yum.log

   ============================================================================================================

附上文末彩蛋:

编写脚本/root/bin/copycmd.sh

(1) 提示用户输入一个可执行命令名称;

(2) 获取此命令所依赖到的所有库文件列表

(3) 复制命令至某目标目录(例如/mnt/sysroot)下的对应路径下;

如:/bin/bash ==> /mnt/sysroot/bin/bash

/usr/bin/passwd==> /mnt/sysroot/usr/bin/passwd

(4) 复制此命令依赖到的所有库文件至目标目录下的对应路径下:

如:/lib64/ld-linux-x86-64.so.2 ==> /mnt/sysroot/lib64/ld-linux-x86-64.so.2

(5)每次复制完成一个命令后,不要退出,而是提示用户键入新的要复制的命令,并重复完成上述功能;直到用户输入quit退出

[root@localhost bin]# cat copycmd.sh 
#!/bin/bash
#
copy() {
while [[ $# -ge 1 ]];do
cp $1 /testdir/bin/sysroot/dir_$cmd
echo "$1  copy complate"
shift
#运用shift参数吐息,优化脚本
done
}
while true ;do
read -p "this scrip will copy  the command what you want : " cmd
if which $cmd &> /dev/null ;then
mkdir /testdir/bin/sysroot/dir_$cmd
cmdlist=`whereis $cmd |sed -r "s@$cmd:(.*)@\1@"`
lddlist=$(ldd `which $cmd | tr -d '\t'|grep "/.*"` | tr ' ' '\n' |grep "/.*")
#####注意反引号 ` 与$(cmd)的运用; 反引号 ` 用多了,会看得眼睛乱;还有 $(cmd)是命令引用 ;而$((算术运算式))  是算术运算符
copy $cmdlist
copy $lddlist
else
echo "wrong command ,try again"
fi
done


1、编写服务脚本/root/bin/testsrv.sh,完成如下要求

(1) 脚本可接受参数:start, stop, restart, status

(2) 如果参数非此四者之一,提示使用格式后报错退出

(3) 如是start:则创建/var/lock/subsys/SCRIPT_NAME, 并显示“启动成功”

考虑:如果事先已经启动过一次,该如何处理?

(4) 如是stop:则删除/var/lock/subsys/SCRIPT_NAME, 并显示“停止完成”

考虑:如果事先已然停止过了,该如何处理?

(5) 如是restart,则先stop, 再start

考虑:如果本来没有start,如何处理?

(6) 如是status, 则如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAMEis running…”

如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped…”

其中:SCRIPT_NAME为当前脚本名


[root@localhost bin]# cat testsrv.sh 
#!/bin/bash
#
start() {
if [[ ! -a /testdir/bin/subsys/$0 ]];then 
touch /testdir/bin/subsys/$0 && echo -e "\033[32mstart succeefully\033[0m"
else
echo -e "\033[31m$0 is running...\033[0m"
fi
}
stop() {
if [[ -a /testdir/bin/subsys/$0 ]];then 
rm /testdir/bin/subsys/$0
echo -e "\033[32mstop succeefully\033[0m" 
else
echo -e "\033[31m$0 has stoped...\033[0m"
fi
}
restart() {
if [[ -a /testdir/bin/subsys/$0 ]];then 
rm /testdir/bin/subsys/$0 && touch /testdir/bin/subsys/$0 
echo -e "\033[32mrestart succeefully\033[0m"
else 
echo -e "\033[31mrestart unsucceefully\033[0m"
fi
}
status() {
if [[ -a /testdir/bin/subsys/$0 ]];then
echo -e "\033[32m$0 is running...\033[0m"
else
echo -e "\-33[32m$0 has stopped...\033[0m"
fi
}
######以上参数可以写在另一个文件中,然后在本脚本中调用.(注意用. ./file 或者 source ./file  而不是bash ./file)#######
PS3="this script will help you deal something , please enter you chose : "
select chose in start stop restart status
do
case $chose in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
status
;;
*)
echo "wrong options , try again"
;;
esac
done












































原创文章,作者:hunter,如若转载,请注明出处:http://www.178linux.com/38775

(0)
hunterhunter
上一篇 2016-08-24
下一篇 2016-08-24

相关推荐

  • 系统基础之用户,组及权限管理

    用户及组详解 概论:   现今,大多数操作系统都是多用户(Multi-tasks)多任务(Mulit-Users)的系统.在多年前,计算机资源远没有现在这么丰富,都是多人使用同一台计算机,为了保障使用计算机的用户权益不受到损害,完成资源使用隔离,人们采取了用户机制标识使用者的方法.  每个使用者都是用户,用户是由UID进行标识,通过密码进…

    Linux干货 2016-08-04
  • ​grub应用之提供单独bash系统

    grub应用之提供单独bash系统     1.挂载新硬盘,并创建好三个分区,第一分区为boot分区,第三分区为根分区              2.创建挂载目录,并挂boot分区   &n…

    Linux干货 2017-01-13
  • 文本三剑客 grep sed awk

    模式,选项。常用用法。

    2017-12-03
  • linux基础之bash特性知识点

    1、 Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。     Linux 一切皆文件。个人理解 在linux下的命令操作都算是对文件操作     那么文件管理命令类命令可以分为下面几类     目录操作: &nbs…

    Linux干货 2016-09-24
  • 第五周 N21 总有刁民想害朕

    1、显示/boot/grub/grub.conf中以至少一个空白字符开头的行; egrep "^[[:space:]]+" /boot/grub/grub.conf 2、显示/etc/rc.d/rc.sysinit文件中以#开头,后面跟至少一个空白字符,而后又有至少一个非空白字符的行; egrep "^#[[:space:]]+…

    Linux干货 2016-07-16
  • Shell脚本编程之入门基础(一)

    Shell脚本编程   一、本章节一内容:    编程基础    脚本基本格式    变量    运算    条件测试   在本章节开始之前,我们先回顾下前面的知识点内容。前面学习了Linux的基础入门,了解到计算机是运行二进制指令的,而我…

    Linux干货 2016-08-12