type
status
date
slug
summary
tags
category
icon
password
Property
Linux
安装软件
Windows
安装软件大概的过程如下:- 在用户指定的安装目录下建立安装程序目录
- 拷贝相关
dll
动态库到安装目录
- 拷贝
exe
可执行文件到安装目录
- 拷贝配置文件到安装目录,比如
Windows
下的ini
配置文件
- 把启动配置或者程序依赖的配置放入注册表中
- 如果是服务程序,注册并且启动该服务
Linux
安装软件大概的过程如下:- 建立安装目录
- 拷贝类库
- 拷贝可执行程序
- 根据需要选择性配置和启动服务
Windows
和Linux
的安装过程几乎是相同的,只是安装方式有些不同。在 Windows
下我们经常使用图形界面来安装,双击安装包即可安装软件,而在 Linux
下经常通过命令行来安装。对于卸载过程,也是相同的,都是安装的过程逆过程。注意:
Linux
下的/usr
目录相当于Windows
下的ProgramFile
目录;Linux
下的动态库后缀是.so
而Windows
下是.dll
Linux系统下安装软件的方式:
- 通过Tarball 源码安装
linux
下的软件大都进行了GPL的授权,即开放了源码,因此可以通过下载源码,进行编译的方式来安装软件。这种方式的优点是比较灵活,可以根据使用者的需求去更改源码。另外,相比于直接闭源软件,开源软件的安全性更好,因为所有使用者都可以阅览源码,因此可以及早发现软件漏洞以及进行修复。- 通过二进制文件安装
dpkg
: 这个机制最早是由Debian Linux
社群所开发出来的,通过dpkg
的机制, Debian 提供的软件就能够简单的安装起来,同时还能提供安装后的软件信息,实在非常不错。 只要是衍生于Debian
的其他Linux distributions
大多使用dpkg
这个机制来管理软件的, 包括B2D
,Ubuntu
等等。RPM
: 这个机制最早是由Red Hat
这家公司开发出来的,后来实在很好用,因此很多distributions
就使用这个机制来作为软件安装的管理方式,包括Fedora
,CentOS
,SuSE
等等。
目前在
Linux
界软件安装方式最常见的有两种,分别是:dpkg/rpm
这些机制或多或少都会有软件属性相依的问题,目前新的Linux
开发商都有提供“线上升级”机制:distribution 代表 | 软件管理机制 | 使用指令 | 线上升级机制(指令) |
Red Hat/Fedora | RPM | rpm, rpmbuild | YUM (yum) |
Debian/Ubuntu | DPKG | dpkg | APT (apt-get) |
Yum
软件仓库可以根据用户的要求分析出所需软件包及其相关的依赖关系,然后自动从服务器下载软件包并安装到系统。Tarball 源码安装
通过源码形式安装软件,用户通常需要通过网络下载源码文件,而源码文件通常比较大,如果直接下载,则需要占用较大带宽,为了缓解这个问题,源码文件通常首先通过
Tar
打包,然后进行压缩,形成xxx.tar.gz
等压缩文件,用户往往通过互联网下载打包、压缩后的源码文件,然后进行解压后再安装。因此,将这种形式的源码文件称之为Tarball
文件。通常一个
Tarball
软件安装包中包含以下内容:README
或者INSTALL
安装说明文件
configure
文件:检测主机的环境,包括寻找库文件、检测gcc
是否存在等,根据这些主机环境信息生成Makefile
文件
- 源码文件
Tarball形式安装软件的一般步骤
- 下载
Tarball
软件包(最好放在/usr/local/src
目录下),并使用tar
并解压
./configure --help | more
查看安装参数
- 采用
configure
生成Makefile
文件(通常需要执行./configure
命令)
- 为新安装的软件在
/usr/local
下新建一个目录
- 采用
make install
(根据README
中的具体命令安装,通常情况下是make install
)将软件安装在新建目录下
采用补丁包更新软件
例如:v0.1 升级到 v0.2
- 下载0.1版本到0.2版本的补丁包
.patch
文件
- 根据
.patch
文件更新源码文件
- 重新编译
函数库管理
软件依赖的库有两种类型
- 静态库:
libXXX.a
--在编译时会直接整合在源文件中,所以体积较大
- 动态库:
libxxx.so
-- 只是在源文件中存放一个指针,使用时才会去读取函数库;虽然无法独立运行,但升级函数库时不用重新编译源文件
比较项 | 静态库 | 动态库 |
扩展名 | libxxx.a | libxxx.so |
文件大小 | 软件间不共享,较大 | 软件间共享,较小 |
依赖 | 弱 | 强 |
软件升级 | 难 | 易 |
大多数库放置在:
/lib64
、/lib
内核库文件放置在:
/lib/modules
查看软件依赖的库文件:
ldd
命令用于打印程序或者库文件所依赖的共享库列表。语法格式:ldd [参数] [文件]
常用参数:
-v | 详细信息模式,打印所有相关信息 |
-u | 打印未使用的直接依赖 |
-d | 执行重定位和报告任何丢失的对象 |
-r | 执行数据对象和函数的重定位,并且报告任何丢失的对象和函数 |
-- -help | 显示帮助信息 |
将动态库加载到cache中
- 在
/etc/ld.so.conf
中追加库文件所在目录
- 执行
ldconfig
校验软件源代码的正确性
源代码可能遭遇修改,有风险;可以利用MD5, SHA1 或 SHA256 加密机制来处理,获得一个唯一计算码,比较两次码值,若不一样则表示被修改过;
RPM与 SRPM
RPM
全名是RedHat Package Manager, 是以一种数据库记录的方式来将你所需要的软件安装到你的 Linux 系统的一套管理机制。他最大的特点就是将你要安装的软件先编译过, 并且打包成为
RPM
机制的包装文件,通过包装好的软件里头默认的数据库记录, 记录这个软件要安装的时候必须具备的相依属性软件,当安装在Linux
主机时, RPM
会先依照软件里头的数据查询Linux
主机的相依属性软件是否满足, 若满足则予以安装,若不满足则不予安装。那么安装的时候就将该软件的信息整个写入RPM
的数据库中,以便未来的查询、验证与反安装!这样一来的优点是:- 已经编译完成并且打包完毕,所以软件传输与安装上很方便 (不需要再重新编译);
- 软件的信息都已经记录在
Linux
主机的数据库上,很方便查询、升级与反安装
但是这也造成些许的困扰。由于
RPM
文件是已经包装好的数据,也就是说, 里面的数据已经都“编译完成”了!所以,该软件文件几乎只能安装在原本默认的硬件与操作系统版本中。 也就是说,主机系统环境必须要与当初创建这个软件文件的主机环境相同才行! 举例来说,rp-pppoe
这个 ADSL 拨接软件,他必须要在ppp
这个软件存在的环境下才能进行安装!如果你的主机并没有 ppp
这个软件,那么除非先安装ppp
否则rp-pppoe
就是不让你安装的 (也可以强制安装,但是通常都会有点问题)。所以,通常不同的
distribution
所释出的RPM
文件,并不能用在其他的distributions
上。举例来说,Red Hat
释出的 RPM
文件,通常无法直接在SuSE
上面进行安装的。更有甚者,相同 distribution
的不同版本之间也无法互通,例如CentOS 6.x
的RPM
文件就无法直接套用在CentOS 7.x
!因此,这样可以发现这些软件管理机制的问题是:- 软件文件安装的环境必须与打包时的环境需求一致或相当
- 需要满足软件的相依属性需求
- 反安装时需要特别小心,最底层的软件不可先移除,否则可能造成整个系统的问题
如果真的想要安装其他
distributions
提供的好用的 RPM 软件文件时?还好,有SRPM
!SRPM
,是 Source RPM
的意思,也就是这个RPM
文件里面含有源代码!通常 SRPM
的扩展名是以 *
.src.rpm
这种格式来命名的。不过,既然 SRPM
提供的是源代码,那么为什么不使用 Tarball
直接来安装?这是因为 SRPM
虽然内容是源代码, 但是他仍然含有该软件所需要的相依性软件说明、以及所有 RPM
文件所提供的数据。同时,他与 RPM
不同的是,他也提供了参数配置文件 (就是 configure
与 makefile
)。所以,如果下载的是SRPM
,那么安装该软件时:- 先将该软件以
RPM
管理的方式编译,此时SRPM
会被编译成为RPM
文件
- 将编译完成的
RPM
文件安装到Linux
系统当中
文件格式 | 文件名格式 | 直接安装与否 | 内含程序类型 | 可否修改参数并编译 |
RPM | xxx.rpm | 可 | 已编译 | 不可 |
SRPM | xxx.src.rpm | 不可 | 未编译之源代码 | 可 |
RPM 二进制包命名的一般格式如下:
例如,RPM包
httpd-2.2.15-15.el6.centos.1.i686.rpm
:- httped:软件包名。
httped
是包名,httpd-2.2.15-15.el6.centos.1.i686.rpm
通常称为包全名,包名和包全名是不同的,在某些Linux
命令中,有些命令(如包的安装和升级)使用的是包全名,而有些命令(包的查询和卸载)使用的是包名。
- 2.2.15:包的版本号,版本号的格式通常为
主版本号.次版本号.修正号
。
- 15:二进制包发布的次数,表示此
RPM
包是第几次编程生成的
- el*:软件发行商,
el6
表示此包是由Red Hat
公司发布,适合在RHEL 6.x (Red Hat Enterprise Unux)
和CentOS 6.x
上使用。
- centos:表示此包适用于
CentOS
系统。
- i686:表示此包使用的硬件平台,目前的
RPM
包支持的平台:
平台名称 | 适用平台信息 |
i386 | 386 以上的计算机都可以安装 |
i586 | 686 以上的计算机都可以安装 |
i686 | 奔腾 II 以上的计算机都可以安装,目前所有的 CPU 是奔腾 II 以上的,所以这个软件版本居多 |
x86_64 | 64 位 CPU 可以安装 |
noarch | 没有硬件限制 |
- rpm:
RPM
包的扩展名,表明这是编译好的二进制包,使用rpm
命令直接安装。此外,还有以src.rpm
作为扩展名的RPM
包,这表明是源代码包。
Linux
系统不靠扩展名分区文件类型,那为什么包全名中要包含.rpm
扩展名呢?这里的扩展名是为系统管理员准备的,如果我们不对RPM
包标注扩展名,管理员很难知道这是一个RPM
包,当然也就无法正确使用。默认安装路径
常情况下,
RPM
包采用系统默认的安装路径,所有安装文件会按照类别分散安装到:安装路径 | 含 义 |
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
除此之外,
RPM
包也支持手动指定安装路径,但并不推荐。一旦手动指定安装路径,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需要进行手工配置才能被系统识别)。与
RPM
包不同,源码包的安装通常采用手动指定安装路径(习惯安装到/usr/local/
中)的方式。- 安装软件的命令格式:
- i:安装(install)
- v:显示更详细的信息(verbose)
- h:打印#,显示安装进度(hash)
nodeps
:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意,这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。replacefiles
:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报"某个文件已经存在"的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。replacepkgs
:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。force
:强制安装。不管是否已经安装,都重新安装。也就是-replacefiles
和-replacepkgs
的综合。test
:测试安装。不会实际安装,只是检测一下依赖性。prefix
:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。
此命令中各选项参数的含义为:
如果还有其他安装要求(比如强制安装某软件而不管它是否有依赖性),可以通过以下选项进行调整:
- 升级软件的命令格式:
U选项的含义是:如果该软件没安装过则直接安装;若没安装则升级至最新版本。
F选项的含义是:如果该软件没有安装,则不会安装,必须安装有较低版本才能升级。
- 卸载软件的命令格式:
RPM 软件包的卸载要考虑包之间的依赖性。例如先安装的
httpd
软件包,后安装httpd
的功能模块mod_ssl
包,那么在卸载时,就必须先卸载mod_ssl
,然后卸载httpd
,否则会报错。由于
RPM
文件常常会安装/移除/升级等,某些动作或许可能会导致RPM
数据库 /var/lib/rpm/
内的文件破损,可以重建一下数据库- 查询的命令格式:
- RPM 验证与数码签章:
使用 SRPM 包安装软件(编译 SRPM 包)的方式有以下 2 种:
- 利用
rpmbuild
命令可以直接使用SRPM
包安装软件,也可以先将SRPM
包编译成RPM
包,再使用RPM
包安装软件。 rebuild
:编译 SRPM 包生成 RPM 二进制包recompile
:编译 SRPM 包,同时安装
rpmbuild
命令也是一个程序,但是这个程序不会默认安装。这里使用rpm
命令来安装rpmbuild
命令:rpmbuild
目录下有几个子目录:/root/rpmbuild/SPECS | 放置的是该软件的配置文件,例如这个软件的信息参数、设置项目等等 |
/root/rpmbuild/SOURCES | 放置的是该软件的原始文件 (*.tar.gz 的文件) 以及 config 这个配置文件 |
/root/rpmbuild/BUILD | 在编译的过程中,有些暂存的数据都会放置在这个目录当中; |
/root/rpmbuild/RPMS | 经过编译之后,并且顺利的编译成功之后,将打包完成的文件放置在这个目录当中。包含了 x86_64, noarch.... 等等的次目录。 |
/root/rpmbuild/SRPMS | 与 RPMS 内相似的,这里放置的就是SRPM封装的文件!如果想将软件用 SRPM 的方式释出时, SRPM文件就会放置在这个目录中了。 |
如果只想安装
SRPM
包,而不用修改源代码,那么直接使用 rpmbuild
命令即可:可使用如下 2 个选项:
注意:
SRPM
本质上仍属于RPM
包,所以安装时仍需考虑包之间的依赖性,要先安装它的依赖包,才能正确安装- 利用
*.spec
文件可实现将SRPM
包编译成RPM
包,再使用RPM
包安装软件
想利用
.spec
文件安装软件,需先将SRPM
包解开。可以使用rpmbuild
命令解开SRPM
包,这里使用 rpm -i
命令:接下来使用 SPECS 目录中的设置文件生成 RPM 包,命令如下:
命令执行完成,会在
/root/rpmbuild/
目录下生成 BUILD、RPMS、SOURCES、SPECS 和 SRPMS 目录,RPM 包放在 RPMS 目录中,SRPM 包生成在 SRPMS 目录中。以上两种方式都可实现将 SRPM 包编译为 RPM 二进制包,剩下的工作就是使用 RPM 包安装软件。
YUM
yum
是通过分析 RPM
的标头数据后, 根据各软件的相关性制作出属性相依时的解决方案,然后可以自动处理软件的相依属性问题,以解决软件安装或移除与升级的问题。由于
distribution
必须要先释出软件,然后将软件放置于 yum
服务器上面,以提供用户端来要求安装与升级之用的。 因此想要使用 yum
的功能时,必须要先找到适合的 yum server
才行!而每个 yum server
可能都会提供许多不同的软件功能!因此,必须要前往 yum server
查询到相关的软件库网址后,再继续处理后续的设置事宜。事实上
CentOS
在释出软件时已经制作出多部映射站台 (mirror site) 提供全世界的软件更新之用。 所以理论上不需要处理任何设置值,只要能够连上 Internet
,就可以使用yum
yum repolist all
列出所有仓库
yum list all
列出仓库中所有软件包
yum info 软件包名称
查看软件包信息
yum install 软件包名称
安装软件包
yum reinstall 软件包名称
重新安装软件包
yum update 软件包名称
升级软件包
yum remove 软件包名称
移除软件包
yum clean all
清除所有仓库缓存
yum check-update
检查可更新的软件包
yum grouplist
查看系统中已经安装的软件包组
yum groupinstall 软件包组
安装指定的软件包组
yum groupremove 软件包组
移除指定的软件包组
yum groupinfo 软件包组
查询指定的软件包组信息