20

1 Linux中软件安装方式

1.1 软件包安装

Linux中的软件包(即二进制包),主要分为两类

  • RPM包:是由Red Hat 公司所开发的包管理系统。功能强大,安装、升级、查询和卸载都非常简单和方便,目前很多Linux发行版都在使用这种包管理机制,包括Fedora、CentOS、SuSE等。软件包文件后缀是 ".rpm"。
  • DPKG包:是由Debian Linux 所开发出来的包管理机制,主要应用在Debian和Unbuntu中。软件包文件后缀是 ".deb"。

不论是RPM还是DPKG机制,都存在软件包依赖问题,比如软件包A依赖软件包B,软件包B又依赖软件包C,即依赖关系是 "A -> B -> C",那么就必须先安装C,在安装B,最后A才能安装成功。为了解决这种依赖问题,Linux开发商都提供了在线安装机制,通过这种机制可以自动解决依赖关系,安装A时会自动安装B和C,就不需要手动去一步步安装B和C了。基于RPM包管理机制开发出了YUM在线安装机制,基于DPKG包管理机制开发出了APT在线安装机制

发行版代表 软件包管理机制 相关指令 在线安装机制(指令)
Red Hat/CentOS RPM rpm, rpmbuild YUM(yum))
Debian/Ubuntu DPKG dpkg APT(apt-get)

软件包安装优缺点

  • 优点:

    • 包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
    • 安装速度比源码包安装快的多
  • 缺点:

    • 经过编译,不再可以看到源代码
    • 功能选择不如源码包灵活
    • 安装过程需要依赖关系。不过有在线安装机制可以弥补这个缺点

1.2 源码包安装

所谓源码包一般就是指C语言开发的源代码文件的一个压缩包(.tar.gz.tar.bz2)。源码包的编译用到了linux系统里的编译器 gcc,利用它就可以把C语言变成可执行的二进制文件,所以如果要使用源码包安装必须先安装 gcc 编译器(可以使用 yum install -y gcc 完成安装)。

源码包安装优缺点

  • 优点

    • 开源,如果有足够的能力,可以修改源代码
    • 可以自由选择所需的功能
    • 软件是编译安装,所以更加适合自己的系统,更加稳定、效率更高
    • 卸载方便。直接删除安装目录即可
  • 缺点

    • 安装过程步骤较多,尤其安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误
    • 编译过程时间较长,安装比二进制包安装时间长
    • 因为是编译安装,安装过程中一旦报错新手很难解决

2 RPM 管理软件包

RPM 软件包的命名规则为软件包名-版本-发布次数-Linux平台-硬件平台.rpm
以Apache软件包的包全名为例:"httpd-2.2.15-69.el6.centos.x86_64.rpm"
1、httpd:软件包名
2、2.2.15:软件版本
3、69:软件发布的次数
4、el6.centos:适合的Linux平台
5、x86_64:适合的硬件平台,这里表示64位
6、rpm:rpm包的扩展名,注意Linux是没有扩展名的概念,这里是为了方便管理员识别

RPM 包来源:

  • 第一种方式,官网下载需要安装的RPM包
  • 第二种方式,通过挂载安装光盘,光盘中包含所有的RPM包。以 Centos6 为例:

    1. 给系统添加光盘,如果是虚拟机则直接在设置里找到虚拟光驱添加光盘映像文件(*.iso)即可。Centos6有两个盘,一般第一张光盘就包含了大部分常用的RPM包,也可以同时两张都挂载。如果两盘都添加的话,对应的设配文件分别为,/dev/cdrom/dev/cdrom1
    2. 创建两个目录作为光盘挂载点,mkdir /mnt/cd1/ /mnt/cd2/
    3. 挂载光盘,mount /dev/cdrom /mnt/cd1/mount /dev/cdrom1 /mnt/cd2/。挂载完成后,可在/mnt/cd1/Packages//mnt/cd2/Packages/目录下看到所有的RPM包

RPM 包的默认安装位置如下:

路径 说明
/etc/ 配置文件的安装目录
/usr/bin/ 可执行的命令安装目录
/usr/lib/ 程序所使用的函数库保存位置
/usr/share/doc/ 基本的软件使用手册保存位置
/usr/share/man/ 帮助文件保存位置

2.1 RPM 命令

RPM软件包的管理工具是 rpm 命令,命令格式:rpm 选项 [软件包名]

  • 选项(在下面对应的场景会具体说明)
  • 软件包名:指定要操做的rpm软件包。如果操作的是未安装过的软件包,要使用包全名,而且要注意绝对路径;如果操作的是已安装过的软件包,可以在任意目录下直接使用包名,因为如果软件安装完毕,该软件的相关信息会被写入/var/lib/rpm/ 目录下的数据库文件中(这个目录下的数据库文件很重要,后续软件升级和卸载就就依赖于这个数据库)

2.2 RPM 安装

安装命令:rpm -ivh 包全名

  • 选项

    • -i:安装(install)
    • -v:显示详细信息
    • -h:打印#显示安装进度
    • --nodeps:不检测依赖性安装。软件安装时会检测依赖性,如果所依赖的软件还未安装则会报错,加上这个选项则不检测依赖强制安装,但这样安装的软件一般不能使用,建议不要这样做。
    • --replacefiles:替换文件安装。如果安装的软件包中的部分文件已经存在,则会安装报错,使用该选项就会覆盖现有文件继续安装
    • --replacepkgs:替换软件安装。如果软件包已经安装,使用该选项可把软件包重新安装一遍
    • --force:强制安装。不管是否已经安装,都重新安装,相当于 "--replacefiles" 和 "--replacepkgs" 的综合
    • --test:测试安装。不会实际安装,只是检测一下依赖
    • --prefix=安装路径:指定安装路径。为安装的软件指定安装路径,而不是使用默认安装路径。注意:如果指定了安装路径,软件没有安装到默认路径中的话,系统会找不到这些安装的软件,而需要进行手工配置才能被系统识别,所以RPM包一般建议采用默认路径安装

2.3 RPM 升级

升级命令:rpm -Uvh 包全名rpm -Fvh 包全名

  • 选项

    • -U:升级安装。如果没有安装过,系统直接安装,如果已安装的版本较旧,则升级到新版本
    • -F:升级安装。如果没有安装过,则不会安装,必须安装有较旧版本才能升级

2.4 RPM 卸载

卸载命令:rpm -e 包名

  • 选项

    • -e:卸载软件包
    • --nodeps:卸载时不检查依赖性。如果卸载的软件被其他软件依赖,卸载失败,加上此选项可强制卸载

注意:卸载已安装的软件使用包名即可,不需要使用包全名

2.5 RPM 查询

1. 查询软件包是否安装rpm -q 包名

  • 选项:

    • -q:查询(query)

2. 查询系统中所有安装的软件包rpm -qa

  • 选项:

    • -a:所有(all)

3. 查询软件包的详细信息
已安装:rpm -qi 包名
未安装:rpm -qip 包全名

  • 选项:

    • -i:查询软件信息(information)
    • -p:查询没有安装的软件包(package)

4. 查询软件包的文件列表和安装目录
已安装:rpm -ql 包名
未安装:rpm -qlp 包全名

  • 选项:

    • -l:列出软件包中所有文件和软件所安装的目录(list)

5. 查询系统文件属于哪个软件包rpm -qf 系统文件

  • 选项:

    • -f:查询拥有指定文件的软件包(file)

6. 查询软件包所依赖的其他软件包
已安装:rpm -qR 包名
未安装:rpm -qRp 包全名

  • 选项:

    • -R:查询软件包的依赖性(required)

2.6 RPM 验证

1. 校验指定的已安装RPM包rpm -V 包名

  • 选项:

    • -V:校验指定的RPM包中的文件(verify)

如果执行命令后无任何提示,表明没有做任何修改,如果执行命令后有内容输出,则软件包中的文件被修改过。下面假设已安装的Apache配置文件 "/etc/httpd/conf/httpd.conf" 被修改过为例,来说明一下校验输出的内容:

[root@localhost ~]# rpm -V httpd
S.5....T.  c /etc/httpd/conf/httpd.conf
  • 第一列("S.5....T.")是验证的内容,具体字母含义如下:

    • S: 文件大小是否改变
    • M: 文件的类型或文件的权限( rwx )是否被改变
    • 5: 文件MD5 校验和是否改变( 可以看成文件内容是否改变 )
    • D: 设备的主从代码是否改变
    • L: 文件路径是否改变
    • U: 文件的属主( 所有者 ) 是否改变
    • G: 文件的属组是否改变
    • T: 文件的修改时间是否改变
  • 第二列("c")是被修改的文件类型,有以下几种:

    • c: 配置文件(config file)
    • d: 普通文档(documentation)
    • g: "鬼"文件, 很少见, 就是该文件不应该被这个RPM包包含(ghost file)
    • L: 授权文件(license file)
    • r: 描述文件(read me)
  • 第三列("/etc/httpd/conf/httpd.conf")被修改的具体文件

2. 校验本机所有已安装RPM包rpm -Va

3. 校验某个系统文件是否被修改rpm -Vf 系统文件

3 YUM 管理软件包

3.1 YUM 源文件介绍

yum 源指的就是获取 rpm 包的位置(默认就是官网服务器,包含所有的软件包)。yum源配置文件保存在 /etc/yum.repos.d/ 目录下,一共有5个扩展名为 ".repo" 的文件 CentOS-Base.repoCentOS-fasttrack.repoCentOS-Vault.repoCentOS-Debuginfo.repoCentOS-Media.repo。默认情况下只有 CentOS-Base.repo 文件是生效,文件内容如下:

[root@localhost yum.repos.d]# cat CentOS-Base.repo 
# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the 
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#released updates 
[updates]
name=CentOS-$releasever - Updates
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib&infra=$infra
#baseurl=http://mirror.centos.org/centos/$releasever/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

在 CentOS-Base.repo 文件中有5个 yum 源容器,这里主要解释一下 [base] 容器(其他容器类似):

  • [base]:容器名称,一定要放在 [ ] 中
  • name:容器说明,可以自己随便写
  • mirrorlist:镜像站点,这个可以注释掉
  • baseurl:yum源服务器的地址。mirrorlist是由yum程序自行去找镜像站点,baseurl则是指定固定的一个地址
  • enabled:此容器是否生效,如果不写或者enabled=1则表示此容器生效,写成enabled=0则表示次容器不生效
  • gpgcheck:如果为1表示RPM的数字证书生效;如果为0表示RPM的数字证书不生效
  • gpgkey:数字证书的公钥文件保存位置

搭建本地光盘为yum源
如果在没有网的情况下,可以把挂载的光盘作为yum源。

第一步,首先挂载光盘。这里假设已经挂载了两张光盘,挂载点分别为/mnt/cd1//mnt/cd2/
第二步,修改 CentOS-Media.repo 文件。修改baseurl为两个光盘的挂载点,修改enabled=1。如下:

[c6-media]
name=CentOS-$releasever - Media
# 地址为本地光盘的挂载点
baseurl=file:///mnt/cd1/
        file:///mnt/cd2/
gpgcheck=1
# 把 enabled 改为1让这个容器生效
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

第三步,为了CentOS-Media.repo文件真正的生效,需要使其他的yum源配置文件失效。因为只有扩展名为 "*.repo" 的文件才能作为yum源配置文件,可以修改其他yum源配置为备份文件,如 mv CentOS-Base.repo CentOS-Base.repo.bak

3.2 YUM 命令

yum命令是在Fedora和RedHat以及SUSE中基于 rpm 的软件包管理器,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。

yum 命令格式:yum [选项] COMMAND [软件包]

  • 选项:

    • -y:自动回答"yes",不再询问。如果不加该选项,安装过程中每个涉及的包安装都要手工回答 "yes" or "no"
    • -q:静默模式。不显示安装过程
    • -C:完全从缓存中运行,而不去下载或者更新任何头文件
  • COMMAND (要进行的操作)

    • install:执行安装操作
    • update:执行升级操作
    • remove:执行卸载操作
    • list:显示可用软件包列表
    • search:根据关键字匹配软件包
    • info:显示软件包信息
  • 软件包:如果为包名,则默认为软件包的最新版本;如果要指定软件包版本,则需要使用包全名

3.3 YUM 安装

安装指定软件包:yum -y install 包名
安装全部软件包:yum -y isntall (不常用)

3.4 YUM 升级

升级指定软件包:yum -y update 包名
升级全部软件包:yum -y update (不常用)

3.5 YUM 卸载

卸载指定软件包:yum remove 包名

3.6 YUM 查询

1. 查询软件包列表
查询yum源服务器上所有可安装的软件包列表:yum list
查询yum源服务器上是否存在某个软件包:yum list 包名

2. 查询关键字属于哪个软件包
命令格式:yum search 关键字
一般用于查找 某个指令 是由哪个软件包提供的。比如,要使用 "ifconfig" 指令,需要先安装 "net-tools" 包

[root@localhost yum.repos.d]# yum search ifconfig
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * extras: mirrors.huaweicloud.com
 * updates: mirrors.huaweicloud.com
=================================================== Matched: ifconfig ===================================================
net-tools.x86_64 : Basic networking tools

3. 查询指定软件包信息yum info 软件包

3.6 YUM 缓存

默认情况下,通过 yum 成功安装软件后,会把下载的软件包删除。如果要保留下载的软件包,可以编辑配置文件 /etc/yum.conf,把里面 "keepcache" 参数改为 1 (默认 keepcache=0 ),这样每次通过 yum 安装软件时,会把下载的软件包缓存在 /var/cache/yum/ 目录下,下次再安装相同的软件时,可以从缓存中获取软件包,即使在没有网络的情况下也可正常安装。

1. 清除缓存yum clean packages|headers|oldheaders|all
packages:清除缓存目下的软件包
headers:清除缓存目录下的 headers
oldheaders:清除缓存目录下旧的 headers
all:清除全部

2. 重新建立新的缓存yum makecache

3. 只从缓存中查找软件包并安装yum -C install 包名

3.7 YUM 软件组管理

软件组指的是一组相关的软件包(注意,这里指的不是依赖关系),通过 yum 命令可以对组内软件包批量管理。

1. 列出所有可用软件组yum grouplist

[root@localhost yum.repos.d]# yum grouplist
已加载插件:fastestmirror, security
设置组进程
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * extras: mirrors.huaweicloud.com
 * updates: mirrors.huaweicloud.com
已安装的组:
   Java 平台
   NFS 文件服务器
   ...省略...
Installed Language Groups:
   中文支持 [zh]
   亚美尼亚语支持 [hy]
   ...省略...
有效的组:
   MySQL 数据库服务器
   万维网服务器
   ...省略...
Available Language Groups:
   上索布语支持 [hsb]
   不丹语支持 [dz]
   ...省略...
完成

2. 查询组内包含哪些软件yum groupinfo "软件组名"

[root@localhost yum.repos.d]# yum groupinfo "万维网服务器"
已加载插件:fastestmirror, security
设置组进程
Loading mirror speeds from cached hostfile
 * base: mirrors.huaweicloud.com
 * extras: mirrors.huaweicloud.com
 * updates: mirrors.huaweicloud.com

组:万维网服务器
 描述:允许将系统作为 web 服务器使用,并运行 Perl 和 Python web 应用程序。
 必要的软件包:
   httpd
 默认的软件包:
   crypto-utils
   httpd-manual
   mod_perl
   mod_ssl
   mod_wsgi
   webalizer
 可选的软件包:
   certmonger
   libmemcached
   memcached
   mod_auth_kerb
   ...省略...
  

注意:使用本地终端查出的组名都是英文的,命令中的软件组名也需要使用英文;远程终端(如Xshell)如果支持中文,查出的软件组名是中文的,所以命令中的软件组名既可以使用中文,也可以使用英文,yum groupinfo "万维网服务器"yum groupinfo "Web Server" 是等效的

3. 安装软件组内所有软件yum groupinstall "软件组名"
4. 卸载软件组内多有软件yum groupremove "软件组名"

4 DPKG 管理软件包

DPKG 软件包的命名规则为软件包名_版本号-修订号_平台.deb
例如:openssh-server_8.2p1-4_amd64.deb

4.1 DPKG 命令

DPKG 包的管理工具是 dpkg 命令,命令格式:dpkg 选项 [软件包名]

  • 选项(在下面对应的场景会具体说明)
  • 软件包名:指定要操做的dpkg软件包。如果操作的是未安装过的软件包,要使用包全名,而且要注意绝对路径;如果操作的是已安装过的软件包,可以在任意目录下直接使用包名,因为和RPM类似,DPKG包管理也存在文件数据库来维护已安装的软件信息, 如果软件安装完毕,该软件的相关信息会被写入/var/lib/dpkg/目录下的数据库文件中,一般"/var/lib/dpkg/status" 文件中存储软件状态和控制信息,"/var/lib/dpkg/info/xxx.list"文件中记录了软件安装文件清单

4.2 DPKG 安装

安装命令:dpkg -i 包全名

  • 选项

    • -i:安装
    • --unpack:解开软件包
    • --configure:配置软件包
-i 选项所做操作包含解开软件包和配置软件包,相当于这两步操作:
dpkg --unpack 包全名
dpkg --configure 包名

4.3 DPKG 卸载

卸载命令:dpkg -r|-P 包名

  • 选项

    • -r:删除已安装的软件包,但保留配置文件
    • -P:删除已安装软件包,完全清除包(含配置文件)

4.4 DPKG 查询

1. 查询已安装软件包列表,命令:dpkg -l [包名]

  • 选项

    • -l:查询已安装软件包列表,包含状态、版本信息
    • 包名:查询指定的软件包,如果省略查询全部已安装软件包。包名可使用通配符

示例:
image.png
图中,第一列表示软件包状态标识,状态标识共三位字符表示,
第一位,期望状态:
u(Unknown): 状态未知,这意味着软件包未安装,并且用户也未发出安装请求
i(Install): 用户请求安装软件包
r(Remove): 用户请求卸载软件包
p(Purge): 用户请求清除软件包
h(Hold): 用户请求保持软件包版本锁定

第二位,当前状态:
n(Not):软件包未安装
i(Inst):软件包安装并完成配置
c(Conf-files):软件包以前安装过,现在删除了,但是它的配置文件还留在系统中
U(Unpacked):软件包仅被解包,还未配置
F(halF-conf):试图配置软件包,但是失败了
H(Half-inst):软件包安装,但是但是没有成功
W(trig-aWait):触发器等待
T(Trig-pend):触发器未决

第三位,错误状态:
h:软件包被强制保持,因为有其它软件包依赖需求,无法升级
R:Reinst-required,软件包被破坏,可能需要重新安装才能正常使用(包括删除)
x:软包件被破坏,并且被强制保持

2. 列出软件包关联文件,命令:dpkg -L 包名dpkg -c 包全名

  • 选项

    • -L:列出已安装软件包关联文件列表
    • -c:列出未安装软件包关联文件列表

也可以通过该命令查看软件包文件安装目录位置

3. 显示软件包的详细状态,命令:dpkg -s 包名

  • 选项

    • -s--status:显示软件包的详细状态

4. 搜索含有指定文件的软件包,命令:dpkg -S 文件名

  • 选项

    • -S--search:搜索含有指定文件的软件包。文件名可使用通配符

示例:

taicw@taicw-PC:~/Downloads$ dpkg -S apache2.conf
apache2: /etc/apache2/apache2.conf

5. 搜索系统中损坏的软件包,命令:dpkg -C

5 APT 管理软件包

5.1 APT 源文件介绍

APTYUM 类似,都是从远程软件仓库获取软件包进行安装。其中相关文件说明如下:
/etc/apt/sources.list:记录了软件源的地址
var/lib/dpkg/available:文件的内容是软件包的描述信息,该文件包括当前系统所使用的安装源中的所有软件包,其中包括当前系统中已安装的和未安装的软件包信息
/var/lib/apt/lists/:使用 "apt-get update" 命令扫会描软件源服务器,并为源服务器所有软件资源建立索引文件保存至本地目录"/var/lib/apt/lists/"下,提高系统查询效率
/var/cache/apt/archives/:通过 "apt-get" 安装下载的软件包都缓存在这里。

5.2 APT 命令

APT 管理软件包,主要由以下几个命令组成:
apt-get:主要用来安装、升级和卸载软件,智能解决依赖关系(新版可用 apt 命令代替,去掉了"-get")
apt-cache:查询软件包缓存文件
apt-file:软件包查找工具,可以查到软件包所含的文件和安装的位置

5.3 刷新源

命令:apt-get update
该命令扫描源服务器,更新软件包列表。最好定期运行这一命令以确保软件包列表是最新的,或者在安装和升级软件之前执行该命令

5.4 APT 安装

安装命令:apt-get install 包名

5.5 APT 升级

升级命令:

  • apt-get upgrade

    • 更新所有已安装软件。只是简单的更新包,不管这些依赖,它不能添加新的软件包,或是删除软件包,并且不更改相应软件的配置文件
  • apt-get dist-upgrade

    • 可以根据依赖关系的变化,添加软件包,删除软件包,并且更改相应软件的配置文件,包括升级系统版本

5.6 APT 卸载

卸载命令:

  • apt-get remove 包名

    • 删除指定软件,但是保留配置文件
  • apt-get --purge remove 包名

    • 删除指定软件,同时删除配置文件
  • apt-get autoremove

    • 删除系统内部不需要的依赖软件(一般指安装其他软件包时通过依赖安装的软件包)。该操作可能存在误删,无特殊需求尽量不要执行该命令

5.7 APT 缓存清理

使用 apt-get 安装软件时,会自动到软件源服务器下载需要的软件包(xxx.deb 文件),这些文件缓存在 "/var/cache/apt/archives" 目录下,如果不需要这些文件可以执行如下命令将其清除,节约磁盘空间。

缓存清理命令:

  • apt-get clean

    • 删除/var/cache/apt/archives/ 和 /var/cache/apt/archives/partial/目录下所有".deb" 文件
  • apt-get autoclean

    • 仅删除/var/cache/apt/archives/ 和 /var/cache/apt/archives/partial/目录下旧版本的软件包和无用的软件包文件,保留已安装软件包的 ".deb" 文件

5.8 APT 检查

检查软件包是否有损坏的依赖:apt-get check 包名

5.9 APT 查询

apt-cache
apt-cache 可以查询和显示已安装和可安装软件包的可用信息,它专门工作在本地的数据缓存上,不依赖于软件源的可用性(即离线查询),而这些缓存可以通过比如 apt-get update 命令来更新。如果距离上一次更新的时间太久,那么它显示的信息可能就会过时。常用命令如下:

  • apt-cache stats:显示统计信息
  • apt-cache show 包名:以便于阅读的格式介绍该软件包
  • apt-cache showpkg 包名:显示软件包常规信息,依赖关系等
  • apt-cache policy 包名:显示软件包的安装设置状态
  • apt-cache depends 包名:显示指定软件包所依赖的软件包
  • apt-cache rdepends 包名:显示软件包的反向依赖关系,即被哪些软件包依赖
  • apt-cache search 字符串:根据正则表达式搜索软件包列表

apt-file
apt-file 软件包查找工具,可以查找某个文件属于哪个软件包。apt-file 个独立的软件包,使用之前需要先安装(apt-get install apt-file)。常用命令如下:

  • apt-file update:更新软件包的文件库,第一次使用或执行apt-get update后都需执行一次
  • apt-file search 文件名:查找包含指定文件名的软件包,包括未安装的
  • apt-file list 包名:显示指定软件包的文件

6 源码包安装

6.1 注意事项

  • 什么情况下选择源码包安装?
    如果软件包是给大量客户提供访问的,建议源码包安装,因为源码包效率更高,如LAMP环境搭建;如果软件包是给Linux底层使用或者少量客户访问,建议使用rmp包安装,因为rmp包简单,不容易出错
  • 源码包从哪里来?
    rpm 包是光盘中直接包含的或者yum源服务器提供,一般不需要单独下载;而源码包是通过官方网站下载的,使用时需要单独下载。
  • 同一个软件是否可以用软件包方式安装后,同时又用源码包再安装一遍?
    答案是可以的,因为两种方式的软件安装位置不同,所以安装时相互不会有影响,但是需要注意,两个同时启动时需要修改端口,否则会端口冲突。一般情况下不会同一个软件安装两边,多装一个只会浪费资源

6.2 安装步骤

  1. 下载源码包

    • 源码包格式一般为 xxx.tar.gzxxx.tar.bz2。linux下载工具参考:wget 与 curl 命令详解
    • 示例: wget https://archive.apache.org/dist/httpd/httpd-2.2.15.tar.gz
  2. 解压缩

    • 一般习惯把下载的源码包解压缩到 /usr/local/src/ 目录下。解压缩命令参考: Linux常用命令
    • 示例:tar -zxvf httpd-2.2.15.tar.gz -C /usr/local/src/
  3. 进入解压目录

    • 示例:cd /usr/local/src/httpd-2.2.15/
  4. 编译前准备,命令./configure --prefix=安装目录

    • --prefix=安装目录:指定安装目录。如果不指定,默认情况下会安装在 /usr/local/包名/bin, /usr/local/包名/lib 等目录下,安装文件比较分散不利于删除
    • configure 指令是每个源码包都自带的脚本程序(即解压目录下一个名为"configure"的脚本文件),非系统指令执行时必须指明路径,即"./"表明是当前路径下。执行该指令主要有如下作用:

      • 安装之前检测系统环境是否符合安装要求
      • 定义需要的功能选项。如通过 "--prefix=安装目录" 指定安装目录,其他更多功能选项可以通过 "./configure --help" 来查看
      • 创建 Makefile 文件并把系统环境检测结果和定义的功能选项写入该文件,后续的编译和安装都需要依赖这个文件的内容
    • 示例:./configure --prefix=/usr/local/apache2
  5. 编译,命令make

    • make 会调用 gcc 编译器,并读取 Makefile 文件中的信息进行系统软件编译。编译的目的就是把源码程序转变为能被 Linux 识别的可执行文件,这些可执行文件保存在当前目录下。编译过程较为消耗时间,需要耐心等待
  6. 报错清空编译内容(非必须步骤),命令make clean

    • 如果在执行 "./configure" 或者 "make" 命令时报错,解决报错问题后,需要重新执行命令时一定要先执行一下 "make clean" 命令,它会清空 Makefile 文件和编译产生的 ".o" 头文件
  7. 安装,命令make install

    • 这个才是真正的安装,一般会输出程序的安装位置。如果忘记指安装目录,则可以把这个命令的执行过程保存下来,以备将来删除软件使用
注意:
1.执行 ./configure 命令时可能会提示缺少 gcc 等依赖程序,所以需要使用 yum 等方式先安装依赖程序即可

2.并不是所有的源码包安装一定是执行 "./configure"、"make"、"make install" 这三个命令,只有极少数源码包安装命令可能有些不同,比如 mysql 版本 5.5 以后的源码包安装时,使用 "cmake" 命令替代了 "./configure"。一般源码包解压后都有安装的说明文档,安装之前可以先阅读以下说明文档

3.一般去第三方官网下载源码包时,也会提供已经编译好的二进制包,这种二进制包里面包括了已经经过编译可以马上运行的程序,所以解压后直接进入 "xxx/bin/" 目录找到相关命令直接运行即可

6.3 卸载

通过源码包安装时如果指定了安装目录,比如 "./configure --prefix=/usr/local/apache2",卸载时只需要删除整个安装目录就可以了 "rm -rf /usr/local/apache2",而且是100%卸载,不会像windows那样经常会残留那多注册表之类的垃圾。

如果源码包安装时没有指定安装目录,那么安装软件生成的文件会分别存储在 /usr/local/ 下的 bin、lib、etc 等目录下,删除起来就比较麻烦一点了。所以建议源码包安装一定要指定安装目录,方便卸载。


小飞侠
388 声望80 粉丝

一切都在进行着,唯一可能停止的只有自己!!!