最新消息:

linux软件安装方法总结(linux软件包管理)

Linux运维 大步 3710浏览 0评论

 在Linux系统中,软件包的安装和管理是很重要的知识,而linux/unix一个麻烦的地方就是软件安装程序比较麻烦和复杂,尤其是当所安装的软件包要处理较多的包依赖关系,这就更让人头疼了,我这次花了点时间总结了网上写的较好的linux软件包管理的文章,总结在一起,加入一些自己的意见。最常见linux软件安装方式有三种:

(1)一种是软件的源代码安装,需要自己动手编译它。这种软件安装包通常是用gzip压缩过的tar包(后缀为.tar.gz)。

  • 源码安装的好处是不会受到平台的限制,而且能够根据自己的系统和平台自己优化一些选项,所以这个是比较推荐的一种安装方式,缺点是对于软件的依赖关系只能靠自己的经验来解决了,有时候可能编译四五次都会出问题,所以一般建议在机子上测试成功后写成shell一件安装的脚本,方便下载的安装,省去不必要的麻烦。

(2)第二种是软件的可执行程序,也是二进制软件包。

其实可以细分为rpm包(或者是DPKG)yum包安装。RPM 和 DPKG 为最常见的两类软件包管理工具,他们的安装的时候不要需要网络,只要下载下来在系统上安装即可。rpm包(或者DPKG 包)这类包的使用容易受平台和系统的限制,所以要根据自己的linux的分支版本以及cpu等来决定下载和使用何种软件包。而且需要自己处理软件的依赖关系。

  • redhat系列软件安装包通常被是一个RPM包(Redhat Linux Packet Manager,就是Redhat的包管理器),后缀是.rpm。
  • Debian系类就是DPKG包了。

二进制更方便的一种安装形式就是yum(或者apt)。这种方式的安装软件的时候需要联网,好处是能自动处理软件间的依赖关系,测试时比较推荐,可以省去很多时间。

  • redhat系列是通过yum来安装操作的
  • ubuntu的系列版本就是apt-get的

当然,也有用rpm格式打包的源代码,用gzip压缩过的可执行程序包。只要您理解了以下的思路,这两种形式的安装包也不在话下了。

(3)就是脚本安装,其实就是安装命令的堆积,当然也要对系统比较了解才能写出好的脚本,既可以包含yum这类,也可以使用rpm这类命令。如军哥的lnmp一键安装脚本,可以参考《军哥lnmp一键安装脚本详细解析(Centos.sh版)

下面,我们就分成六个部分来说明软件安装思路:

第一部分:搞定.tar.gz,即linux源码安装

1.首先,使用tar -xzvf来解开这个包,如:
#tar -xzvf apache_1_3_6_tar.gz
这样就会在当前目录中创建了一个新目录(目录名与.tat.gz包的文件名类似),用来存放解压了的内容。如本例中就是apache_1.3.6

2.进入这个目录,再用ls命令查看一下所包含的文件,如:
#cd apache_1.3.6
#ls
你观察一下这个目录中包含了以下哪一个文件:configure、Makefile还是Imake。大部分源码包中都会包含一个readme的文本文件,建议安装前可以查看下里面的内容,都是告诉我们如何安装的,十分有用。
1)如果是configure文件,就执行:
#./configure
#make
#make install

一般./confiugre后面可以根据自己的系统的情况加上相应的参数优化安装,如使用—prefix=/usr/local/,就可以指定安装到/usr/local/目录下。可以通过查看readme有哪些参数或者是用 configure --help查看有哪些参数。
2)如果是Makefile文件,就执行:
#make
#make install
3)如果是Imake文件,就执行:
#xmkmf
#make
#make install
 3.如果没有出现什么错误提示的话,就搞定了。至于软件安装到什么地方,如果你设定了安装目录参数,就会安装到你所指定的地方,如果未指定安装目录,通常会在安装时出现。否则就只能查阅一下README。

 

如果遇到错误提示,也别急,通常是十分简单的问题:
1)没有安装C或C++编译器;
确诊方法:执行命令gcc(C++则为g++),提示找不到这个命令。
解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:
#rpm -ivh gcc* (哈哈,我们用到了第二种安装方式)
2)没有安装make工具;
确诊方法:执行命令make,提示找不到这个命令。
解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:
#rpm -ivh make*
3)没有安装autoconf工具;
确诊方法:执行命令make,提示找不到这个命令。
解决方法:将Linux安装光盘mount上来,然后进入RPMS目录,执行命令:
#rpm -ivh autoconf*
4)缺少某些链接库;
确诊方法:在make时,提示需要某些文件。
解决方法:安装包含这个文件的包,这就需要积累了。

5)软件依赖;

这时候只有安装软件的依赖关系,按照先后顺序安装软件。

 

第二部分:搞定.rpm

这里先说软件依赖关系

软件包依赖性关系

由于开源的 多态性,Linux 操作系统中的软件之间的依赖性关系处理一直令用户感到头疼。如果 package_a 依赖于 package_b,那么在一个没有安装 package_b 的系统中,package_a 是不被系统推荐安装的,强制安装很可能会导致软件无法正常工作。基于以上 package_a 和 package_b 的关系,在一个干净的系统中 ( 未安装 package_a 或 package_b),欲安装 package_a,错误通常会表现为:
RHEL 5.2

Ubuntu 904

 

查询软件包依赖关系
查询 RPM 包的依赖关系,使用 rpm -qRp:

 

表明 package_a.rpm 依赖于 version_info 版的 package_b,或者任何高于并包括 version_info 版的 package_b,亦或低于或包括 version_info 版的 package_b 。所以 package_b.rpm 必须在 package_a 之前安装于系统中。
查询 DEB 包的依赖关系,可解读 dpkg --info 结果中的 Pre-Depends 字段:

 

表明 package_a.deb 依赖于 version_info 版的 package_b 或者任何高于并包括 version_info 版的 package_b 亦或低于或包括 version_info 版的 package_b. 所以 package_b.deb 必须在 package_a 之前安装于系统中。

所以正确的安装方法如下节所示。

安装方法
对于 package_a,正确的安装方法应该是:

 

嵌套的依赖关系

如上示例为最理想的依赖关系,实际应用中往往最令用户头疼的是 package_a 依赖于 package_b/c/d/e/f 等多个包 , 而 package_b/c/d/e/f 等包又依赖于 package_b1,b2,b3/c1,c2/d1,d2/e1,e2/f1,f2 等等 ... ... 为保证软件的正常使用,必须找到所有依赖包以及子依赖包并且安装。过多的依赖关系大大降低了 Linux 软件安装的用户友好性。所以针对此类问题,使用了更高级的包管理策略去解决 - Yum/APT 。

RPM是Red Hat公司随Redhat Linux推出了一个软件包管理器,通过它能够更加轻松容易地实现软件的安装。

  • RPM软件包命名格式:
         name-version-release.architecture.rpm
         name:软件名字;version:项目的版本;release:红帽内部补丁;

1安装软件:执行rpm -ivh rpm包名,如:
#rpm -ivh apache-1.3.6.i386.rpm

备注: a-v,-h是输出选项,-v表示显示附加信息,-h安装时输出 # 号,这两个选项不是必须的。但是-i是必须的,表示install;

              b)使用rpm安装软件包时,可以使用网络地址如:ftp://http://

rpm  –i[v|h]  [--excludedocs |prefix |test |replace[pkgs |files] |nodeps]  rpm包名

[解析]  i为安装,v为显示详细信息,h为hash是进度信息

--excludedocs 不安装软件包的文档文件

--prefix PATH 将软件包安装到指定目录

--test 只对安装进行测试,并不实际安装(通常用来看下需要的依赖项)

--replace[pkgs|files] 当出现冲突时或想强制覆盖时可以使用

--nodeps 不考虑依赖关系,强制安装。(这样比较麻烦,而且通常无法使用。这也是使用RPM的一些不方便的地方,而YUM则解决了这个问题,在安装的时候会自动将所需要的都一起安装了)

 

2.升级软件:执行rpm -Uvh rpm包名。

-U表示update。用来升级已经安装的软件包,升级后原来的将被删除;原来的软件包配置文件以.rpmsave为扩展名保存;

刷新软件包:rpm-F(--freshen)

刷新软件包和升级软件包基本相同;但如果命令中指定的软件包还没有安装则:
a)         当使用-U时,无论原系统中是否有都会安装该软件包;
b)         当使用-F时,该软件包将被忽略不会被安装;

rpm更新linux内核的命令:

rpm –ivh kernel-version.arch.rpm
备注:更新内核不能使用-U或者-F;如果安装的内核不稳定剩下就是一个不能正常引导的系统了

3.卸载rpm包:执行rpm -e rpm包名。

-e表示--erase。从系统中删除软件,软件包参数必须是已安装的软件包名称,不是软件包的文件名。以下是示例图:

165135739

3)查询

rpm  –q[a |f |p |i |l |d |c]  sudo

[解析]

-a  查询所有已安装的软件包

-f  查询 文件所属软件包

-p  查询软件包(通常用来看下还未安装的软件包

-i  显示软件包信息

-l  显示软件包中的文件列表

-d  显示被标注为文档的文件列表

-c  显示被标注为配置文件的文件列表

[tips]  通常可以配合管道 | more [grep sudo] 来使用,使得结果更易读。

常用命令:

a.安装过的软件包的选项:

rpm –qa 列出所有自己安装的软件包;
rpm –qf filename 显示拥有该文件的软件包,查询某个文件是属于那个rpm包的(这个文件是由哪个软件包安装的);
rpm –qi package_name 显示软件包的一般信息;
rpm –ql package_name 列出软件包中的所有文件;
b.未安装的软件包的选项:

rpm –qip <package_name>.i386.rpm 显示软件包一般信息,查询软件包的详细信息;
rpm –qlp <package_name> .i386.rpm显示软件包文件列表,查该软件包会向系统里面写入哪些文件;

4)校验

rpm  -V  sudo(这里sudo是所要安装的)

结果解析:S.5.L.T….

S 为文件大小

5 为文件的md5校验值

L 链接文件

T 文件创建时间

D 设备文件

U 文件的用户

G 文件的用户组

M 文件的权限

常用命令举例:

1)RPM包校验:
rpm –V package_name 根据rpm数据库来校验已安装的rpm软件包;
rpm -Vp <package_name> .i386.rpm 根据软件包文件来校验已安装的软件包;
rpm –Va 根据rpm数据库来校验所有已安装的软件包;
2)RPM软件包签名校验:
rpm – import RPM-GPG-KEY
RPM-GPG-KEY的实际路径“/etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release”

    红帽发型的每个软件包都有GPG私人签名 ,另外与之对应的公共签名于红帽发行版一起发布;当安装软件包时需要使用公共签名来校验相关软件包文件的完整性,我们必须首先导入公钥

如果没有指定公钥地址,会出现的错误提示!

165256723

 

5)软件包文件提取

解压指定文件到当前目录

rpm2cpio   /../...rpm |cpio –idv   ./../..

这个可以从rpm包中恢复我们误删除的一些文件,加上rpm -qf一起使用。

 

第三部分:bin文件的安装

1:以bin结尾的安装包,这种包类似于RPM包,安装也比较简单(realplayer for Linux就是这样的安装包)

2:打开一个SHELL,即终端

3:用CD 命令进入源代码压缩包所在的目录 (在安装包所在的目录内,空白处右键,在终端打开)

4:给文件加上可执行属性:

chmod +x ******.bin(中间是字母x,小写)

比如:我在 桌面--linux文件夹 里有一个RealPlayer11GOLD.bin,你可以打开在终端,运行root用户,然后cd Desktop/linux

按确定

然后 chmod +x RealPlayer11GOLD.bin 按确定

5:执行命令:./******.bin

比如:./RealPlayer11GOLD.bin

接下来选择安装方式,有普通安装和高级安装两种。如果不想改动安装目录,就可选择普通安装,整个安装过程几乎和在Windwos下一样。

6:ok

 

第四部分:使用deb打包的软件安装

deb是Debian Linux提供的一个包管理器,它与RPM十分类似。但由于RPM出现得早,并且应用广泛,所以在各种版本的Linux中都常见到,而Debian的包管 理器dpkg只出现在Debina Linux中。它的优点是不用被严格的依赖性检查所困扰,缺点是只在Debian Linux发行版中才能见到这个包管理工具。

DPKG 命令常用参数

DPKG 的常规使用方法为 dpkg -? Package(.rpm), 其中 -? 为安装参数 ( 更多信息,请查阅帮助 $man rpm):

  • -l 在系统中查询软件内容信息
  • --info 在系统中查询软件或查询指定 rpm 包的内容信息
  • -i 在系统中安装 / 升级软件
  • -r 在系统中卸载软件 , 不删除配置文件
  • -P 在系统中卸载软件以及其配置文件

DPKG 命令参数使用方法
安装 DEB 包命令

升级 DEB 包命令

卸载 DEB 包命令

查询 DEB 包中包含的文件列表命令

查询 DEB 包中包含的内容信息命令

查询系统中所有已安装 DEB 包

 

DEB 包管理示例

以下步骤描述了一个普通用户安装 IBM Lotus Notes V85 ( 以下简称 Notes) 的典型操作过程。 Notes 的 DEB 包名为 ibm_lotus_notes-8.5.i586.deb.

  1. 首先查询是否该软件是否已经在系统中存在

    如果系统中从未安装过 Lotus 产品,那么返回信息为 :

    如果系统安装过 Lotus 产品,但已被删除,那么返回信息为 :

  2. 查询 Notes 软件包内容:

    返回信息 :

  3. 安装 Notes:

    返回信息 :

  4. 升级 Notes:

    返回信息 :

  5. 卸载 Notes注意卸载软件使用软件名称,而不是包文件名:

 

第五部分:yum安装,需要联网

YUM:RPM的前端程序,解决包依赖性,可以在过个库中定位软件包。
1、YUM命令的使用:
yum list 查看YUM源软件包列表;
yum install [-y] package 安装软件包;
yum remove package 卸载软件包;
yum update 升级安装的软件包;
yum clean all 清除YUM产生的临时文件、记录等;
2、配置额外YUM库:

方法一:在/etc/yum.repos.d目录下新建.repo结尾的文件或者修改原有的repo文件,更方便的是直接下载第三方的yum源的配置文件,如网易163的源文件,参见文章:《centos使用网易163的源和自动匹配源插件yum-fastestmirror

方法二:用光盘搭建本地yum源,但是你会发现很多光盘包含的软件包都比较旧,所以,我不怎么用,当然想了解的话,可以参考《http://iminmin.blog.51cto.com/689308/162666第二部分光盘YUM源的搭建》

 

第六部分:APT安装,需要联网

这是ubuntu的联网安装方式,命令详解如下,参考自《apt-get 使用详解

目前常用的

==========

*更新本机中的数据库缓存:

sudo  apt-get update

 

*查找包含部分关键字的软件包:

sudo  apt-cache search <你要查找的name>

 

*安装指定的软件:

sudo  apt-get install <你要安装的软件包>

 

*下载软件包源代码(如果有的话):

apt-get  source <你要下载的源代码包名>

 

 

详细的资料

=========

http://www.debian.org/doc/manuals/apt-howto/ch-sourcehandling.en.html

apt-get:

 

安装和卸载------

*更新本机中的数据库缓存:

sudo  apt-get update

最好定期更新一下使你自己机器上面的数据和服务器(/etc/apt/sources.list列出)上面的信息保持一致,在安装软件之前可以运行一下这个命令保证成功性。

 

*安装软件:

#apt-get  install packagename

这里将安装你需要的在sources.lists中的最新的软件包,如果有其他依赖则自动安装相应的依赖软件包。packagename可以是多个软件包。

一些有用的选项:

-h  This help text.

-d  Download only - do NOT install or unpack archives

-f  Attempt to continue if the integrity check fails

-s  No-act. Perform ordering simulation

-y  Assume Yes to all queries and do not prompt

-u  Show a list of upgraded packages as well

 

*卸载软件(用install):

#apt-get  install packagename-

在需要卸载的包后面加上一个'-'(我没有实验过),当然可以apt-get install p1 p2-这样多个命令合并了,装p1卸p2。

 

*卸载软件2:

#apt-get  remove packagename

这会卸载相应的软件,同时也会卸载依赖的部分,没办法指定不卸载依赖的。但是软件的配置文件还是会留在系统中。

 

*完全卸载软件包括删除配置:

#apt-get  --purge remove packagename

这样配置文件也会被删除。

 

*安装软件2(用remove):

#apt-get  remove packagename+

这个和用install来卸载软件的意义类似,在包名称后面添加一个+,表示安装。

 

*修复或者只安装最新版本:

#apt-get  --reinstall install packagename

这里,如果你的软件包被破坏了,或者你想要安装一个最新的软件,运行这个。

 

升级软件包------

*升级软件包1:

#apt-get  -u upgrade

这里加上-u选项列出将要升级的软件,可能会提示有些软件不会升级,因为可能会破坏依赖关系,更好的方法是利用apt-get dist-upgrade

你 可以通过cd或者添加源地址来更新,如果你想从cd来升级,首先运行apt-cdrom把cd中的软件添加到/etc/apt/sources源中,然后 运行apt-get dist-upgrade来升级,但是因为apt-get总是使用最新版本,如果cd中的不是最新的版本,那么也不会用到cd。

 

*升级软件包2:

#apt-get  -u dist-upgrade

这样安装的软件前面apt-get -u upgrade安不了的也会安装了,但个别的仍然不能安装,例如:升级会导致需要卸载一些包,卸载这些包会导致另外的软件不能用,所以就不升级了。

 

*升级软件包3:

#apt-get  -u install packagename

假设前面升级的时候packagename无法升级,那么这个命令会升级packagename如果需要卸载默写模块而卸载这些模块导致一些软件无法使用,那么干脆把这些软件都卸载了,然后升级,这个命令会导致packagename最终升级了。

 

清理没用的包文件------

用apt-get 安装软件包的时候,apt会从/etc/apt/sources.list里面将相应的软件包恢复出来,把它们存放在一个本地的文档库中(/var/cache/apt/archives/)然后才开始安装,随着时间的增长,这将不断地消耗硬盘的空间。

 

*清理所有的缓存文件:

#apt-get  clean

这会清理所/var/cache/apt/archives/ 和 /var/cache/apt/archives/partial/中没有被锁定的文件。当然你再次安装软件的时候,这个软件又被恢复到本地文档库中了。

 

*仅仅清理旧的缓存文件:

#apt-get  autoclean

这 会清理旧版本的/var/cache/apt/archives/ 和  /var/cache/apt/archives/partial/中的文件。旧版本是指已经有更新的版本的软件了,再下载的话应下载最新的而不是这个旧 版本的了。根据apt-show-versions  -p可以知道哪些是旧的。

 

*安装指定版本的软件包:

#  apt-get install package=version

 

查找信息--------

 

*查找一个含有packagename字符串的包:

#apt-cache  search packagename

这样将输出所包含packagename字符串的包。

 

*显示软件包的详细信息:

#  apt-cache show stella

这包含了软件包许多的信息,例如如果你已经安装了这个软件包,信息里面也会显示。

 

*显示软件包的大致信息:

apt-cache  showpkg packagename

这会显示大致的信息。

 

*查看那些包可以升级的信息:

$  apt-show-versions -u

这个apt-show-versions工具需要安装一下的。

 

*查看当前特定软件版本:

apt-show-versions  -p packagename

 

*检查packagename依赖的包:

#apt-cache  depends packagename

 

工作相关--------

 

*安装编译源代码需要的库(包):

#  apt-get build-dep packagename

所的源代码包一个'Build-Depends'域,指明了从源代码编译这个包需要安装的软件。上面的命令可以下载这些包,其中'packagename'是包名。

 

 

*查看编译一个包需要哪些其他的库(包):

#apt-cache  show packagename

如果你只是想要检查编译一个包需要哪些其他的包,那么可以利用上面的命令,其中'packagename'是包名。

 

 

*下载包packagename的源代码:

$  apt-get source packagename

这将在当前目录下载个文件:*.orig.tar.gz,*.dsc,*.diff.gz。如果这个包是debian的,那么最后一个文件没有,并且第一个文件名里面不包括"orig"字符串。

.dsc文件被dpkg-source使用,把源代码包解压到目录 packagename-version.每一个下载的源代码包里面都有一个debian/目录,这个目录包含了用于创建.deb包的文件。

 

 

*下载的时候自动把源代码包编译:

$  apt-get -b source packagename

可能是编译成.deb包,我没有试过。

 

*根据下载的源代码创建deb包:

$  dpkg-buildpackage -rfakeroot -uc -b

如果你决定在下载的时候不创建deb包,你可以以后通过在下载的包之后创建的目录里面运行这个命令来创建。

 

*直接利用包管理器安装包:

#  dpkg -i file.deb

需要直接使用包管理器,运行这个命令来安装包。

 

-------dpkg查找

 

*已知软件包中有一个文件,根据文件查找软件包:

#  dpkg -S stdio.h

输入之后,输出如下:

libc6-dev: /usr/include/stdio.h

libc6-dev: /usr/include/bits/stdio.h

perl: /usr/lib/perl/5.6.0/CORE/nostdio.h

这在知道包中某些文件的时候,来根据文件查找软件包这种情况下非常用。

 

*查找安装在你的机器上面的软件包:

dpkg  -l

 

*自动安装缺失的软件:

#  auto-apt run command

这里,command是你要运行的命令。例如 auto-apt run ./configure .当缺失依赖软件的时候,它会询问你安装,方便了编译。安装之后会继续运行。auto-apt需要保持一个最新的数据库,利用这个命令进行更新:auto-apt  update, auto-apt updatedb and auto-apt update-local。

 

--------apt-get查找

 

*利用apt-file根据文件名查找相应的软件包:

$  apt-file search filename

如 果你只知道程序名字filename,那么你可以运行这个命令,它的工作方式和 dpkg  -S差不多,就是根据某个软件包里可能包含的文件来查找这个软件包的名字。另外,它也会显示包含这个文件的没有安装的软件包。当你编译的时候,提示缺了什 么头文件的时候,利用这个很方便地确定需要装哪些软件包(当然利用audo-apt更方便).

 

*列出一个软件包中包含的文件:

$apt-file  list packagename

这里,apt-file是根据一个数据库来读取信息的,所以需要保持数据库是最新的。

 

*更新apt-file的数据库:

#  apt-file update

默认情况下,apt-file的数据库和auto-apt是一样的。

 

本文参考文章如下,(我可能省去了我认为不重要的地方,但是可能会影响读者的理解)建议每篇都看一下:

Linux 平台上的软件包管理》、《Linux 软件包管理》、《apt-get 使用详解》、《Linux软件包管理器

 

 

转载请注明:大步's Blog » linux软件安装方法总结(linux软件包管理)

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
SiteMap