0%

Linux/Unix下的程序安装

个人对Linux程序安装的理解

软件包的分类

源码包

优点
  • 开源,如果有足够的C语言编程能力,可以修改源代码;
  • 可以自由选择所需要的功能
  • 软件是编译安装,所以更加合适自己的系统,更加稳定也更加高效
  • 卸载方便。(直接卸载安装目录即可,具体请参考下文)
缺点
  • 安装过程步骤较多,尤其安装大型的软件集合时(如LAMP环境的搭建),容易出现拼写错误
  • 编译时间比二进制包的安装要长
  • 编译过程中一旦报错,新手很难解决问题,所以源码包安装并不适合初学者

二进制包(rpm包、系统默认包等等,下文我们统一视为rpm包)

优点
  • 包管理系统简单,只通过几个简单的命令就可以实现包的安装、升级、查询和卸载
  • 安装速度比源码包安装快得多
缺点
  • 已经编译好的包,所以不能看到源代码
  • 功能选择不如源码包灵活
  • 依赖性(用过maven或者composer的小伙伴应该清楚,当我装软件包A,如果A要用到软件包B,B又要用到软件包C,那我就必须先装C,再装B,最后再装A)
依赖性详解
  • 树形依赖:a->b->c
  • 环形依赖:a->b->c->a
  • 模块依赖:a->b,而b是一个C的函数库,以so的后缀结尾,它具体在哪个包下面就要去网站上面查了:模块依赖查询站点

脚本安装包

通过shell脚本,把复杂的软件包安装过程写成了程序脚本,初学者可以执行程序脚本实现一键安装。但实际安装的还是源码包和rpm包。

大家可以参考我的一个lnmp环境自动搭建的脚本包,源代码如下: lnmp

优点

安装简单、快捷

缺点

完全丧失了自定义性。(不过这也算不上缺点,因为脚本本身也是开源的,只要你有shell编程的能力,也可以进行自定义安装)

软件包的命名规则

rpm包

我们以下面这个为例:”httpd-2.2.15-15.el6.centos.1.i686.rpm”。

  • httpd表示软件包名称
  • 2.2.15表示软件版本
  • 15表示软件的发布次数
  • el6.centos表示适合的Linux平台
  • i686表示适合的硬件平台
  • rpm表示包的扩展名

安装位置

rpm

如果是使用rpm包进行安装的话,虽然rpm可以指定安装位置,但我们一般还是不要指定位置,直接安装即可。因为rpm包默认安装后,系统可以;对它的启动、删除进行快捷的管理。

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

源码包

安装的时候,一般位于“/usr/local/软件名”下面。因为通过源码进行安装,不向通过rpm安装一样有卸载命令,它是没有卸载命令的,所以统一安装在指定的目录下。一旦我们没有指定安装目录,那么系统将会按照rpm的流程来进行安装(安装在系统的“各个目录”),且没有卸载命令,所以删除的时候就头疼着吧。

指定位置

那么源码安装的时候,我们如何去指定它的安装位置呢?

很简单,一般源码包下面都会有类似于configure的文件。

我们可以通过输入以下命令

./configure -help

来查看这个命令到底有什么用,在打印出来的列表中可以看到一个prefix命令就是用来指定安装位置的。

比如,要指定安装位置为/usr/local/project,那就是

./configure --prefix=/usr/local/project

注意,这个等于号之间不能有空格。

rpm跟源码包的区别

  • rpm是闭源项目,是已经编译好的程序,而源码包则是开源程序,在安装之前要先进行编译。

  • rpm安装的服务可以使用系统服务管理命令(service)来管理,例如rpm安装的apache的启动方法是:

    /etc/rc.d/init.d/httpd start
    或者
    service httpd start

    而源码包安装的服务则不能被服务管理命令管理,因为没有安装到默认的路径中。所以只能使用绝对路径进行管理。如:

    /usr/local/apache2/bin/apachectl start

    但我们也有取巧的办法,来让service启动:把apachectl这个文件拷贝到/etc/rc.d/init.d目录下,就可以了。

  • rpm因为是厂商提前编译好的,所以在执行效率上,会比在本机编译的源码包低。

安装前提

rpm

首先我们先理解一下rpm包的“包全名”与“包名”这两个概念

  • 包全名

    操作的包是没有安装的软件包时,使用包全名。而且要注意路径。

  • 包名

    操作已经安装的软件包时,使用包名(一般就是它的项目名),是搜索/var/lib/rpm/中的数据库。

rpm包的校验
rpm -V 已安装的包名
  • -V 校验指定的rpm包中的文件(verify)

如果上述命令执行后,没有返回信息出现,那说明一切正常,如果有,那么就说明它要搞事情了:

  • S 文件大小是否改变
  • M 文件的类型或者文件的权限(rwx)是否被改变
  • 5 文件MD5校验和是否被改变(可以理解为文件内容是否改变)
  • D 设备的主从代码是否改变
  • L 文件路径是否改变
  • U 文件的所有者是否改变
  • G 文件的属组是否改变
  • T 文件的修改时间是否改变

这里补充一下文件类型的知识,因为返回信息的最后,会出现一个当前文件的类型:

  • c 配置文件(config file)
  • d 普通文档(documentation)
  • g “鬼”文件(ghost file),很少见,就是该文件不应该被这个RPM所包含
  • L 授权文件(license file)
  • r 描述文件(read me)
rpm包中文件的提取
rpm2cpio 包全名 | cpio -idv .文件绝对路径
  • rpm2cpio 将rpm包转换为cpio格式的命令
  • cpio 是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
    • -i copy-in模式,还原
    • -d 还原时自动新建目录
    • -v 显示还原过程

源码包

  • 要有C编译器

    我们可以通过以下的命令来检查系统有没有C编译器:

    rpm -qa | grep gcc

    当然,如果我们使用类Unix的系统,比如说Mac OS,我自己的电脑用的就是,这种情况下,我打上面的命令是不会有结果的,因为Unix本身就可以编译C语言,不需要额外的服务。

  • 下载到程序的源码包,将其保存在/usr/local/src目录下,这个目录保存程序源码。安装目录则在它的上一级目录下。

安装、升级与卸载

rpm

安装命令
rpm -ivh 包全名
  • -i(install) 安装
  • -v(verbose) 显示详细信息
  • -h(hash) 显示进度
  • –nodeps 不检测依赖性(这个命令在正式服务器环境上就没有用过,也不要去用)
查询命令

我们手动的安装rpm包才可以通过查询命令查询到,如果通过yum命令进行安装,那么就不能够使用查询命令。

  • 查询

    rpm -q 包名(查询包是否安装,-q query)
    
    rpm -qa (查询所有已经安装的rpm包,-a all)
    
    rpm -qi 包名(同时查询包安装的详细信息,比如安装时间等等)
    
    rpm -qip 包全名(查询还没有安装的包信息)
    
    rpm -ql 包名 (-l 查询包中各个文件的安装位置)
    
    rpm -qf 系统某一个文件名(-f 查询系统文件属于哪个软件包)
    
    rpm -qR 包名(-R 查询软件包的依赖性,但这个命令其实意义不大,因为我们需要的只是缺少什么依赖)

    rpm -qa一般配合管道符“|”来使用,比如

    rpm -qa | grep http 就表示去查询包含http关键字的所有已安装的包名
升级命令
rpm -Uvh 包全名(比当前版本更高的包,如果没有下载过,那么这个命令就是纯粹的安装命令,如果版本没有旧包的高,那么将不会进行安装)
  • -U(upgrade) 升级
卸载命令

在卸载之前,如果包有自己的依赖,那么必须先把依赖的包进行删除(同样的命令),再来删除要卸载的包

rpm -e 包名
  • -e(erase) 卸载

yum

将所有软件包放到官方服务器上,当进行yum在线安装时,可以自动解决依赖性问题。

插曲

redhat的yum服务是收费的,CentOS的yum服务是免费的,所以本人接手过的10几台服务器清一色的CentOS。

yum也有配置文件噢

这个配置文件位于:/etc/yum.repos.d/CentOS-Base.repo。
下面,对它的一些参数做一个备注

  • [base] 容器名称,一定要放在[]中
  • name 容器说明,可以自己随便写
  • mirrorlist 镜像站点,这个可以注释掉(因为mirrolist和baseurl两者保留一个即可)
  • baseurl 我们的yum源服务器的地址。默认是CentOS官方的yum源服务器,是可以使用的,如果觉得慢可以改成自己喜欢的yum源地址
  • enabled 此容器是否生效,如果不写或者写成enable=1都是生效的意思,写成enable=0就是不生效
  • gpgcheck 如果是1是指rpm的数字证书生效,如果是0则不生效
  • gpgkey 数字证书的公钥文件保存位置。不用修改
查询命令
yum list 
#查询所有可用软件包列表

yum search 关键字
#搜索服务器上所有和关键字相关的包
安装命令
yum -y install 包名
  • -y 自动回答yes
  • install 下载
升级命令
yum -y update 包名

但是请注意,这是一条非常危险的命令,因为一旦我们没有输入包名,只打了一个yum -y update ,那就意味着升级Linux下面所有的程序…包括我们的Linux内核

更新Linux内核意味着什么?

意味着我们之前对服务器内核做的所有配置全部狗带,新的服务器内核啥配置也没做(Linux新的内核必须人为配置内核后才能够启动),如果我们的是远程服务器,比如我常用的阿里云ECS,那基本意味着系统瘫痪了….

所以对于CentOS6.3及以前的版本,一条简单的yum -y update 就能够直接瘫痪系统。

理由:

就像我们前文说到的,安装软件有它的依赖性,那么卸载软件同样有它的依赖性。而我们在卸载软件的时候,并不能保证它有没有被系统的软件所依赖。

卸载命令
yum -y remove 包名

但尽量不要去使用卸载命令
因为管理服务器应该有以下的原则:
服务器使用最小化安装,用什么软件安装什么,尽量不卸载。

软件组管理命令
yum grouplist 
# 列出所有可用的软件组列表

yum groupinstall 软件组名
# 安装指定软件组,组名可以由grouplist查询出来

yum groupremove 软件组名
# 卸载指定软件组

源码包

  • 解压源码包并进入源码包目录

  • 通过./configure进行软件的配置与检查:(一般而言,每个源码包下面都会一个INSTALL或者README文件,说明如何进行configure)

    • 定义需要的功能选项,具体的选项可以通过./configure –help来查看
    • 检查系统环境是否符合安装要求
    • 把定义好的功能选项和检测系统环境的信息都写入Makefile文件,用于后续的编辑
  • 通过make, make install 进行编译。
    如果在make的过程中,有error等错误信息产生,那么先执行make clean再去检查错误原因,如果是make install过程报错了,那就只能删除整个目录从头再来。