软件包管理 — 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

相关推荐

  • LVS小记

    19.LVS小记    LVS的类型:        nat:是一种基于IP的DNAT的,通过目标端口与目标地址利用特定的算法选取出响就的主机进行响应,通过RS(Real Server)的地址和端口进行转发            特点:&n…

    2017-05-15
  • CentOS7的启动及Systemd的管理✧

    CentOS7的启动流程     POST–>Boot Sequence–>Bootloader–>kernel+initramfs(initrd)–>rootfs–>/sbin/init    &n…

    Linux干货 2016-09-21
  • linux —————-目录配配置【FHS】

    linux 目录配配置【FHS】 /根目录的意义与内容 根目录是整个系统最重要的一个目录;根目录与开机、还原、系统修复等操作有关 FHS建议标准: 根目录所在的分区应该越小越好,且应用程序所安装的软件最好不要与根目录放在同一个分区内,保持根目录越小越好 FHS定义的目录含义 /bin :系统存放执行文件的目录,但是bin比较特殊【bin放置的是在单用户维护模…

    Linux干货 2017-04-17
  • 马哥教育网络班21期-第五周课程练习

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

    Linux干货 2016-08-08
  • linux磁盘管理及其磁盘分区工具的使用

    一、 几种分区工具: 1.图形化工具gnome-disks使用简单,在此不在赘述。 2.fdisk使用: fdisk支持MBR,也支持GPT分区,对于一块硬盘最多只能理解15个分区,一般使用fdisk做MBR分区,gdisk做GPT分区。下面为fdisk分区示例: [root@centos7 ~]# fdisk /dev/sde…

    Linux干货 2016-08-29
  • 使用Storm实现实时大数据分析

    摘要:随着数据体积的越来越大,实时处理成为了许多机构需要面对的首要挑战。Shruthi Kumar和Siddharth Patankar在Dr.Dobb’s上结合了汽车超速监视,为我们演示了使用Storm进行实时大数据分析。CSDN在此编译、整理。 简单和明了,Storm让大数据分析变得轻松加愉快。 当今世界,公司的日常运营经常会生成TB级别的数据。数据来源…

    Linux干货 2015-04-04