Linux 第16天自习 程序包管理

时间: 20180802


目录

Linux程序包管理

rpm包管理工具使用

yum在线包管理工具

源码编译安装程序



Linux程序包管理

linux上的大部分软件是开源的,所以他们的源码都是公开的,可以自由获取并安装至自己的

linux系统上,但是对于大部分用户而言,配置源码安装程序包实属不易,并还需要安装编译

环境,因此发行版的厂商将这些开源的软件在自己公司内部将其开源的软件包在各个硬件平台

上编译使其形成二进制文件,并打包好此时用户只需要获取到此安装包并一键执行安装即可。


此时又形成了一个新问题,虽然已经解决了安装,但是如果用户想要卸载软件又是个问题,

Linux安装软件会形成很多文件,而且其配置文件和安装目录可能不在同一个文件夹下,此时

如果用户对此软件不了解卸载此软件也会非常令人头痛。如果有一个和windows一样的软件,

即程序软件安装管理组件,这样用户卸载或安装软件就会方便很多,这便是linux制作出rpm, 

dpkg等程序包管理组件的原因,程序包管理软件其实是在每次安装或卸载程序时都有一个数据

库用来记录程序包安装的位置和所生成的文件等,以备用户以后卸载删除等。


现在包管理方便了,但是linux还有一个问题,linux软件和window软件安装有一个非常大

的区别,便是解决依赖关系。linux软件安装时可能会需求其它软件包安装后才能安装此程序。

rpm或dpkg虽然可以解决安装程序问题,也可以提示出需要依赖其它程序包的安装,但不会主

动去安装所依赖的程序包。 因为一般都是安装本地所下载的程序包,如果此程序依赖其它程序

包,则用户还需要去网上再下载,操作比较繁琐。 由此便产生了yum, apt等在线软件安装程序

管理工具。此类工具可以提供在线安装所指定的程序包,并会主动下载和安装所依赖的包。

rpm包管理工具使用

安装

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

-h 以#来表示安装进程

-v verbose 显示安装过程

-vv

-vvv

--test 不执行真正的安装过程,仅报告依赖关系及冲突信息等

--nodeps 忽略依赖关系,副作用是能安装成功,可能无法运行成功

--replacepkgs 覆盖安装,重新安装并覆盖原有的文件

--force 强制安装


安装时常用的组合-ivh -ivvh


升级

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

-U 升级或安装

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

-F 升级,即当前程序已经在此机器上有并已经安装过,并还是一个旧版本


组合使用 -Uvh, -Fvh

-h 以#来表示安装进程

-v verbose 显示安装过程

-vv

-vvv

--test 不执行真正的安装过程,仅报告依赖关系及冲突信息等

--nodeps 忽略依赖关系,副作用是能安装成功,可能无法运行成功

--oldpackage 降级到旧版本


注意:一定不要对内核执行升级,linux允许多内核共存,所以可以直接安装多个

不同版本内核

如果程序包的配置文件安装后曾被修改,升级时新版本的文件不会覆盖老版本的

配置,而把新版本的文件重命名如加后缀.rpmnew后保存


卸载

rpm {-e|--erase} [--allmatches] [--nodeps] [--test] PACKAGE_NAME ...

简单用法rpm -e PKG_name

--nodeps 忽略依赖关系,此程序可能被其它程序依赖,卸载有可能会导致

其它程序无法正常运行

--test 测试卸载

--allmatches 一个程序包同时安装多个版本,则此选项一次全部卸载


注意:如果程序包的配置文件安装后曾被修改,卸载时此文件通常不会被删除,而是

被命名加后缀.rpmsave后留存。


查询

查询某包是否已经安装,检查安装的所有包,和包的详细信息,或查询某命令由哪个

程序包生成等

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

[select-options]

-qa 查询所有已经安装的程序包

-q 查询程序包是否安装

-qf 查询文件是由哪个包安装生成

-qpi 查询尚未安装的包的相关信息

[query-options]

-qi 查询某包说明信息

-ql 列出安装包所生成的文件列表

-qc 列出安装包所生成的配置文件

-qd 列出安装包的所生成的帮助文件、

-q --changelog 查看程序包制作时随版本变化的changelog信息

-q --provides 列出程序包所提供的capabilities

-q --requires 列出程序包所依赖的capabilities

-q --scripts 列出程序包安装卸载时所执行的脚本

脚本有四类

preinstall 安装之前执行的脚本

postinstall 安装之后执行的脚本

preuninstall 卸载之前执行的脚本

postuninstall 卸载之后执行的脚本


校验

查询包安装之后生成的文件是否发生了改变

rpm {-V|--verify} [select-options] [verify-options]

常用用法 rpm -V PKG_name


当没有输出结果时表示软件包完整OK,当有相应的结果输出表明对应的内容有修改

具体如下:

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



yum在线包管理工具

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


yum 仓库管理

yum repolist 列出已经配置的所有可用仓库

yum repolist [all|enable|disabled]


yum 缓存管理

yum clean 清理缓存

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

yum makecache 缓存创建,自动连接至每一个可用仓库,下载其元数据,将其创

  建为缓存


程序包查看

yum list [all|glob_exp1|glob_exp2][...]

yum list {available|updates|installed|extras|obsoletes} [glob_exp1].

yum grouplist [hidden] [groupwildcard] [...]


程序包安装

yum install package1 pkg2...

注意:  只需要提供包名

如果某包有在不同的仓库中有多个不同版本,默认会安装最新版本

如果要安装指定版本 install pkag-version


重新安装(覆盖安装)

yum reinstall package1 pkg...


程序包升级

yum update [package1] pkgs...


程序包降级

yum downgrade pkag1...


检查有哪些升级可用

yum check-update


程序包卸载

yum remov|erase package1 ...

注意: 所有依赖于正卸载的程序包的程序包会被一并卸载


查询

程序包简要信息yum info pkge...

搜索程序包 yum search pkge...

查询指定文件由哪个程序包安装生成: provides|whatprovides /path/file


安装或升级本地的程序包文件

yum localinstall rpmfile1 ...

yum localupdate rpmfile1 ...

此种安装方式可以解决本地的rpm所依赖的程序包无须手动安装


包组管理

列出所有包组 yum grouplist

安装包组 yum groupinstall group1 ...

卸载 yum groupremove group1 ...

升级 yum groupupdate group1...

查看组里的包 yum group info grou1...

也可以使用install, remove或update来管理包组,此时需要在组名前加@符号,

如yum install @"Server Platform Development"


yum命令的可用选项

-y 自动回答yes

--disablerepo= 临时禁用在配置文件中配置并启用的某个repository

--enablerepo 临时启用指定的某repository

--nogpgcheck 禁止做包校验


yum的一些内置变量

$releaseever 当前OS发行版的主版本号

如CentOS 6.6 x86_64 主版本号为6

$arch 平台 i386 i486

$basearch 基础平台 


制作本地yum源仓库

需要用到createrepo程序 这里不再详述



源码编译安装程序

源码编译安装需要依赖环境支持,即编译开发工具、以及各个被依赖到的程序包的开发组件

另外还需要通过订制的编译参数来进行编译安装


1. 安装编译开发工具(包组有)

Development tools

Server Platform Development

Desktop Platform Development

Debug Tools

2. 被依赖的程序包的开发组件

1) 编译安装被依赖的程序

2) 安装相关程序的名称中包含devel的子包


源码程序中会将程序分开保存在多个文件夹中,文件间或许存在依赖关系,因此编译

时可能需要按特定次序进行编译,此时,一般会使用项目管理工具(也称为GNU make

)对其进行管理: 构建工具会调用合适的编译器,并根据配置文件makefile中定义的

次序对源代码文件进行编译。需要注意的是:

1)每个项目的程序员开发完成某版本之后,会使用autoconf为程序代码生成一

个脚本文件configure, 其功用: 此脚本会收集当前系统上的开发环境中所依赖

各组件的版本、特性等,并检查所依赖的环境是否能满足,最后会根据Makefile

.in 文件生成一个makefile文件

2)每个项目的程序员开发完成某版本之后,会使用automake为程序代码生成一

个makefile模板文件,即Makefile.in


编译人员的编译安装过程如下

1) 运行configure脚本

configure脚本的选项

--help 查看帮助信息

--prefix 指定默认的安装路径

--sysconfdir 指定配置文件安装路径

--with-CAPABILITY 依赖的程序包

--without-CAPABILITY

--enable-FEATURE 启用某个特性

--disable-FEATURE 禁用某个特性

2) 运行make 完成项目构建

3) 运行make install 完成安装


3. 程序运行的环境

配置环境变量使其执行时不需要输入很长的路径去执行该程序

export PATH=extra_path:$PATH 保存于/etc/profile.d/*.sh


配置库文件使系统可以查找到此程序的库文件

1) 可以编辑/etc/ld.so.conf.d/*.conf文件, 添加新库文件搜索路径至

   此文件中,每行一个

2) 执行ldconfig命令,重新生成库映射缓存 ld.so.conf

ldconfig 命令用于生成/etc/ld.so.cache

-p 打印当前程序ld.so.cache中已经缓存的所有库文件目录及

   库文件映射列表

-v 显示命令执行过程的详细信息


配置头文件信息方法

1) 复制所有新生成的头文件至/usr/include目录中

2) 创建软链接 (以apache为例)

ln -sv /usr/local/apache/include /usr/include/httpd

ln -sv /usr/local/apache/include/* /usr/include/


配置man手册文件,使man 可以读取其配置文件

修改man的配置文件/etc/man.config /etc/man_db.conf

使用MANPATH MANPATH_MAP指令指向路径,来让其识别新的帮助信息


注意

如果安装的程序是服务类程序,服务脚本文件编译安装不会有

尽量安装编译程序包至一个专用路径下,卸载时删除此目录即可

其它程序语言开发的源码包,编译安装方式可能会有所不同

可以通过查看程序包中自带的安装信息如INSTALL, README之类的文件

来获取安装帮助信息例如 perl python ruby java