目录:

一、Linux 中软件包的分类

1.源码包


2.二进制包


3.源码包


4.软件安装的选择

二、软件安装之 RPM

1.背景知识


2.准备知识


3.安装升级与卸载


4.查询校验与提取

三、软件安装之 YUM

1.概述


2.YUM 在线安装

四、软件安装之源码包

1.源码包与 RPM 包的区别


2.源码包的安装


3. 测试 http 服务

五、脚本安装包

一、Linux 中软件包的分类:

1.源码包

1.1 源码包的简介

源码包就是各种源代码文件组合而成的压缩包,因为 Linux 是开源的,所以源码包中的源代码是可以查看甚至修改的,用户可以根据自己所需要的功能进行安装。但是源码包在安装的时候需要编译,即从源代码 abcd 编译成机器语言 0101,这个过程需要花费很长的时间。


在 Windows 中的程序都是经过编译的,并且一般认为编译是不可逆的,即反编译(0101->abcd是非常困难的),即使能勉强完成,也会丢失部分代码。也正因为这个原因,在 Windows 中需要用到某个程序,如果该程序向你收费,你也只能乖乖交钱,除非你不用。这也就是 Linux 开源的魅力所在!

1.2 源码包的优缺点

源码包有如下优点:

  1. 开源,如果有足够的能力,可以修改源码包中的源代码;
  2. 可以根据自己的需求选择安装特定功能;
  3. 软件是编译安装,所以更加适合自己的系统,更加稳定高效;
  4. 卸载方便,只需要把安装目录删除,就能不留痕迹。

源码包有如下缺点:

  1. 安装过程步骤多,尤其是安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误;
  2. 编译过程会比较长,所以安装的过程也比二进制包安装时间长;
  3. 对新手不太友好,因为是编译安装,所以一旦报错,新手很难解决。

2.二进制包

2.1 二进制包的简介

二进制包是已经编译好了的包,二进制包中的数据都计算机能直接识别的 0101 ,所以安装起来就省去了编译环节,这样可以节省很多时间。在 Linux 中,Redhat 系列的二进制包一般都是 rpm 包,而 Ubuntu 系列的二进制包一般都是 deb 包。

2.2 二进制包的优缺点

二进制包有如下优点:

  1. 包管理系统简单,只需要敲几个命令就能实现包的安装,升级,查询和卸载;
  2. 安装速度比源码包快得多;

二进制包有如下优点:

  1. 经过编译,不可以再看到源代码,不能根据自己的需求决定安装哪些功能;
  2. 功能的选择不如源码包灵活
  3. 效率不如源码包
  4. 依赖性

3.脚本安装包

3.1 脚本安装包的简介

对于一些复杂的环境搭建(如LAMP),太过于繁琐,有大神就写出了该环境的安装脚本,只需要运行该脚本,所有的东西都能装上。虽然给脚本安装包另外分了一个类,但是脚本安装包实际上还是安装源码包和二进制包。

3.2 脚本安装包的优缺点:

脚本安装包有如下优点:

  1. 安装简单,方便,只需要运行脚本,就能安装脚本包含的所有软件,也不会报错。

脚本安装包有如下缺点:

  1. 完全丧失自定义性,不能按照自己的需求安装需要的功能,安装的功能完全由脚本编写者帮你决定。

4. 软件安装的选择

如果是服务器,推荐源码包安装。因为服务器要被成千上万的人访问,源码包执行效率高。

如果是个人设备,推荐 RPM 包,当然也看个人自己的爱好了,想装什么包就装什么包,谁特么管你。


二、软件安装之 RPM :

1. 背景知识:

RPM包来源与光盘中,所以要先挂载光盘,才可以进行后面的步骤。挂载的示例如下:

  1. 创建挂载点并挂载:
	mkdir /mnt/cdrom
mount /dev/sr0 /mnt/cdrom/
  1. 所有的 RPM 包都在 /mnt/cdrom/Packages/ 中,可用 ls 命令查看,如下图所示:

与挂载相关的内容,可以参考我的另一篇博客:

Linux基础二(挂载、关机重启与系统等级)

2.准备知识

知道了挂载后,还不能直接安装 RPM 包,还必须具备一些关于 RPM 包的准备知识(命名规则和依懒性)

2.1 命名规则

2.1.1 名称格式

如下所示:

httpd-2.2.15-29.el6.centos.x86_64.rpm
其中:
httpd 为包名
2.2.15 为版本号;
29 为软件发布的次数
el6.centos 为其适合的Linux平台
x86_64 为其适合的硬件平台
rpm 是包的扩展名
2.1.2 包名与包全名

包全名指的是完整的包名,包名是开头的第一个单词。


在上面的例子中:


httpd为包名;


httpd-2.2.15-29.el6.centos.x86_64.rpm是包全名

  1. 包全名:在操作没有安装的包的时候(安装和升级),要使用包全名,并且要注意路径(绝对路径或相对路径)
  2. 包名:已经安装了该软件之后,后续对该包的操作(卸载和查询)使用包名就可以了。当使用包名的时候,实际上是去搜索 /var/lib/rpm/ 中的数据库__db.001到__db.004(里面是乱码)

2.2 依赖性

  1. 树形依赖:a->b->c


    解决:装c再装b再装a
  2. 环形依赖:a->b->c->a


    解决:将a、b、c三个包放在一个命令里安装
  3. 模块依赖:也叫库依赖。


    最恶心,依赖以.so.n(n为数字)结尾的库文件,该库文件是 /mnt/cdrom/Packages 目录下的某一个rpm包中的文件,要先安装该包


    解决:如何判断在哪个包中,查询 www.rpmfind.net

3.安装升级与卸载

3.1 安装

命令:

rpm -ivh 包全名
选项:
-i:安装(install)
-v:显示详细信息(verbose)
-h:显示进度(hash)
--nodeps:不检测依赖性(不要用)

用 rpm 命令来安装软件时要注意其依赖性。可以根据 2.2 节中的思路来进行安装。

示例:安装 httpd

1. 进入挂载目录:cd /mnt/cdrom/Packages/
2. 安装 httpd:rpm -ivh http-tab(2次tab)
3. 经过 2. 后会提示几个 rpm 包,其中:
1. httpd-2.2.15-29.centos.x86_64.rpm 为主包
2. httpd-devel-* 为库包
3. httpd-manual-* 为文档包
4. httpd-tools-* 为工具包
4. 一般先安装主包,再安装附加包

注意:有两个100% 才算完成,第一个100% 是准备成功,第二个100% 出现才算安装成功

3.2 升级

命令:

rpm -Uvh 包全名
选项:
-U:升级(Upgrade)
--nodeps:不检测依赖性(不要用)
升级相当于安装一个版本更新的安装包,你也可以用升级命令来安装新包。

3.3 卸载

命令:

rpm -e 包名
选项:
-e:卸载(erase)
--nodeps:不检测依赖性(不要用)

说明:

  1. 卸载时只需输入包名即可,因为该软件包在安装的时候已经写入 /var/lib/rpm/ 中的数据库中了
  2. 卸载命令依然存在依赖性,按照安装时的反序卸载即可
  3. rpm 包在安装时没有指定安装位置,安装位置是该rpm包作者定义好的默认位置(如下图所示),会分布在磁盘的各个部分,若要手工删除不方便,所以才有了卸载命令。
  4. 而源码包没有卸载命令,因为源码包在安装过程中可以指定安装位置,只要把软件包安装位置所在目录删除就会将软件彻底删除。

4.查询校验与提取

4.1 查询

命令:

rpm –q 包名			// 查询指定软件包是否安装
rpm –qa // 查询所有已安装的软件包
rpm –qi 包名 // 查询指定包名的详细信息(里面只有帮助网站有点用)
rpm –qip 包全名 // 查询指定未安装包的详细信息(注意路径)
rpm –ql 包名 // 查询指定软件包都安装在哪些位置了
rpm –qf 系统文件名 // 查询该系统文件属于哪一个软件(必须是已经安装了的软件生成的文件才能反向追查)
rpm -qR 包名 // 查看软件包的依赖关系 (–p 未安装的软件包) 选项:
-q:查询(query)
-a:所有(all)
-i:信息(information)
-p:包(package)
-l:位置(local)
-f:文件(file)

在查询的时候可以灵活应用管道符搭配 grep 命令使用

4.2 校验

命令:

rpm –V 已安装的包名		// 校验指定rpm包中的文件
选项:
-V (verify) 校验
示例:
rpm -V httpd

如果文件未被修改,则不会出现任何提示,若文件被修改,则会出现以下提示:

其中,验证内容(即文件前面的 9 个.和一个c)分别代表:

S:文件的大小是否被改变
M:文件的类型或文件的权限是否被改变
5:文件的MD5校验和是否改变(可看成是文件内容是否改变)
D:设备的主从代码是否改变
L:文件路径是否改变
U:文件的属主(所有者)是否改变
G:文件的属组是否改变
T:文件的修改时间是否改变
c:这个字符所占的位置有以下意义:
c:配置文件
d:普通文档
g:鬼文件,很少见,就是该文件不应该被这个 RPM 包所包含
L:授权文件
r:描述文件

4.3 提取

当某一个软件的某些配置文件被误删除了,导致一些功能执行不了,这时候可以通过来提取命令来将该文件从 RPM 包提取出来。

命令:

rpm2cpio 包全名 | cpio -idv.文件绝对路径
其中:
rpm2cpio 是将 rpm 包转化为 cpio 格式的命令
cpio 是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
| 是管道符

三、软件安装之 YUM :

1.概述

RPM 安装的缺点:依赖性太强,手工安装难度较大。


YUM 安装的也是 RPM 包,其好处是:所有安装包都放在官方服务器上,使用 YUM 进行在线安装时,可以自动解决依赖性问题;当然,如果网络不通,也可以进行本地 YUM 安装。但是,YUM 在线安装对于 RedHat 来说是收费服务(CentOS可以用_)。而且 YUM 也只能实现安装,升级和卸载功能,不支持其他的功能(如查询,YUM的查询只是在服务器上查询相关软件名)。

2.YUM 在线安装

2.1 YUM 源文件

因为 YUM 安装是在线的,所以需要指定安装时所需的源文件从哪里下载。YUM 源文件就是用来指定下载来源的文件,即用来指定下载来源是网络上的某个网站的还是本地哪个文件的。


YUM 源文件保存在 /etc/yum.repos.d/ 目录下,一共有 4 个文件,分别是:CentOS-Base.repo(网络YUM源)CentOS-Debuginfo.repo(调试YUM源)CentOS-Media.repo(光盘YUM源)CentOS-Vault.repo。其中,默认只有第一个是生效的。

CentOS-Base.repo 文件的内容(部分)如下:

# 注释
# 注释
[base]
name=CentOS-$releasever - Base
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://mirror.centos.org/centos/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 [updates]
···
enabled=0
···
[extras]
···
[centosplus]
···
[contrib]
···

其中:


形如 [base] 的是容器名称,base 代表基本安装,update 代表更新等;


name 是容器说明,可以自己随便写;


mirrorlist 是镜像站点,指定了一个网站地址,安装时就从该网站上下载所需的文件,与 baseurl 的作用一样,可以注释掉其中一个;


baseurl 是 YUM 源服务器的地址,默认是 CentOS 官方的 YUM 源服务器,是可以使用的,该服务器在国外,嫌慢的话你也可以改成国内的地址;


enabled 此容器是否生效,生效则 =1,不生效则 =0,不写则默认生效;


gpgcheck 如果是 1 则代表 RPM 的数字证书生效,0 则不生效;


gpgkey 是数字证书公钥文件保存的位置,不用修改。

如果你能联网,直接用第一个YUM源就可以了,如果你闲它太慢可以改成国内的服务器地址。

2.2 光盘搭建 YUM 源

没有网络的情况下,可以用光盘来搭建本地 YUM 源。步骤如下:

  1. 挂载光盘

     mkdir /mnt/cdrom
    mount /dev/sr0 /mnt/cdrom/
  2. 使网络 YUM 源失效,即:使 /etc/yum.repos.d/CentOS-Base.repo 文件失效,因为系统默认选择的 YUM 源文件是网络 YUM 源


    可以通过修改该文件的后缀名使其失效:

     cd /etc/yum.repos.d/
    mv CentOS-Base.repo CentOS-Base.repo.bak
  3. 让光盘 YUM 源生效,即:使 /etc/yum.repos.d/CentOS-Base.repo 文件生效,要改动该文件内的三个地方,如下图所示:






    两张图分别为修改前后的内容。

  4. 验证本地 YUM 源是否搭建完成,可借助 yum list 命令,若在第三列看到 CentOs-Media.repo 的容器名称即 c6-media 则代表搭建成功。

  5. 这样一来,即使不能联网还能通过本地 YUM 源进行软件安装。实际上在生产中很多人也更愿意使用本地 YUM 源进行软件安装。

2.3 YUM 命令

2.3.1 查询命令
yum list 	// 用来查询所有可安装的软件包(不支持本地)
yum search keyword // 搜索和关键字相关的所有软件包

如果我们要使用某个命令提供的服务,如 nslookup 查看 DNS 相关信息,但是系统并没有安装该命令所在的软件包,怎么查询呢?

  1. yum provides */keyword:如 yum provides */nslookup,就能看到该命令属于 'bind-utils' 这个软件包
  2. 接下来用 yum 安装该软件包即可:yum -y install bind-utils
2.3.2 安装升级卸载命令
yum -y install 包名		// 安装软件包(自动解决依赖关系)
选项:
-y 自动回答 yes
例如:
yum -y install gcc // gcc 是 C 语言编译器 yum –y update 包名 // 升级软件包,不写包名会升级所有
// 必须要有更高版本的软件包,个人可以升级,服务器上不建议(除非是严重漏洞) yum –y remove 包名 // 卸载软件包

注意:服务器上应使用最小化安装,用什么装什么,尽量别用 YUM 卸载!因为会卸载掉相关的依赖包,包括系统内核所依赖的包!

Yum软件组管理命令:

yum grouplist			// 列出若有可用的软件组列表

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

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

说明:


对于一些复杂的软件(如中文支持),用组比较方便。


在远程工具上,yum grouplist 会用中文显示软件组名,但是安装敲命令的时候必须要用英文组名,我们可以修改系统默认语系:LANG=en_US 即可。要改回中文语系,可以用 LANG=zh_CN.utf8 命令。这是临时生效,要永久生效需要在文件 /etc/sysconfig/i18n 中修改(shell的环境变量中有详细)。

这边推荐一个用yum查询命令所属软件包的方法


四、软件安装之源码包的安装:

1.源码包与 RPM 包的区别

1.1 安装前的区别

我们在上面对软件包的分类中,有提到源码包和二进制包的优缺点,在这里就不再赘述。实际上,上面提到的优缺点是在软件安装之前体现出来的差别,但是源码包与二进制包(RPM)在安装后还有一些区别。安装前的区别主要是在概念上有所不同,可以简单地理解为编译前和编译后的不同;而安装后的区别主要是安装位置的区别,而由安装位置的区别又造成后续的管理方法的不同。

1.2 安装后的区别

1.2.1 RPM 包的安装位置

在上文中已经贴有一张图,这边再贴一次:

实际上,安装者并不能决定 RPM 包安装的位置,而 RPM 包的安装位置是由编写该安装包的作者定义的,所以我们在安装的时候并不需要指定安装位置。上图是一个常见的 RPM 包所安装的目录,不代表所有的安装包都按照这个目录进行安装。


不过 RPM 包还是支持指定安装位置的,由命令:rpm --prefix=<dir> 实现。但是我们并不建议指定 RPM 包的安装位置,原因如下:

  1. 若不指定安装位置,则会按照默认的位置安装,系统可以正常调用;
  2. 若指定安装位置,则系统会去默认的安装位置中找,反而找不到;
  3. 但是不指定安装位置,默认的安装位置会很零散,到处都是,但是我们还有卸载命令 rpm -e 包名
1.2.2 源码包的安装位置

源码包的安装位置可以随意指定,但是为了方便管理,我们通常安装在 /usr/local/软件名/ 目录下,软件安装包可以保存在 /usr/local/src/ 目录中。但是我们为什么要指定源码包的安装位置呢?因为源码包并没有卸载命令,若不指定安装位置,则会装得到处都是,当我们想要卸载该软件时删起来很麻烦;若指定了安装位置,删除安装目录即可。

1.2.3 管理(启动)方法不同

管理方法的不同实际上就是启动方法的不同:

  1. RPM 包在安装时,若不指定安装位置,则会安装在默认位置,同时将启动程序放在 /etc/rc.d/init.d/ 目录下,可以通过 service 软件名 start|stop|restart 命令管理软件。
  2. 源码包在安装时,并不会将启动程序放在该目录下,所以也不能用 service 命令其管理源码包安装的程序,所以只能用绝对路径来启动或关闭。当然啦,也可以将该软件的启动程序(以apache为例默认放在/usr/local/apache2/bin/apachectl目录下)复制到该目录下然后用 service 命令来管理。

此外,还有一些命令也只能针对 RPM 包安装的服务使用,如:查看服务自启动状态的命令 chkconfig --list 和管理服务自启动的命令 ntsysv,默认情况下均不能对源码包使用。

2.源码包的安装

2.1 安装前的准备工作

  1. 安装 C 语言编译器gcc:因为在 Linux 中,所有的源代码包都使用 C 语言编写的,所以我们需要确保在安装源码包之前已经安装了 C 语言编译器。值得注意的是,gcc 必须要用二进制包安装,因为 gcc 的源码包也是 C 语言编写的,需要进行编译才能安装。
  2. 下载源码包:安装完了 gcc 之后,我们可以去官网下载源码包,如 Apache 官网下载地址是 http://mirror.bit.edu.cn/apache/httpd。新手练习的话可以下载 2.2 版本的 Apache 源码包,因为它不会报错

2.2 注意事项

  1. 源码包的保存位置:/usr/local/src/。其中,usr是用户资源;local是本地;src指源码包
  2. 软件安装位置:/usr/local/软件名/。其中,usr是用户资源;local是本地
  3. 如何确定安装报错?
	① 安装过程停止(只有安装过程停止了才能判断)
② 看是否出现 error|warning|no 的提示(只需要看最后几行即可)

2.3 安装过程(固定不变)

  1. 下载源码包
  2. 解压下载的源码包
  3. 进入压缩目录(必须执行,因为后续操作都在该目录下进行)
  4. 执行 ./configure 软件配置与检查 命令,可看成是编译前的准备(基本上每个源码包都有这个命令或者类似的命令),执行完成会生成(写入) MakeFile 文件,后续依赖该文件进行安装


    作用如下:
	① 定义需要的功能选项:
./configure --help 命令可以看到支持的功能选项,需要的话在安装的时候加上即可
如:./configure --prefix=/usr/local/apache2
其中,--prefix 选项的作用是在安装时会自动创建 /usr/local/apache2/ 这个目录,并将安装期间产生的一系列文件都复制到该目录下
② 检测系统环境是否符合安装要求
如:检测是否安装了 gcc
③ 把定义好的功能选项和检测系统环境的信息,都写入 MakeFile 文件,用于后续的编辑
  1. 执行 make 命令进行编译。检查有无报错,若报错可使用 make clean 清除编译产生的缓存文件,恢复到 make 之前的状态,再想办法。


    截止到目前,若出现错误,无需删除 /usr/local/apache2 目录,因为还没安装
  2. 执行命令make install对软件进行安装。检查有无报错,若报错则删除安装目录;若没报错可以进入安装目录查看相关文件
  3. 启动该软件:以 httpd 为例执行 /usr/local/apache2/bin/apachectl start


    注:如何知道 Apache 的启动文件是 apachectl ?


    在解压的源码包中有一个 INSTALL 文件,里面有相关信息如下图所示:
![INSTALL文件](https://i.imgur.com/cXYSiPb.png)
  1. 去浏览器上输入 IP 地址测试服务是否开启成功啦,若访问不了可以试试关闭 Linux 上的防火墙(setup)

2.4 卸载

源码包无卸载命令,直接删除安装目录即可

3. 测试 http 服务

3.1 RPM 包的 http 服务

网页保存位置是:/var/www/html/,里面默认是空的,可以自己创建一个文件 index.html

3.2 源码包的 http 服务

网页保存文件是:/usr/local/apache2/htdocs/index.html,可以 vi 进行编辑


五、脚本安装包:

脚本安装包在本文一开始的分类中有介绍,很简单,只要执行该脚本即可,脚本安装包实际上还是安装 RPM 包或源码包。这里就不再不再赘述。


对于搭建复杂的环境 LNMP(Linux,Nginx,MySQL,PHP) 可以使用脚本安装包,这边推荐一个网站:https://lnmp.org/

最新文章

  1. 用jquery实现瀑布流案例
  2. 最喜欢的算法(们) - Levenshtein distance
  3. oracle-day1
  4. 自定义ConfigurationSection,创建多个嵌套的ConfigurationElementCollection节点
  5. 调用微信退款接口时出现System.Security.Cryptography.CryptographicException: 出现了内部错误 解决办法
  6. 【转】C# 中访问修饰符
  7. DB天气app冲刺二阶段第七天
  8. 开发一个struts2的实例
  9. freemarker跳出循环
  10. 奇妙的go语言(聊天室的开发)
  11. Android - 不管在应用的哪个activity按Home键整个App就结束了
  12. 老李推荐:第6章3节《MonkeyRunner源码剖析》Monkey原理分析-事件源-事件源概览-命令翻译类
  13. 如何seo(搜索引擎优化)
  14. 巧用JSON
  15. .NET高级代码审计(第五课) .NET Remoting反序列化漏洞
  16. 几句话的事儿,LogBack急速使用
  17. .NET 开发套装
  18. 社交类APP原型模板分享——Tinder
  19. android handler messageQueue,looper
  20. Visual Basic的未来之路

热门文章

  1. Netty入门(十)解码分隔符和基于长度的协议
  2. 关于Netty Pipeline中Handler的执行顺序问题
  3. 分享一个excel根据文件超链接获取链接文档的最后更新时间
  4. Python2.7-canlendar
  5. 纯css实现弹窗左右垂直居中效果
  6. jpbm工作流框架
  7. 没事做的Delphi版的俄罗斯方块游戏Demo
  8. # 2017-2018-2 20155319『网络对抗技术』Exp4:恶意代码分析
  9. mfc Unicode转 ASNI ,WCHAR 转 CHAR
  10. UCOSII笔记---信号量、邮箱、消息队列、信号量集、软件定时器