Skip to content

Latest commit

 

History

History
364 lines (199 loc) · 16.2 KB

2.9_20170306_linux程序包管理.md

File metadata and controls

364 lines (199 loc) · 16.2 KB

Linux程序包管理

一个软件包的组成

一个软件包由二进制文件、自身库文件和配置文件、帮助文件等组成,软件包中最重要的就是二进制程序。

  • 二进制程序:二进制程序可以在/bin、/sbin、/usr/{bin|sbin}、/usr/local/{bin|sbin},也可以自定义二进制程序的位置,在自定义的目录下会生成bin和sbin等目录。

    要运行自定义位置上的程序可以使用绝对路径,可也是在环境变量中添加程序所在的目录

  • 库文件:库文件可以在/lib、/lib64、/usr/{lib|lib64}、/usr/local/{lib|lib64},库也可以安装在特定目录中。

    操作系统查找库时会在特定路径下查找,系统默认查找的库文件的配置文件在/etc/ld.so.conf。

    指定自定义程序的库文件时,建议在系统默认的库文件查找配置文件下为每一个自定义程序建立一个配置文件/etc/ld.so.conf/*.conf

    ldd可以查看应用程序所依赖的共享库,使用格式是ldd 二进制文件,二进制文件可是使用命令引用`which 命令`

  • 配置文件:程序的配置文件一般在/etc目录下或者是特定目录中的etc目录下

  • 帮助文件:帮助文件有不同的类型,如man文件、info文件、README等。

    man文件通常在/usr/share/man/,自定义man文件同样需要单独配置以确保系统可以查找到,mand的查找路径在配置文件/etc/man.config中,也可以使用man的-m选项,加上自定义文件的man路径,但这种方法只针对单次操作。

应用程序管理器

安装一个应用程序可以使用源码编译安装,也可以应用程序管理器安装。

在使用安装软件时,为了系统安全,要进行来源合法性验证:

  • 对源程序要通过md5或sha1校验码验证
  • 对软件包要使用发行商提供的软件包

应用程序管理器可以便捷的管理软件包在文件系统中的各种文件。应用程序管理器维护一个数据库,并提供程序组成格式。一个应用程序管理器至少具有两种功能:

  • 数据库记录了安装的应用程序的软件名和版本、安装生成的各文件路径和校验码、依赖关系、功能性说明
  • 应用程序的组成格式有文件清单和安装卸载运行的脚本

在计算机领域有一个理念:不要重复造轮子,所以在linux中,如果其他的软件包提供了相关的功能,那么自己的软件包就无需在开发相关的功能。各种软件之间就存在了依赖关系,依赖关系有两种,一个是循环依赖,一个是版本依赖。

软件有版本号,GNU风格的版本号命名格式是:主版本号.次版本号[.修正版本号[.编译版本号]]。一个完整的程序包名就是软件包名-版本号。

在Debian中使用的deb格式的程序包,使用dpkg管理应用程序;Redhat中,使用rpm格式的程序包,用rpm管理应用程序,rpm也是linux程序包标准管理工具。

一个包管理器具有制作和安装程序包、查询和升级程序包、校验和卸载程序包以及数据库管理功能。

但是包管理器不能自动解决软件包的依赖关系,只能用户手动安装需要的其他软件包,为了解决依赖关系,出现了软件包的前端管理器,前端管理器可以自动解决依赖关系并安装,比较著名的前端管理器有apt-get、yum和dnf。

RPM的使用

RPM包分为源码包和二进制程序包,源码包的命名格式是:NAME-version.tar.{gz|bz|xz},version遵循GNU风格的版本命名格式;

二进制程序包的命名格式是:NAME-verison-release.arch.rpm,release通常包含了rpm的制作发行号和适用于的OS,如2.el6中,2表示这是该软件包的第二个版本,el6表示适用于Redhat Enterprise Linux 6,arch表示此程序包使用的CPU架构,一般有x86_64、i386/i586/i686(x86平台32位)、ppc(powerPC)、noarch。也有一些软件没有release和arch,代表了是一个通用的软件包。

一个源码包有10个功能,大部分用户只使用6个,那剩余4个功能如何处理呢,分包将一个大的应用程序打包制作成多个包,子包的名称会跟在核心包名(主包名)的后面,例如主包为bind,子包为bind-devel、bind-libs、bind-utils。

RPM验证包的完整性通过校验码验证,验证来源合法性使用开发者得公钥验证,实际上需要使用证书。

RPM包可以通过发行商的光盘、可信的第三方网站、EPEL来获得。

当发行光盘中的包需要升级时,官方会释出升级包,可信的第三方网站如rpmfind.net、rpm.pbone.net

EPEL是由Fedora维护的一个软件源,里面包含了各种发行版和许多基本源没有的软件包。

当官方有软件包或者升级包,仍然要优先考虑官方软件包

RPM包安装-i

使用RPM安装软件包使用rpm {-i|--install} /path/to/rpm_package package2 …,软件包也可以通过下载获得,使用wget 要下载的软件包链接地址,rpm会先下载软件包,然后进行安装。

-v:显示安装的详细信息,可以使用多个v,v的数量越多提供的信息就越详细
-h:显示安装进度,以#显示
--test:放在包名后,用来测试软件包是否可以安装,仅测试不执行安装
--replacepkgs:放在包名后,重新安装软件包,优秀的软件包在重新安装是不会覆盖原有的配置文件,新配置文件会被重命名

安装时如果存在依赖关系,要先解决依赖关系,也可以忽略依赖关系,忽略依赖关系使用选项—nodeps。

RPM包卸载-e

卸载只需要指定包名,rpm {-e|-erase} PACKAGE_NAME

如果卸载被其他程序说依赖程序的包,一可以把依赖者一同卸载,二可以忽略依赖关系(--nodeps),也可以放弃卸载

RPM包查询-q

查询所有已安装包:rpm -qa [文件名通配]或使用管道结合grep使用

查询某个包是否安装:rpm -q PACKAGE_NAME

查询包的描述信息:rpm -qi PACKAGE_NAME

查询包安装后在当前系统生成的文件列表rpm -ql PACKAGE_NAME

查询某文件时哪个包生成的:rpm -qf /path/to/somefile

查询某包安装后生成的帮助文档:rpm -qd package_name

查询包安装后生成的配置文件:rpm -qc package_name

查询包相关的脚本:rpm -q --scripts package_name,脚步有四类:安装前脚本preinstall、安装后脚本postinstall、卸载前脚本preuninstall、卸载后脚本postuninstall

查询安装后可能生成的文件列表:rpm -qpl /path/to/package_file

查询某尚未安装包的简单描述信息:rpm -qpi /path/to/package_file

RPM包升级

RPM包升级使用-U或-F选项,-U表示升级或安装;-F仅用于升级,通常和-vh一同使用用来显示信息和安装进度

一般使用格式为rpm {-Uvh|-Fvh} /path/to/package_file

使用--nodeps忽略包依赖关系

使用--force强行安装

注意:不要对内核执行升级操作,多版本内核可以并存,因此建议执行安装操作

RPM包校验

包校验用来检查包安装后生成的文件是否被修改过,一般使用格式rpm -V 应用程序名

RPM包校验来源合法性和软件包完整性

包完整性通过单向加密机制,通常是md5或sha1

来源合法性通过公钥加密机制,算法通常使用的是RSA

使用rpm -K /path/to/package_file,检查前要导入制作者的公钥,CentOS发行版的公钥在iso文件中

导入命令使用rpm --import /path/to/key_file

RPM数据库重建

RPM的数据库在/var/lib/rpm,使用rpm --initdb初始化或rpm --rebuilddb重建,重建数据库会覆盖原有的数据库

YUM的使用

YUM是RPM程序包管理器的前端工具,可以自动解决软件包的依赖关系,程序包管理器的前端工具并不能取代包管理器,只作为包管理器的补充,实际运行依然要依赖包管理器。

yum有一个文件服务器,能够通过yum所支持的文件共享机制将各rpm包通过文件服务共享,本质上用来共享rpm包,这个文件服务器所输出的路径提供给yum作为后端支持,这个后端支持我们称为yum的repository(仓库)。

repository包含了各rpm包、依赖关系和程序包安装后所能够生成文件等元数据文件

yum客户端的工作流程

  1. 用配置文件指定各可用yum仓库;
  2. yum客户端会到各可用yum仓库获取元数据,并缓存至本地;
  3. yum客户端会分析元数据,根据具体的操作请求分析元数据,可能包括检查依赖关系、文件列表信息
  4. 根据元数据分析结果执行具体操作

客户端配置文件指定对应服务器访问方式,可以使用ftp、http、file等协议

ftp:ftp://server/path/to/repo
http:http://server/path/to/repo
file:file:///path/to/repo

安装和卸载程序包要依赖yum仓库,所以只需要指定yum仓库,不需要指定本地软件路径。

要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中。

yum的配置文件在/etc/yum.conf,在本地可以指定多个仓库,还可以指定各仓库的优先级,关于仓库的配置在/etc/yum.repos.d/*.repo,一个仓库可以是一个repo文件,也可以多个仓库使用一个repo文件。

在CentOS6中,配置文件有两部分组成, 第一部分是全局段也叫主段[main],第二部分是是仓库段[repo]

主配置段main:

yummain

仓库配置段repo:

[repo_ID]
name=String
baseurl=仓库的访问路径
enabled={0|1}没有指定enabled默认启用,0表示禁用
gpgcheck={0|1}是否检查包来源合法性和完整性
gpgkey=公钥文件路径(本地或服务器路径)
cost=定义此仓库开销,默认1000,越小越优先

yumrepo

添加一个yum仓库:

自定义repo

需要注意的是配置仓库要匹配系统版本,使用uname -a查看内核版本�,使用cat /etc/system-release查看系统发行版版本

yum获取仓库的元数据后,会缓存到本地/var/cache/yum下,缓存到本地会加速执行过程,但当yum仓库发生变化时,本地的缓存就应该随之更新,yum会通过md5自行检测是否一致(repodata/repomd.xml)

清除yum的缓存使用yum clean all,创建缓存使用yum makecache

yum配置文件中的宏

通过yum的宏就可以使用一个配置文件用于多个不同的系统,baseurl=http://mirrors.sohu.com/fedora-epel/**\$releasever/\$basearch/**

  • $releasever:程序的版本,对yum而言指的是redhat-release版本; 只替换主版本号,如redhat7.2,替换为redhat7
  • $arch:系统架构
  • $basearch:基本架构
  • $YUM0-9:在系统中定义的环境变量,可以在yum中使用

例如:获取当前系统相应宏替换结果:

python
import yum,pprint
yb=yum.YumBase()
pprint.pprint(yb.conf.yumvar,width=1)
{'arch': 'ia32e',
 'basearch': 'x86_64',
 'infra': 'stock',
 'releasever': '7',
 'uuid': 'ca410686-8b8e-43ec-95a9-b6bab8080dcf'}

yum客户端的命令

yum repolist [all|enabled]:列出所有可用yum仓库,默认显示已启用的仓库

yum clean [all|packages|metadata|expire-cache|plugin]:清理缓存,默认all

yum list [all|installed|available]:列出rpm包,默认all,一般不会使用all,而是使用通配符来查找一些不确定的包名

yum info package_name:查看软件包描述信息

yum grouplist:列出所有的包组

在CentOS 6中有三个和开发相关的包组:Desktop Platform Development、Server Platform Development、Development Tools,在编译软件时需要用到

yum groupinfo "package group name":查看软件包组的描述信息

yum install package_name...:安装指定程序包,使用-y选项自动安装

yum reinstall package_name...:重新安装指定程序包

yum check-update:检查可升级的包

yum update [package_name...]:升级所有或指定的程序包,升级到特定版本yum update package-2.3.4

yum groupinstall “groupname”...:安装包组

yum downgrade package_name:降级

yum erase package ...:删除软件包,依赖的包也会一并被卸载

yum groupremove “groupname”...:卸载指定包组

yum whatprovides|provides /path/to/file:查询某文件是由哪个包安装的

yum install /path/to/package_file:安装本地包,手动禁止检查来源及完整性:--nogpgcheck

yum仓库的创建

准备文件服务器,以httpd为例,要事先确保已经安装httpd包;

在/var/www/html目录下,使用一个目录(yumname)来保存准备制作成为yum仓库的所有rpm包;

创建yum仓库createrepo /var/www/html/yumname

启动http服务:service httpd start|systemctl start httpd

配置使用自建的yum仓库

配置好epel的yum源

测试使用

编译安装程序包

软件包中比较常见的源码程序包有c和c++,也有perl和python源码

在开源软件中,一个应用程序由一个项目组维护,比较大的项目会以软件基金会的形式存在,著名的有FSF,ASF,还有由一个主导者和许多contributor维护的项目组,也有小项目只有一个人维护,还有由商业公司支持的软件

开源源码托管的网站:sourceforge.net、github.com、code.google.com

一个源程序的项目工程会将代码分散到多个源代码文件中,通常会使用项目管理工具GNU/make来实现

项目制作者通常会使用autoconf工具对源码进行分析并生成configure脚本,用来检查编译环境是否满足编译需求, 并定义当前程序编译时启用哪个特性或功能,以及定义安装路径,结果就是根据makefile.in文件生成makefile文件。另外开发者使用automake工具生成makefile.in文件,用于结合configure脚本生成makefile文件。makefile文件是make命令的配置文件

编译安装的步骤

  1. 拿到源代码,并解压:tar xf package-ver.tar.{gz|bz2|xz}

    注意:展开后的目录名通常为package-ver

  2. 切换至源码目录

  3. 执行configure脚本

  4. 编译make

  5. 安装make install

configure脚本的通用功能

不同的程序,其configure脚本不尽相同,应获取帮助./configure --help

执行configure脚本,我们需要定义的配置

1.指定安装路径:

--prefix=/usr/local/package_name

--sysconfdir=/etc/package_name

2.启用的特性

--enable-feature,例如--enable-fpm

--disable-feature,例如--disable-socket

3.指定所依赖功能、程序或文件

--with-funciton:启用某功能

--without-fucntion:禁用某功能

编译安装的注意事项

在shell中可以直接执行二进制程序:写一个脚本在/etc/profile.d/package.sh:PATH=/path/to/bin:&PATH;export PATH

头文件输出给系统:ln -sv /path/to/package/include /usr/include/package

库文件输出:vim /etc/ld.so.conf.d/yourpackage.conf /usr/local/yourpackage/bin,编辑完不会立即生效,让系统重新生成库文件路径缓存使用ldconfig

man文件输出:编辑/etc/man.conf,MANPATH /usr/local/yourpackage/man

小结

源码安装的前提条件是要准备好开发环境,编译过程中./config,make,make install,输出头文件、库文件、二进制程序和man文档