Linux读书笔记(三)—— 软件包管理

软件包是将应用程序、配置文件和管理数据打包的产物。特定的软件包管理系统可以方便地安装和卸载软件包。如今,所有的Linux发行版都采用了某种形式的软件包系统,这使得在Linux上安装软件变得同在Windows下一样方便。常用的软件包格式有两种,这取决于所使用的发行版。OpenSUSE、Red hat、Fedora等发行版本使用RPM,而Debian和Ubuntu则使用.deb格式的软件包。

References:

在早期的UNIX/Linux系统中,安装软件是一件相当费时费力的事情。系统管理员不得不直接从源代码编译软件,并为自己的系统做各种调整,甚至还要修改源代码。尽管以源代码形式发布的软件显著增强了用户定制的自由度,但在各种细小环节上耗费如此巨大的精力显然是缺乏效率的。于是,软件包的概念便应运而生了。

软件包管理系统的应用使 Linux管理员得以从无休止的兼容性问题中解脱出来。软件包使安装软件事实上成为一系列不可分割的原子操作。一旦发生错误,可以卸载软件包,也可以重新安装它们。同时,软件发行商甚至可以不用考虑补丁的问题,因为客户在安装新版本软件包的同时就把老版本替换掉了。

当然,软件包并不是万能的。使用软件包系统安装软件同样需要考虑依赖性的问题只有应用软件所依赖的所有库和支持都已经正确安装好了,软件才能被正确安装。一些高级软件包管理工具如APTyum可以自动搜寻依赖关系并执行安装。

常用的软件包格式有两种:RPM即Red hat package manager(Red hat软件包管理器),最初由Red hat公司开发并部署在其发行版中,如今已被大多数Linux发行版使用;另种则是Debian和Ubuntu上使用的deb格式。这两种格式提供基本类似的功能。

如今,绝大多数Linux发行版都会使用高级软件包管理工具来进一步简化软件包安装的过程。常见的通用版本有APT和yum(其中yum只能用于RPM),它们都是免费的。一些主要的Linux发行商也会开发用于自己发行版的高级包管理工具,如 Red hat的RedHat Network和SUSE的 ZENworks。这些工具常常伴随着付费支持。

高级软件包管理系统基于这样几个理念和目标

  • 简化定位和下载软件包的过程;
  • 自动进行系统更新和升级;
  • 方便管理软件包的依赖关系。

注:由于目前只会用CentOS系列,而且手上只有CentOS7和OpenSUSE Leap 42.3的系统,所以命令都是这两个系统上的示例。

  • 安装
    使用rpm -i命令安装一个软件包。尽管安装工作只需要一个-i(install)就够了,但人们通常还习惯加上-v(verbose)和-h(hash)这两个选项。-v选项用于显示rpm当前正在执行的工作,-h选项通过打印一系列的“#”提醒用户当前的安装进度。

    linux-o5fc:~/Downloads # rpm -ivh google-chrome-stable_current_x86_64.rpm 
    Preparing...                          ################################# [100%]
    Updating / installing...
     1:google-chrome-stable-63.0.3239.10################################# [100%]
    update-alternatives: using /usr/bin/google-chrome-stable to provide /usr/bin/google-chrome (google-chrome) in auto mode
    linux-o5fc:~/Downloads # 

所有的软件包在安装前都必须保证其所依赖的库和支持构造已经安装在系统中。不过,可以使用--force选项强制安装软件包。此时,系统将忽略一切依赖和兼容问题直到软件包“安装完毕”。看起来这是一个不错的想法,但如果真的可以这样,为什么它还要作为个“选项”出现呢?在大部分情况下,--force的最大贡献是让事情变得更糟。没有什么比让一个系统管理员花费一个下午的时间检查软件运行问题,结果却发现只是当初不负责任地无视依赖关系更能让他恼火的了。

所以,在安装的时候,--force参数的使用一定要谨慎。使用该方式安装,往往只会对软件功能造成很小影响。但系统管理员应该始终记住,如果一件事情会朝坏的方面发展,那么它一定会朝更坏的方面发展。在系统出现问题后,没有“撤销”按钮可供选择。因此除非迫不得已,请永远不要使用--force选项。

另外,当正在安装的软件包在其他一些软件包的支持下才能正常工作时,就会发生软件包相关性冲突。利用--nodeps选项可以使RPM忽略这些错误继续安装软件包,但这种忽略软件包相关性问题的方法同样不值得提倡。

  • 升级软件包
    rpm -U命令用于升级一个软件包。也可以为其指定通用的安装选项-v-h。如果系统上已经安装了较早的版本,那么下面这条命令将其升级为新版本。

    $ sudo rpm -Uvh xxx-2.0.src.rpm

升级操作实际是卸载和安装的组合。在升级软件时,RPM首先卸装老版本的软件包,然后再安装新版本的软件包。如果旧版本的软件包不存在,那么RPM只需对所请求的软件包进行安装。RPM 的升级操作可以保留软件的配置文件,和Windows下基本一样。

  • 查看已安装的软件包
    使用rpm -q命令可查询当前系统中已经安装的软件包。用户应该制定软件包的名字(而不是安装文件的名字),则RPM会列出其具体的版本信息。

    linux-ua71:~ # rpm -q acl
    acl-2.2.52-10.15.x86_64

然而在更多的情况下,用户可能不记得软件包的完整名称。而只是知道其中几个关键字。给rpm -q命令加上-a选项则可以列出当前系统上已经安装的所有的软件包。结合管道和grep命令可以找到自己想要的软件包。比如:


```sh

linux-ua71:~ # rpm -qa | grep mariadb
mariadb-10.0.30-21.1.x86_64
mariadb-errormessages-10.0.30-21.1.x86_64
mariadb-client-10.0.30-21.1.x86_64


* **卸载软件包**
使用`rpm -e`(erase)命令可卸载软件包。这个命令接收软件包的名字作为参数。可以用上面的方法确定想要卸载的软件包的名称,但是名称中不应该带有版本信息。下面这条命令从系统中删除了软件包tcpdump。
    

$ sudo rpm -e tcpdump

    
有时候卸载可能产生问题,由于软件包之间存在相互依赖的关系,所以很有可能出现某个软件包系在后导致其他软件无法运行的情况。例如:
    

$ sudo rpm -e xorg-x11-devel
error: Failed dependencies:
xorg-x11-devel is needed by (installed) Mesa-devel-7.0.3-35.1.i586
xorg-x11-devel is needed by (installed) glitz-devel-0.5.6-144.1.i586
...

    
可见,由于软件包`xorg-x11-devel`被多个软件包所依赖,所以RPM谨慎地拒绝了这一卸载请求。用户可以明确指定`--nodeps`选项继续这一卸载操作。不过在按下Enter键之前,请务必犹豫一下,问问自己是否真的知道将要做什么。
    
一个十分有用的卸装选项是`--test`选项,它要求RPM模拟删除软件包的全过程,但并不真的执行删除操作。针对软件包`xorg-x11-devel`执行带`--test`选项的卸载命令,选项-vv(注意是两个v,而不是一个v)要求RPM输出完整的调试信息。在输出结果中可以查看是否被其他的软件所依赖。
* **高级软件包工具 `APT`、`yum`**
    * 简介
`rpm`和`dpkg`这些软件包管理器的出现,大大减少了安装软件的工作量。但系统管理员遗憾地发现,这些工具仍然不能有效地解决依赖性问题。为了安装某个软件,管理员不得不常常陷入“A依赖B,B依赖C,C依赖D………”这类无休止的纠缠中。正是着眼于解决这类问题,以`APT`、`yum`(Yellowdog Updater Modified)等为代表的高级软件包管理工具应运而生了。由于基本只用CentOS,所以这里只介绍yum。
        
yum是一个基于RPM管理的后台程序,能够从指定的服务器自动下载RPM安装包,且能够自动安装,能够有效地解决存在依赖性的软件包。
            
yum也称为软件的仓库,它要正常工作就需要有属于自己的站点。yum的站点既可以是http或ftp,也可以是本地的软件池,但必须包含rpm的 header(在header中包括了rpm包的各种信息,如描述、功能、提供的文件和依赖性等),它要通过header来收集相关的信息并加以分析,才能自动地完成相关的工作。
        
对于Linux系统而言,各个安装包之间的依赖问题的确是一个让人头疼的问题。对于包的依赖问题,外网的 Linux服务器搭建一个网络版的YUM服务就能解决很多问题,而对于内网的Linux服务器,搭建本地的yum服务是一个不错的选择。
        
要搭建本地yum服务,首先要确认系统已经安装了yum服务的组件。通常,安装系统时该组件会一起安装,为了确认该组件是否已安装,可以通过rpm命令来查看。
        

[root@#localhost ~]# rpm -qa | grep yum
yum-plugin-priorities-1.1.31-34.el7.noarch
yum-metadata-parser-1.1.4-10.el7.x86_64
yum-plugin-fastestmirror-1.1.31-34.el7.noarch
yum-3.4.3-132.el7.centos.0.1.noarch
[root@#localhost ~]#

如果没有出现以上信息这说明没有yum服务的组件。如需要该服务则要手动安装。如:`rpm -ivh /media/Packages/yum-3.4.3-118.el7.centos.noarch.rpm`。
    * 安装和卸载软件
        
`yum`命令格式为yum [options] [command] [package ...]
        
如安装Apache服务器的命令为:
        

[root@#localhost yum.repos.d]# yum install httpd
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* epel: mirror.dmmlabs.jp
* epel-testing: mirror.dmmlabs.jp
* extras: mirrors.163.com
* nux-dextop: li.nux.ro
* updates: mirrors.cn99.com
817. packages excluded due to repository priority protections
Resolving Dependencies
--> Processing Dependency: httpd-tools = 2.4.6-67.el7.centos.6 for package: httpd-2.4.6-67.el7.centos.6.x86_64
--> Running transaction check
---> Package httpd-tools.x86_64 0:2.4.6-40.el7.centos.4 will be updated
---> Package httpd-tools.x86_64 0:2.4.6-67.el7.centos.6 will be an update
--> Finished Dependency Resolution

Dependencies Resolved

========================================================================================================

Package Arch Version Repository Size

Updating for dependencies:
httpd-tools x86_64 2.4.6-67.el7.centos.6 updates 88 k

Transaction Summary

Upgrade 1 Package (+1 Dependent package)

Total download size: 88 k
Is this ok [y/d/N]:

可以看到yum会自动搜索相关包和依赖,自动判断是安装还是升级,这里如果不想这种交互式的确认,可以添加参数`-y`,这样yum就会直接按照yes执行直到结束。常用选项有:
        
`install`:后面接需要安装的软件
        
`update`:后面接需要升级到的软件
        
`check-update`:检查可用的升级包
        
`remove`:卸载软件
        
`groupinstall`:安装软件包,安装软件主体和配套的一些工具。
    
    * 查询软件
当想不起来某个软件或不确定源中是否有这个软件时,就可以使用查询功能。如搜索关键字:
        

[root@#localhost yum.repos.d]# yum search nginx
Loaded plugins: fastestmirror, priorities
Loading mirror speeds from cached hostfile
* base: centos.ustc.edu.cn
* epel: mirror.dmmlabs.jp
* epel-testing: mirror.dmmlabs.jp
* extras: mirrors.163.com
* nux-dextop: li.nux.ro
* updates: mirrors.cn99.com
817. packages excluded due to repository priority protections
========================================== N/S matched: nginx ==========================================
collectd-nginx.x86_64 : Nginx plugin for collectd
munin-nginx.noarch : Network-wide graphing framework (cgi files for nginx)
nginx-all-modules.noarch : A meta package that installs all available Nginx modules
nginx-filesystem.noarch : The basic directory layout for the Nginx server
nginx-mod-http-geoip.x86_64 : Nginx HTTP geoip module
nginx-mod-http-image-filter.x86_64 : Nginx HTTP image filter module
nginx-mod-http-perl.x86_64 : Nginx HTTP perl module
nginx-mod-http-xslt-filter.x86_64 : Nginx XSLT module
nginx-mod-mail.x86_64 : Nginx mail modules
nginx-mod-stream.x86_64 : Nginx stream modules
pcp-pmda-nginx.x86_64 : Performance Co-Pilot (PCP) metrics for the Nginx Webserver
nginx.x86_64 : A high performance web server and reverse proxy server

Name and summary matches only, use "search all" for everything.

常用查询选项有:
        
`search`:搜索某个软件名或关键字
        
`list`:列出所有yum所管理的软件包和名称
        
`info`:查询安装包信息
        
`repolist`:列出所有可用的repo
        
`grouplist`:查找软件包,比如mysql有相关的工具,通过此命令可以一起查找
        
`makecache`:生成缓存
        
`clean all`:清除缓存
    
    * 配置yum
如果CentOS安装了yum服务组件,就可以在`/etc/yum.repos.d/`目录下找到它的配置文件。该目录下的`CentOS-Sources.repo`文件用于配置网络yum源,`CentOS-Media.repo`文件用于配置本地yum源,不过`CentOS-Sources.repo`文件可以用来配置本地yum服务。通常安装其他的源配置文件建议都放在此目录下,方便统一管理。可以添加一些国内的源如清华大学,网易,阿里的源,这样使用起来体验会好很多。
        
如果系统不能连接外网,意味着默认的yum服务不能使用,需要在隔离外网的环境中使用yum服务时,就只能配置本地yum服务了。目测很少会遇到这种情况,所以就简述下好了,有需要再查资料。挂载光盘,修改`CentOS-Media.repo`、`/etc/yum.conf`等文件,安装时命令中添加去校验的参数。

* **从源码编译软件**
源代码安装是Linux系列系统最常用的软件安装方式,源代码安装一般由配置(configure)、编译(make)和安装(make install)这3个步骤组成。使用源码安装可以避免安装包出现依赖关系,而且适应于不同的平台,维护也非常便捷。
    
源码安装包就是源代码可见的软件包,这种安装包在Linux系列系统下很常见(最新的安装包通常以源码的方式发布)。软件源代码可见并不等于软件是开源的,要判断一个软件是否开源需具备源代码可见和宽松的许可证书这两个条件。
    
使用源代码的方式安装软件时,多数情况下会涉及软件包的解压缩,解压缩的命令需根据压缩后缀名不同而选择。通常软件压缩包的后缀名是`tar.gz`,所以可以通过tar命令来解压缩。有时`.tar.gz`也缩写为`.tgz`。早期.tgz被使用,是因为Dos软盘上的文件只能有三个字母扩展名。现在没有这个限制,所以用更长的.tar.gz来显示文档类型(tar)和压缩类型(gzip)。但它们是完全等价的。
    
具体编译的例子参考[树莓派CentOS 7编译安装Python3][3]
    
通常编译软件的过程就是解压源码包,通过`configure`配置参数,编译,安装。
    

[root@#localhost ~]# ./configure --prefix=/usr/local/xxx ##配置安装路径
[root@#localhost ~]# make ##编译
[root@#localhost ~]# make install ##安装

    
关于configure命令的更多选项可以通过执行help参数获取,以下是常用的几个:
    * --prefix:自定义安装目录
    * --enable-modules:指定除默认安装的模块还需要安装的其他模块,利用`./configure --pprefix = “模块名1 模块名2...”`命令,可以自动加载额外的模块。
    * --enable-mode-shared:不能自动加载额外的模块,而是通过LoadModul指令来加载。
    
在完成对安装包的配置后,如果没有出现错误提示,就可以编译了。建议查看下默认的安装位置,不合适的话要手动指定文件夹,不然卸载这些编译安装的软件会比较麻烦。编译至少需要一些如gcc、make之类的开发工具和lib开头的开发库。如果在编译源代码时提示缺少某些东西,那么多数是缺少一些开发库和开发工具。
    
如果编译没有问题,那么最后就可以安装了。当然源代码安装的方式并不限于一种,有些软件甚至不能进行配置,具体的安装方式应该阅读文档。

  [1]: http://www.178linux.com/6445
  [2]: http://www.cnblogs.com/mchina/archive/2013/01/04/2842275.html

标签: none

仅有一条评论

  1. 写的不错 ali-42.gif

添加新评论

ali-01.gifali-58.gifali-09.gifali-23.gifali-04.gifali-46.gifali-57.gifali-22.gifali-38.gifali-13.gifali-10.gifali-34.gifali-06.gifali-37.gifali-42.gifali-35.gifali-12.gifali-30.gifali-16.gifali-54.gifali-55.gifali-59.gif

加载中……