Linux 软件安装的几种方式

  • 源码安装
  • 可执行程序(rpm)安装
  • 包管理工具(yum, apt-get)安装

源码安装的基本流程

  1. 首先使用 wget 下载源码包(压缩文件)
  2. 然后 tar 解压源码包
  3. 安装

如果使用 wget 下载的文件是 shell 脚本,通常会使用 sh 进行脚本执行安装:

  1. wget xxx.sh | sh

大部分源码程序的安装流程为:

  1. 如果是configure文件,就执行:
  1. ./configure
  2. make
  3. make install
  1. 如果是Makefile文件,就执行:
  1. make
  2. make install
  1. 如果是Imake文件,就执行:
  1. xmkmf
  2. make

可执行程序 (rpm)

rpm命令 是RPM软件包的管理工具。rpm原本是 Red Hat Linux 发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。

这种软件安装包通常被是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀是 .rpm。

  1. 安装软件: 执行 rpm -ivh rpm 包名,如:rpm -ivh gcc*rpm -ivh make*rpm -ivh autoconf*rpm -ivh apache-1.3.6.i386.rpm
  2. 升级软件: 执行 rpm -Uvh rpm 包名
  3. 反安装: 执行 rpm -e rpm 包名
  4. 查询软件包的详细信息: 执行 rpm -qpi rpm 包名
  5. 查询某个文件是属于那个rpm包的: 执行 rpm -qf rpm 包名
  6. 查该软件包会向系统里面写入哪些文件: 执行 rpm -qpl rpm 包名
  7. 查看已安装的软件包位置: rpm -ql rpm 包名
  8. 查看指定软件已安装的版本: rpm -qa | grep docker

安装 rpm 软件包

rpm 软件包的安装可以使用程序 rpm 来完成。执行下面的命令:

  1. rpm -ivh your-package.rpm

其中 your-package.rpm 是你要安装的 rpm 包的文件名,一般置于当前目录下。

卸载 rpm 软件包

使用命令 rpm -e 包名,包名可以包含版本号等信息,但是不可以有后缀 .rpm,比如卸载软件包proftpd-1.2.8-1,可以使用下列格式:

  1. rpm -e proftpd-1.2.8-1
  2. rpm -e proftpd-1.2.8
  3. rpm -e proftpd-
  4. rpm -e proftpd

不可以是下列格式:

  1. rpm -e proftpd-1.2.8-1.i386.rpm
  2. rpm -e proftpd-1.2.8-1.i386
  3. rpm -e proftpd-1.2
  4. rpm -e proftpd-1

有时会出现一些错误或者警告:

  1. ... is needed by ...

这说明这个软件被其他软件需要,不能随便卸载,可以用 rpm -e —nodeps 强制卸载。

rpm 软件包查找

查看与 rpm 包相关的文件和其他信息

下面所有的例子都假设使用软件包 mysql-3.23.54a-11

rpm -qa # 列出所有安装过的包
rpm -qa | grep sql # 如果要查找所有安装过的包含某个字符串sql的软件包
rpm -q mysql # 获得某个软件包的文件全名
rpm -ql mysql # 列出软件包的安装路径, 注意这里的是不包括 .rpm 后缀的软件包的名称, 也就是说只能用 mysql 或者 mysql-3.23.54a-11, 而不是 mysql-3.23.54a-11.rpm。如果只是想知道可执行程序放到那里去了,也可以用which

一个rpm包中包含哪些文件

  • 一个没有安装过的软件包,使用rpm -qlp ****.rpm
  • 一个已经安装过的软件包,还可以使用rpm -ql ****.rpm

获取关于一个软件包的版本,用途等相关信息

  • 一个没有安装过的软件包,使用rpm -qip ****.rpm
  • 一个已经安装过的软件包,还可以使用rpm -qi ****.rpm

某个程序是哪个软件包安装的,或者哪个软件包包含这个程序

rpm -qf `which 程序名`    # 返回软件包的全名
rpm -qif `which 程序名`   # 返回软件包的有关信息
rpm -qlf `which 程序名`   # 返回软件包的文件列表
rpm -qilf 程序名          # 返回软件包的全名

注意,这里不是引号,而是反撇号,就是键盘左上角的那个键。也可以使用rpm -qilf,同时输出软件包信息和文件列表。

某个文件是哪个软件包安装的,或者哪个软件包包含这个文件

注意,前一个问题中的方法,只适用与可执行的程序,而下面的方法,不仅可以用于可执行程序,也可以用于普通的任何文件。前提是知道这个文件名。首先获得这个程序的完整路径,可以用 whereis 或者 which,然后使用 rpm -qf 例如:

$ whereis ftptop
ftptop: /usr/bin/ftptop /usr/share/man/man1/ftptop.1.gz
$ rpm -qf /usr/bin/ftptop
proftpd-1.2.8-1
$ rpm -qf /usr/share/doc/proftpd-1.2.8/rfc/rfc0959.txt
proftpd-1.2.8-1

conflict 冲突解决

安装过程中可能出现下面的警告或者提示:

... conflict with ...

可能是要安装的包里有一些文件可能会覆盖现有的文件,缺省时这样的情况下是无法正确安装的可以用 rpm --force -i 强制安装即可

... is needed by ...
... is not installed ...

此包需要的一些软件你没有安装可以用 rpm --nodeps -i 来忽略此信息,也就是说 rpm -i --force --nodeps 可以忽略所有依赖关系和文件问题,什么包都能安装上,但这种强制安装的软件包不能保证完全发挥功能。

参考资料