软件包管理

RPM包管理器

二进制应用程序的组成部分:二进制文件、库文件、配置文件、帮助文件

  • 包命名:
源代码: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
包:分类和拆包
    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
    which cp 
    ldd /bin/cp 

管理及查看本机装载的库文件

     ldconfig 读取/etc/ld.so.conf.d下的所有库文件
    /sbin/ldconfig -p:  显示本机已经缓存的所有可用库文件名及文件路径映射关系

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

  • 包管理器:

程序包管理器:

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

1. 包文件组成 ( 每个包独有)
    RPM 包内的文件
    RPM 的元数据,如名称,版本,依赖性,描述等
    安装或卸载时运行的脚本
2. 数据库( 公共) :/var/lib/rpm
    程序包名称及版本
    依赖关系
    功能说明
    包安装后生成的各文件路径及校验码信息
  • 程序包的来源:

管理程序包的方式:

使用包管理器: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系统上使用rpm 命令管理程序包:

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

安装:
rpm {-i|--install} [install-options] PACKAGE_FILE…
    -i :安装
    -v: verbose   显示详细信息
    -vv:  显示更多的信息
    -h:  以#显示程序包管理执行进度
rpm -ivh PACKAGE_FILE ... 
rpm -ivh dhcp-4.2.5-47.el7.centos.x86_64.rpm    安装dhcp包
rpm -e dhcpd   卸载dhcpd包
  • rpm包安装:
[install-options]
    --test:  测试安装,但不真正 执行安装,即dry run 模式
    --nodeps :忽略依赖关系
    --replacepkgs  重新安装整个包
        eg:rpm -ivh /mnt/Packages/tree-1.6.0-10.e17.x86_64.rpm --replacepkgs
    --replacefiles  重新安装某个指定文件
    --nosignature:  不检查来源合法性
    --nodigest :不检查包完整性
    --noscripts :不执行程序包脚本
        %pre: ; 安装前脚本; --nopre
        %post: ; 安装后脚本; --nopost
        %preun: ; 卸载前脚本; --nopreun
        %postun:  卸载后脚本; --nopostun
  • rpm包升级:

升级:升级程序时会将原来的旧程序删除,减少升级内核

rpm {-U|--upgrade} [install-options]  PACKAGE_FILE ...
rpm {-F|--freshen} [install-options]  PACKAGE_FILE ...
    U/upgrade :安装有旧版程序包,则“升级”
如果不存在旧版程序包,则“安装”
    F/freshen :安装有旧版程序包,则“升级”
如果不存在旧版程序包,则不执行升级操作
    rpm -Uvh PACKAGE_FILE ...
    rpm -Fvh PACKAGE_FILE ...
    --oldpackage :降级安装,安装比当前版本低的程序
    --force: 强制安装,不用于卸载


升级注意项:

注意:
(1) 不要对内核做升级操作;Linux 支持多内核版本并存,因此,对直接安装新版本内核;
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew) 后保留包查询:

  • 包查询:
rpm {-q|--query} [select-options] [query-options]
    -q:查询安装过的软件包
[select-options]
    -a:所有包
    -f:查看指定的文件由哪个程序包安装生成
    -p rpmfile :针对尚未安装的程序包文件做查询操作
    --whatprovides CAPABILITY :查询指定的 CAPABILITY(能力)由哪个包所提供
    --whatrequires CAPABILITY :查询指定的 CAPABILITY被哪个包所依赖
    --provides:  列出指定程序包所提供的CAPABILITY,即查询程序包所具有的功能
    -R:  查询指定的程序包所依赖的CAPABILITY,查询包依赖的能力

[query-options]
    --changelog :查询rpm包的修改历史记录,查询的是数据库/var/lib/rpm
    -c:  查询程序的配置文件
    -d:  查询程序的文档
    -i: 查询详细信息
    -p:查询或验证包文件
    -l:  查看指定的程序包安装后生成的文件列表
    --scripts :程序包自带的脚本    
    rpm -q --scripts bahs   查看bash包的自带的脚本
    --provides:  列出指定程序包所提供的CAPABILITY,即查询程序包所具有的功能
    -R:  查询指定的程序包所依赖的CAPABILITY,查询包依赖的能力

常用查询用法:
    -qi PACKAGE    查询包的描述信息   rpm -qi tree   查询tree包的信息
    -ql:查看指定程序包安装后生成的文件列表   rpm -ql tree   查询tree包安装后的文件列表
    -qf FILE  查询文件属于哪个安装包      rpm -qf /usr/bin/rpm  查询/usr/bin/rpm文件属于哪个包
    -qc PACKAGE    rpm -qc bash   查询bash程序的配置文件
    -qd PACKAGE   rpm -qd bash   查询bash程序的目录文件
    -qpi PACKAGE_FILE  rpm -qpi /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm   查询包文件的详细信息
    -qpl PACKAGE_FILE   rpm -qpl /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm 查询未安装包文件的文件列表
    -qa:查询安装的所有程序包 

rpm2cpio  包文件|cpio –itv 预览包内文件
rpm2cpio  包文件|cpio –id “*.conf”









  • 包卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
    --nodeps  忽略依赖  
    --noscripts   卸载时不运行脚本
    --notriggers   不允许触发器 
    --allmatches  多个相同的包全部卸载   rpm -e --allmatches kernel  卸载同为kernel的多个包
    --test 测试
  • 包校验:
rpm {-V|--verify} [select-options] [verify-options]   
    rpm -V tree   查询tree程序包文件属性是否发生变化
    rpm -Va        查询所有包属性是否发生变化
        S  file Size differs    文件大小发生变化
        M Mode differs (includes permissions and file type)
        5 digest (formerly MD5 sum) differs    MD5值变化,表示内容发生变化
        D Device major/minor number mismatch
        L readLink(2) path mismatch
        U User ownership differs
        G Group ownership differs
        T mTime differs     mtime发生变化
        P capabilities differ

包来源合法性验正及完整性验正

完整性验证:SHA256
来源合法性验正:RSA

公钥加密

对称加密:加密、解密使用同一密钥
非对称加密:密钥是成对儿的

public key: 公钥,公开所有人
secret key: 私钥, 不能公开

导入所需要公钥

rpm -K|checksig rpmfile 检查包的完整性和签名
rpm --import / etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7    导入所需秘钥,/etc/pki/rpm-gpg目录下有公钥文件 
CentOS 7 发行版光盘提供公钥: RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*“  查询安装秘钥文件
rpm -qi gpg-pubkey-352c64e5-52ae6884  查看秘钥的详细信息
秘钥卸载后,rpm -K 完整性为not OK, rpm --import 导入秘钥后,rpm -K 完整性就为OK 

yum

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

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

文件服务器:
    http://
    https://
    ftp://
    file://
  • yum配置文件

yum客户端配置文件:

/etc/yum.conf :为所有仓库提供公共配置
/etc/yum.repos.d/*.repo :为仓库的指向提供配置
/var/log/yum.log       yum安装日志文件
仓库指向的定义:
    [repositoryID]  repo名称
    name=Some name for this repository    描述信息
    baseurl=url://path/to/repository/             yum安装源
    enabled={1|0}         0表示临时禁用该仓库,1表示yum仓库
    gpgcheck={1|0}       0为不检查秘钥     1表示检查秘钥 
    gpgkey=URL    秘钥导入,URL为秘钥路径,若已导入秘钥可省略
    enablegroups={1|0}     1 启用包组    0禁用包组
    failovermethod={roundrobin|priority}    安装源为多个路径时,选择策略
        roundrobin:意为随机挑选,默认值
        priority: 按顺序访问
    cost= 默认为1000      设置优先值,cost值越小,越优先
server.repo仓库文件中可编辑多个仓库

  • yum仓库

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

$releasever:  当前OS的发行版的主版本号
$arch: 平台,i386,i486,i586,x86_64等 等
$basearch :基础平台;i386, x86_64
$YUM0-$YUM9: 自定义变量

实例:

http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i384

yum源:repodate目录的父目录作为yum的安装源
阿里云repo 文件:

http://mirrors.aliyun.com/repo/

CentOS 系统yum源

阿里云:
https://mirrors.aliyun.com/centos/$releasever/os/x86_64/

教学环境:

http://172.16.0.1/cobbler/ks_mirror/$releasever/

Epel的yum 源:
阿里云:

https://mirrors.aliyun.com/epel/$releasever/x86_64

教学环境:

http://172.16.0.1/fedora-epel/$releasever/x86_64/
  • yum-config-manager 命令生成yum库文件

生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo

yum-config-manager --add-repo=http://172.16.0.1/cobbler/ks_mirror/7/

  yum-config-manager --disable “ 仓库名"     禁用仓库
  yum-config-manager --enable “ 仓库名”      启用仓库
  • yum命令

yum 命令的用法:
yum [options] [command] [package ...]

   显示仓库列表:
    yum repolist [all|enabled|disabled]
    yum repolist all   显示所有repo仓库,包括禁用的
显示程序包:
    yum list
    yum list [all | glob_exp1] [glob_exp2] [...]
    yum list {available|installed|updates} [glob_exp1][...]
        available  可用的包,没有安装的包
        installed  已安装的包
        updates  有更新的包
安装程序包:
    yum install package1 [package2] [...]
    yum reinstall package1 [package2] [...] (重新安装)
    yum reinstall tree lrzsz  重新安装程序
升级程序包:
    yum update 升级所有的包
    yum update [package1] [package2] [...]
    yum downgrade package1 [package2] [...] ( 降级)
检查可用升级:
    yum check-update
卸载程序包:
    yum remove | erase package1 [package2] [...]、
    yum remove tree  卸载tree程序
查看程序包详细信息: :
    yum info [...]
    yum info tree
查看指定的特性( 可以是某文件) 是由哪个程序包所提供:
    yum provides | whatprovides feature1 [feature2][...]
    yum provides tree      查看tree是由哪个包提供
    yum whatprovides tree    
清理本地缓存:
    清除/var/cache/yum/$basearch/$releasever 缓存
    yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
    yum clean all   清除所有缓存数据
构建缓存:
    yum makecache
搜索:yum search string1 [string2] [...]以指定的关键字搜索程序包名及summary 信息
    yum search http   搜索http的程序包
查看指定包所依赖的capabilities:
    yum deplist package1 [package2] [...]
查看yum事务历史:
    yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|
                               rollback|new|sync|stats]
    yum history   列出yum安装的历史
    yum history info 6   查看yum安装历史中序号为6的详细信息
    yum history undo 6   卸载yum安装历史中序号为6的安装的所有程序
    yum history redo 6   重新安装序号为6的操作,即重新安装序号为6的程序   
  • 日志 :/var/log/yum.log

  • 元数据:/var/lib/yum

  • 安装及升级本地程序包:

yum localinstall rpmfile1 [rpmfile2] [...]    ( 用install 替代)
yum localupdate rpmfile1 [rpmfile2] [...]   ( 用update 替代)
  • 包组管理的相关命令:
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]
yum groups list   查看所有包组的名称 
yum groupinfo "Development Tools"   查看Development Tools软件包的详细信息
yum groupinstall "Development Tools"   安装程序包组
yum groupremove "Development Tools"   卸载程序包组
  • yum 的命令行选项:
    --nogpgcheck :禁止进行gpg check,不检查秘钥
    -y: 自动回答为“yes”
    -q :静默模式
    --disablerepo=repoidglob :临时禁用此处指定的repo
    --enablerepo=repoidglob :临时启用此处指定的repo
    --noplugins:禁用所有插件
  • 系统光盘yum仓库:

系统安装光盘作为本地yum 仓库:

1. 挂载光盘至某目录,例如/media/cdrom    
# mount /dev/cdrom /mnt
2. 创建配置文件
    (a) [CentOS7]
        name=danran
        baseurl=file:///mnt
        gpgcheck=0
        enabled=1
    (b)使用版本变量$releasever替换
        [ftp]
        name=danrna
        baseurl=ftp://192.168.198.134/pub/$releasever
        enabled=0

创建yum 仓库:
    createrepo [options] <directory>

程序包编译

程序包编译安装

Application-VERSION-release.src.rpm --> 安装后,使用rpmbuild 命令制作成二进制格式的rpm 包,而后再安装
源代码--> 预处理--> 编译--> 汇编--> 链接--> 执行
源代码组织格式:

多文件:文件中的代码之间,很可能存在跨文件依赖关系
C 、C++ :make项目管理器

configure --> Makefile.in --> makefile

java: maven

  • 编译安装:
C 语言源代码编译安装三步骤:
    1、 ./configure
        a、 通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定以及makefile.in 文件生成makefile
        b、 检查依赖到的外部环境,如依赖的软件包   
    2、 make 根据makefile 文件,构建应用程序
    3、make install 复制文件到相应路径
开发工具:
    autoconf:  生成configure 脚本
    automake :生成Makefile.in
注意:安装前查看INSTALL ,README
开源程序源代码的获取:
    官方自建站点:
        apache.org (ASF :Apache Software Foundation)
     mariadb.org
        ...
    代码托管:
        SourceForge.net
        Github.com
        code.google.com
  • c/c++ 编译器: gcc (GNU C Complier)

编译C 源代码:

准备:提供开发工具及开发环境

开发工具:make, gcc等
开发环境:开发库,头文件

glibc :标准库

实现:通过“包组”提供开发组件

Development Tools
Server Platform Development

第一步:configure 脚本
    选项:指定安装位置、指定启用的特性
        --help:  获取其支持使用的选项
    选项分类:
        安装路径设定:
            --prefix=/PATH:  指定默认安装位置, 默认为/usr/local/
            --sysconfdir=/PATH :配置文件安装位置
            System types:
            Optional Features:  可选特性
                --disable-FEATURE
                --enable-FEATURE[=ARG]
            Optional Packages:  可选包
                --with-PACKAGE[=ARG], 依赖包
                --without-PACKAGE, 禁用依赖关系
第二步:make
第三步:make install
安装后的配置:
    1、二进制程序目录导入至PATH 环境变量中
        编辑文件/etc/profile.d/NAME.sh
            export PATH=/PATH/TO/BIN:$PATH
    2、导入库文件路径
        编辑/etc/ld.so.conf.d/NAME.conf
            添加新的库文件所在目录至此文件中
        让系统重新生成缓存:
            ldconfig [-v]
    3、导入头文件
        基于链接的方式实现:
            ln -sv
    4、导入帮助手册
        编辑/etc/man.config|man_db.conf 文件
        添加一个MANPATH
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容

  • 目录:软件运行环境介绍包管理器rpm 包管理器的使用yum rpm包管理器前端工具的使用编译安装 一、软件运行环境...
    哈喽别样阅读 544评论 0 0
  • 各大Linux发行版软件包管理参考(http://www.freeoa.net/osuport/botinstal...
    IRONYT阅读 7,160评论 0 12
  • RPM/DPKG 两大阵营简介在 GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和 DPKG ...
    空语阅读 1,337评论 0 4
  • 在 Linux(GNU/Linux)操作系统中,RPM 和 DPKG 为最常见的两类软件包管理工具,他们分别应用于...
    geekdeedy阅读 605评论 0 0
  • 第一节 软件包管理简介 1.软件包分类 1)源码包 脚本安装包 2)二进制包 系统默认包,对于redhat系列是r...
    littlexjing阅读 439评论 0 0