软件包管理

软件包基础

包管理器

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

程序包管理器

debian:deb文件,dpkg包管理器
redhat:rpm文件,rpm包管理器

包命名

源代码:name-VERSION.tar.gz|bz2|xz

rpm包命名方式:name-VERSION-release.arch.rpm

包分类

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:ldd `which ls`

管理及查看本机装载的库文件
ldconfig:加载库文件
/sbin/ldconfig -p:显示本机已经缓存的所有可用库文件名及文件路径

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

包管理器

程序包管理器

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

包文件组成(每个包独有)

rpm包内的文件
rpm的元数据,如名称、版本、依赖性、描述等
安装或卸载时运行的脚本

数据库(公共):/var/lib/rpm
程序包名及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息

程序包的来源

系统发版的光盘或官方服务器

https://www.centos.org/download/
http://mirror.aliyun.com
http://mirrors.souhu.com
http://mirrors.163.com

项目官方站点

第三方组织

注意检查包的来源合法性和完整性

http://fedoraproject.org/wiki/EPEL
http://repoforge.org/
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/

自己制作

rpm

rpm包安装

rpm -i/--install [install-options] PACKAGE_FILE…

  • -v:详细显示
  • -vv:超级详细显示
  • -h:以#显示程序包管理执行进度
  • --test:测试安装,但不真正执行安装,即dry run模式
  • --nodeps:忽略依赖性关系
  • --replacepkgs:重复安装已安装过的包,文件覆盖
  • --replacefiles:将要安装包的部分文件与其他已安装的包文件冲突,可继续安装,文件不覆盖
  • --noscripts:不执行程序包脚本
    • %pre: 安装前脚本;--nopre
    • %post: 安装后脚本;--nopost
    • %preun: 卸载前脚本;--nopreun
    • %postun: 卸载后脚本;--nopostun
  • --oldpackage:已安装新版程序包,再同时安装旧版程序包
  • --force:强制安装,等同于--replacepkgs --replacefiles --oldpackage

rpm包升级

rpm -U/--upgrade:安装有旧版本的程序包,则升级,若不存在旧版程序包,则安装
rpm -F/--freshen:安装有旧版程序包,则升级,如果不存在旧版程序包,则不执行升级操作

注意

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

rpm包查询

rpm -q|--query [options]

  • a:所有包
  • -f:查看指定的文件是由哪个程序包提供(文件用路径表示)
  • -p:指定包名,配合其他选项一起用,不加-p不可直接指定包名,需要指定程序名
  • --provides:查看指定包提供了哪些CAPABILITY 也可用-a --provides 查看所有CAPABILITY
  • --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
  • --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
  • --changelog:查询rpm包的changelog
  • -c:查询程序的配置文件
  • -d:查询程序的文档
  • -i:查询程序的信息
  • -l:查看指定程序包安装后生成的所有文件
  • --scripts:查看程序包自带的脚本
  • -R:查询指定的程序包所依赖的CAPABILITY

rpm2cpio

rpm2cpio PACKAGE | cpio -itv:预览包内文件
rpm2cpio PACKAGE | cpio -idv:释放包

# 文件缺失
[root@centos7 ~]# rm -rf /etc/inittab
# 查看文件是由哪个rpm包生成的
[root@centos7 ~]# rpm -qf /etc/inittab
initscripts-9.49.41-1.el7.x86_64
# 在光盘中找到这个rpm包,并赋值到指定目录
[root@centos7 ~]# cp /media/cd1/Packages/initscripts-9.49.41-1.el7.x86_64.rpm /app
# 使用rpm2cpio进行转换,并将命令结果直接给cpio处理,这里是解包
[root@centos7 app]# rpm2cpio initscripts-9.49.41-1.el7.x86_64.rpm |cpio -id
3039 blocks
[root@centos7 app]# ll
total 444
drwxr-xr-x. 10 root root   4096 Jun  2 16:15 etc
-rw-r--r--.  1 root root 447444 Jun  2 16:11 initscripts-9.49.41-1.el7.x86_64.rpm
drwxr-xr-x.  7 root root     68 Jun  2 16:15 usr
drwxr-xr-x.  4 root root     28 Jun  2 16:15 var
# 再将缺失的文件复制到/etc/目录下即可
[root@centos7 app]# cp etc/inittab /etc/

rpm包卸载

rpm -e/-erase [OPTIONS] PACKAGE...

  • --allmatches:卸载所有版本的包
  • --nodeps:不进行依赖性关系检测
  • --noscripts:不执行脚本
  • --test:测试卸载,但不真正执行卸载,即dry run模式

rpm包校验

rpm -V|--verify

[root@centos7 ~]# rpm -V tree
S.5....T.  d /usr/share/doc/tree-1.6.0/LICENSE

S:大小改变
M:权限和类型等改变
5:MD5改变
D:设备版本号改变
L:指向路径改变
U:属主改变
G:属组改变
T:修改时间改变
P:功能改变

rpm -K/--checksig:公司通过私钥加密的rpm包,用户可以通过公钥来校验包的完整性和签名

  • --nosignature:不检查来源合法性
  • --nodigest:不检查包完整性
[root@centos7 app]# rpm -K /media/Packages/tree-1.6.0-10.el7.x86_64.rpm 
/media/Packages/tree-1.6.0-10.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

rpm -qa "gpg-pubkey*":查看公钥

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7:导入公钥

rpm数据库

/var/lib/rpm

rpm --initdb:初始化数据库,如果实现不存在,则新建,否则,不执行任何操作

rpm --rebuilddb:重建已安装的包头的数据库索引目录

yum

yum实现原理

  1. 本地主机会在配置文件里面找到yum repository的指向,并建立连接
  2. 从yum repository获取元数据文件和特征码放在缓存里面
  3. 通过查看元数据文件获知需要安装的软件包和其依赖的软件的名称并向yum repository发起请求
  4. 本地主机获取到软件包后进行安装
  5. 安装好后,rpm包会被删除,但是元数据文件和特征码会被保存下来,其目的是为了当你再向yum repository发起连接的时候,先会向yum repository获取到特征码和本地缓存的特征码做对比,如果相同则说明yum repository里面的文件没有发生改变,如果不同,则说明yum repository里面的文件发生了改变,这时候就需要重新向yum repository获取元数据文件了

通常情况下yum repository都是文件服务器,你可以通过URL进行访问,如:

ftp://path/to/repository/
http://path/to/repository/
https://path/to/repository/
file://path/to/repository/

yum配置文件

/etc/yum.conf

为所有仓库提供公共配置

cachedir=缓存目录,默认情况下在/var/cache/yum/
keepcache=是否保持缓存,0时不保存,1是保存
debuglevel=Debug信息的输出等级,范围是0-10,默认是2
logfile=存放log文件的路径
exactarch=是否精准匹配平台,默认是1,精确匹配
obsoletes=仅仅会影响升级,简单的说相当于upgrade,允许更新旧版本的rpm包
gpgcheck=是否检验安装包的来源合法性
plugins=是否允许使用插件,默认为1,表示安装
installonly_limit=允许同时保持的内核包
bugtracker_url=bug的追踪的url

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

为仓库的指向提供配置

[repositoryID]具有唯一性
name=可以重复
baseurl=可以为多个,路径下必须有repodata
enable=是否开启,1为开启,0为关闭,默认开启
gpgckeck=是否检查公钥
gpgkey=公钥
cost=超时时间
enablegroup=是否允许使用包组,默认是允许

yum的repo配置文件中可用的变量: $releasever、 $arch、$basearch、$YUM0-$YUM9

[base]
name=base
baseurl=file:///media
enable=1
gpgcheck=0

[tsinghua]
name=tsinghua
baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/$releasever/$basearch/
enabled=0
gpgcheck=0

/var/log/yum.log

yum日志

yum命令

man 5 yum.conf

查看仓库

yum repolist

  • enabled:仅显示激活的仓库,默认
  • disable:仅显示禁用的仓库
  • all:显示所有的仓库

createrepo dirname:创建yum仓库

查看仓库里面的软件包

yum list

  • all:显示所有已安装和可以安装的包,默认
  • available:显示未安装的包
  • installed:显示安装的包(@anaconda:表示操作系统预装的包、installed:表示手动安装的包、其余的表示包的来源仓库)
  • updates:显示可更新的包

安装包

yum install package1 package2 ...:安装包,可以跟-y选项,跳过交互式
yum install --downloadonly--downloaddir=/目录名 软件包名:仅下载包,不安装

yum reinstall package1 package2 ...:重新安装包,可以跟-y选项,跳过交互式

升级包

yum update package1 package2 ...:升级包,可以配合-y选项,跳过交互式

yum downgrade package1 package2 ...:升级包,可以配合-y选项,跳过交互式

yum check-update:检查可用升级

卸载包

yum remove/erase package1 package2 ...:卸载包,但不卸载安装时依赖的包,可以配合-y选项,跳过交互式

其他

yum info ...:查看包信息,和rpm -qi类似
yum provides/whatprovides feature1 feature2 ...:查看指定的特性(可以是某文件)是由哪个程序包提供

yum clean all:清空缓存
yum makecache:构建缓存

yum search string1 string2 ...:以指定的关键字搜索程序包包名及sunmary信息
yum deplist package1 package2 ...:查询指定的包依赖哪些能力及所提供的包

yum history:查看yum历史

  • info #:查看第#条yum历史详情
  • undo #:卸载第#条yum历史执行的包及其依赖包,可以配合-y选项,跳过交互式
  • redo #:重装第#条yum历史执行的包及其依赖包,可以配合-y选项,跳过交互式

yum localinstall rpmfile1 rpmfile2 ...:安装本地程序包,依赖性关系还交给yum处理,可以配合-y选项,跳过交互式
yum localupdate rpmfile1 rpmfile2 ...:更新本地程序包,依赖性关系还交给yum处理,可以配合-y选项,跳过交互式

包组相关

yum grouplist:查看当前所有包组
yum groupinfo group1 ...:查看包组信息
yum groupinstall group1 ...:安装包组
yum groupupdate group1 ...:升级包组
yum groupremove group1 ...:卸载包组

命令行选项

  • --nogpgcheck:禁止进行gpgcheck
  • -y:自动回答为“yes”,通常配合其他选项来跳过交互式
  • -q:静默模式

dnf

yum升级版,详细使用和yum类似,配置文件:/etc/dnf/dnf.conf

程序包的编译安装

我们有的时候并不能获取到相应软件的rpm包或者是原本就是没有rpm包的,但是一般项目网站都会给我们提供对应的源代码,然后我们可以使用工具进行编译安装。

安装步骤:

  1. 首次安装先查看INSTALL和README文件
  2. 运行configure脚本,生成makefile文件
    1. 通过传递参数,指定启动特性、安装路径等,执行时会参考用户指定以及Makefile.in文件(有的时候可能没有configure文件和Makefile.in文件,autoconf根据指定的配置文件可以生成configure文件,automake可以根据指定的配置文件生成Makefile.in文件),最终生成Makefile
    2. 检查依赖到的外部环境
    3. 常用选项:
    • --help:获取其他支持的使用选项
    • --prefix=/PATH/TO/SOMEWHERE:指定默认安装位置,默认为/usr/local/
    • --sysconfdir=/PATH/TO/SOMEWHERE:指定默认配置文件安装位置,默认为/usr/local
    • 如果不指定--prefix选项,安装后可执行文件默认放在/usr/local/bin,库文件默认放在/usr/local/lib,配置文件放在/usr/local/etc,其他的资源文件放在/usr/local/share。指定prefix的好处就是当你想卸载软件的时候,直接删除该安装目录就行了,也可以将整个目录拷贝到其他的机器上使用,前提是同样的操作系统
  3. make:根据生成的makefile文件,构建应用程序
  4. make install:用来安装,它从Makefile中读取指令,安装到指定的位置
  5. 安装后的配置
    1. 导入二进制程序目录至PATH环境变量中:
    • vim /etc/profile.d/NAME.sh
    • export PATH=/PATH/TO/BIN:$PATH
    • source /etc/profile.d/NAME.sh
    1. 导入库文件路径:
    • vim /etc/ld.so.conf.d/NAME.conf
    • 添加新的库文件所在目录至此文件中
    • 让系统重新生成缓存:ldconfig -v
    1. 导入头文件:ln -sv
    2. 导出帮助手册:编辑/etc/man_db.config文件,添加一个MANPATH

练习

  1. 查询命令java来自于哪个rpm包

    [root@centos7 app]# rpm -qa |grep java
    
    [root@centos7 app]# which java
    /usr/bin/java
    [root@centos7 app]# rpm -qf /usr/bin/java
    file /usr/bin/java is not owned by any packag
    [root@centos7 app]# ls /usr/bin/java -l
    lrwxrwxrwx. 1 root root 22 May 15 22:02 /usr/bin/java -> /etc/alternatives/java
    [root@centos7 app]# ll /etc/alternatives/java
    lrwxrwxrwx. 1 root root 71 May 15 22:02 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/bin/java
    [root@centos7 app]# rpm -qf /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.161-2.b14.el7.x86_64/jre/bin/java
    java-1.8.0-openjdk-headless-1.8.0.161-2.b14.el7.x86_64
    
  2. yum的配置和使用,包括yum仓库的创建

    # createrepo创建指定目录存放repodate目录
    [root@centos7 rpm]# createrepo /app/rpm/
    Spawning worker 0 with 5 pkgs
    Workers Finished
    Saving Primary metadata
    Saving file lists metadata
    Saving other metadata
    Generating sqlite DBs
    Sqlite DBs complete
    
    # 将指定目录写入repository,这样才能生效
    [root@centos7 rpm]# cat /etc/yum.repos.d/base.repo 
    [base]
    name=base
    baseurl=http://172.18.0.1/centos/$releasever/
    
    [base1]
    name=base1
    baseurl=file:///media/
    
    [base2]
    name=base2
    baseurl=file:///app/rpm/
    
    [base3]
    name=base3
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
    
  3. 在centos7上安装和使用dnf

    # rz导入本地dnf包
    # 安装本地dnf包
    [root@centos7 dnf]# yum localinstall * -y
    # 用dnf重装tree和samba并跳过交互式
    [root@centos7 dnf]# dnf reinsatll tree samba -y
    
  4. 编写系统初始化脚本reset.sh,包括别名,提示符颜色,yum仓库配置文件,安装tree,ftp,lftp,telnet等包

    #!/bin/bash
    
    # 设置别名、提示符颜色和PATH
    cat > /etc/profile.d/env.sh << EOF
    alias cdnet="cd /etc/sysconfig/network-scripts"
    alias editnet="vim /etc/sysconfig/network-scripts/ifcfg-ens33"
    export PS1="[\[\e[31m\]\u\e[0m\]@\h \W]\\$ "
    export PATH=/app/bin:$PATH
    EOF
    source /etc/profile.d/env.sh
    
    # 设置vim
    cat > ~/.vimrc << EOF
    set nu
    EOF
    source ~/.vimrc
    
    # 配置yum仓库
    cat > /etc/yum.repos.d/env.repo << EOF
    [mage]
    name=mage
    baseurl=http://172.18.0.1/centos/$releasever/
    enable=1
    
    [tsinghua]
    name=tsinghua
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/
    enabled=1
    
    [dvd]
    name=dvd
    baseurl=file:///media/
    enabled=0
    EOF
    
    # 安装常用包
    rpm -q tree &> /dev/null && echo "tree已安装" || ( yum install tree -y &> /dev/null && echo "tree安装成功" || echo "tree安装失败")
    rpm -q ftp &> /dev/null && echo "ftp已安装" || ( yum install ftp -y &> /dev/null && echo "ftp安装成功" || echo "ftp安装失败" )
    rpm -q lftp &> /dev/null && echo "lftp已安装" || ( yum install lftp -y &> /dev/null && echo "lftp安装成功" || echo "lftp安装失败" )
    rpm -q telnet &> /dev/null && echo "telnet已安装" || ( yum install telnet -y &> /dev/null && echo "telnet安装成功" || echo “telnet安装失败”)
    
    echo "初始化完成"
    
  5. 在CentOS6上编译安装apache 2.2源码包,并启动此服务

    # 服务器下载apache2.2源码包,也可以rz本地上传
    [root@centos6 ~]# lftpget ftp://172.18.0.1/pub/Sources/sources/httpd/httpd-2.2.29.tar.bz2
    # 解压源码包
    [root@centos6 ~]# tar -xvf httpd-2.2.29.tar.bz2
    # 安装Development Tools
    [root@centos6 ~]# yum groupinstall "Development Tools" -y
    # 安装第一步:./configure
    [root@centos6 ~]# ./configure --prefix=/app/apache22 --sysconfdir=/etc/apache22
    # 安装第二步:make
    [root@centos6 ~]# make
    # 安装第三步:make install
    [root@centos6 ~]# make install
    # 配置环境变量
    [root@centos6 ~]# cat /etc/profile.d/env.sh << EOF
    export PATH=/app/apache24/bin/:$PATH
    EOF
    [root@centos6 ~]# source /etc/profile.d/env.sh
    # 启动服务并关闭防火墙
    [root@centos6 ~]# apachectl start
    [root@centos6 ~]# iptables -F
    
  6. 在CentOS7上编译安装apache 2.4源码包,并启动此服务

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,012评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,589评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,819评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,652评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,954评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,381评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,687评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,404评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,082评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,355评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,880评论 1 255
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,249评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,864评论 3 232
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,007评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,760评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,394评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,281评论 2 259

推荐阅读更多精彩内容

  • 各大Linux发行版软件包管理参考(http://www.freeoa.net/osuport/botinstal...
    IRONYT阅读 7,153评论 0 12
  • RPM包管理器 二进制应用程序的组成部分:二进制文件、库文件、配置文件、帮助文件 包命名: 库文件: 管理及查看本...
    JevonWei阅读 215评论 0 0
  • 第一节 软件包管理简介 1.软件包分类 1)源码包 脚本安装包 2)二进制包 系统默认包,对于redhat系列是r...
    littlexjing阅读 438评论 0 0
  • RPM/DPKG 两大阵营简介在 GNU/Linux( 以下简称 Linux) 操作系统中,RPM 和 DPKG ...
    空语阅读 1,335评论 0 4
  • 最近看了一本书,.《一个陌生女人的来信》静静的看着一个人,看着他的喜怒哀乐,他的一颦一笑,看到他同别的卖弄风骚的女...
    冰箱里的苹果汁阅读 235评论 0 0