一、软件包分类
1、软件包分类
- 源码包
- 二进制包
2、源码包
2.1 源码包什么样
直接由编程语言写成,没经过编译。类似于java的 .calss 文件,c的 .c文件。
[root@love2 ~]# vim hello.c
#include <stdio.h> int main (void) {
printf ("hello world
");
}
[root@love2 ~]# gcc -c hello.c
# - c 生成“ .o ”头文件。这里会生成 hello.o 头文件,但是不会生成执行文件
[root@love2 ~]# gcc -o hello hello.o
# - o 生成执行文件,并制定执行文件名。这里生成的 hello 就是可执行文件
[root@love2 ~]# ./hello
hello world
# 执行 hello 文件
2.2 源码包特点
源码包的优点:
- 开源,如果有足够的能力,可以修改源代码
- 可以自由选择所需的功能
- 软件是编译安装,所以更加适合自己的系统,更加稳定也效率更高
- 卸载方便
源码包有缺点:
- 安装过程步骤较多,尤其安装较大的软件集合时(如 LAMP 环境搭建),容易出现错误
- 编译过程时间较长,安装比二进制安装时间长
-因为是编译安装,安装过程中出现问题比较难以解决
3、二进制包
3.1 二进制包分类
DPKG 包:是由 Debian Linux 所开发出来的包管理机制,通过 DPKG 包,Debian Linux 就可以进行软件包管理。主要应用在 Debian 和 unbuntu 中。
RPM 包:是由 Red Hat 公司所开发的包管理系统。功能强大,安装、升级、查询和卸载 都非常简单和方便。目前很多 Linux 都在使用这种包管理方式,包括 Fedora、CentOS、 SuSE 等。
3.2 特点
RPM 包的优点:
- 包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
- 安装速度比源码包安装快的多 RPM 包的
缺点:
- 经过编译,不再可以看到源代码
- 功能选择不如源码包灵活
- 依赖性。有时候复杂一点的软件包依赖于别的软件包才能安装,而别的软件包有依赖于另外的软件包。非常麻烦。
3.3 RPM包依赖
1)树形依赖 a---->b---->c
2)环形依赖 a---->b---->c---->a
以上两种情况,我们可以用命令一次将所需要的软件包全部安装,就不需要考虑依赖性问题。
3)函数库依赖 :a软件包依赖与另外软件包中的函数库或者模块,我们需要找到该模块或者该函数库对应的软件包。可通过该网站查询www.rpmfind.net 。
二、rpm安装
1.rpm包命名规则
httpd-2.2.15-15.el6.centos.1.i686.rpm
#httpd 软件包名
#2.2.15 软件版本
#15 软件发布的次数
#el6 软件发行商。el6 是 RedHat 公司发布,适合 RHEL6.x(Red Hat Enterprise Linux)和 CentOS6.x 下使用 i686 适合的硬件平台。
RPM 包可以在不同的硬件平台安装,选择适合不同 CPU 的软件版本,可以最大化的发挥 CPU 性能,所以出现了所谓的 i386(386 以上计算机都可以安装)、
i586(586 以上的计算机都可以安装)、i686(奔腾 II 以上计算机都可以安装,目前所有的 CPU 都是 奔腾 II 以上,所以这个软件版本居多)、
x86_64(64 位 CPU 可以安装)和 noarch(没有硬 件限制)等文件名了。
#rpm 包的扩展名 Linux 下文件不是靠扩展名区分文件类型,也就是 Linux 中扩展 名没有任何含义。可是这里怎么又出现了扩展名呢?
原因很简单,如果我不把 RPM 的扩展名 叫做“.rpm”,管理员很难知道这是一个 RPM 包,当然也就无法正确安装了。
也就是说如果 RPM 包不用“.rpm”作为扩展名,系统可以正确识别没有问题,可是管理员很难识别这是个什么样的软件。
包全名:如果操作的是未安装软件包,则使用包全名,而且需要注意绝对路径
包名:如果操作的是已经安装的软件包,则使用包名即可,系统会生产 RPM 包的数据库(/var/lib/rpm/)。
2.rpm包手工命令安装
2.1 默认安装位置
目录 | 作用 |
---|---|
/etc/ | 配置文件目录 |
/usr/bin/ | 可执行命令目录 |
/usr/lib/ | 程序使用的函数库保存位置 |
/usr/share/doc/ | 软件基本使用手册保存位置 |
/usr/lib/ | 帮助文档保存位置 |
2.2 RPM 包安装
1)安装命令
rpm –ivh 包全名 # 注意一定是包全名。如果跟包全名的命令 要注意路径,因为软件包在光盘当中。
选项:
-i install 安装(install)
-v 显示更详细的信息(verbose)
-h 打印#显示安装进度(hash)
--nodeps 不检测依赖性安装。软件时会检测依赖性,确定所需的底层软件是否安装。 如果没有安装则会报错。不管依赖性,强行安装。这样不检测依赖性安装的软件基本是不能使用的,所以不建议这样做。
--replacefiles 替换文件安装。如果安装软件包,可是包中部分文件已经存在,那么 正常安装时候,会报错“某个文件已经存在”从而导致软件无法安装,使用这个选项可 以忽视这个报错,而覆盖安装。
--replacepkgs 替换软件包安装。如果软件包已经安装,此选项可以把软件包重复安装一遍。
--force 强制安装。不管是否已经安装,都重新安装。就是—replacefiles 和 —replacepkgs 的综合。
--test 测试安装。不会实际安装,只是检测一下依赖性。
--prefix 指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。注意: 如果指定了安装路径,软件没有安装到系统默认路径中的话,系统会找不到这些安装的软件,需要进行手工配置才能被系统识别。所以 rpm 包我们一般都采用默认路径安装。
2)服务启动
[root@localhost ~]# service 服务名 start|stop|restart|status
参数:
start: 启动服务
stop: 停止服务
restart: 重启服务
status: 服务状态
2.3 RPM 包升级
[root@localhost ~]# rpm –Uvh 包全名
选项:
-U(大写) 升级安装,如果没有安装过,系统直接安装。如果安装过的版本较旧,则升级到新版本(upgrade)
[root@localhost ~]# rpm –Fvh 包全名
选项:
-F(大写) 升级安装,如果没有安装过,则不会安装。必须安装有较旧版本,才能升级(freshen)
2.4 卸载
[root@localhost ~]# rpm -e 包名
选项:
--nodeps 不检查依赖性
-e 卸载
2.5 查询
1)查询软件包是否安装
可以查询软件包是否安装
[root@localhost ~]# rpm –q 包名
选项:
-q: 查询(query)
2)查询系统中的所有安装软件包
可以查询 Linux 系统中所有已经安装的软件包
[root@localhost ~]# rpm -qa
选项:
-a:所有(all)
3)查询软件包的详细信息
可以查询已经安装的某个软件包的详细信息
[root@localhost ~]# rpm –qi 包名
选项:
-i: 查询软件信息(information)
查询还没有安装的软件包的详细信
[root@localhost ~]# rpm –qip 包全名
选项:
-p: 查询没有安装的软件包(package)
4)查询软件包中的文件列表
可以查询已经安装的软件包中的文件列表和安装的完整目录
[root@localhost ~]# rpm –ql 包名
选项:
-l: 列出软件包中所有的文件列表和软件所安装的目录(list)
查询还没有安装的软件包中的文件列表和打算安装的位置
[root@localhost ~]# rpm –qlp 包全名
选项:
-p: 查询没有安装的软件包信息(package)
5)查询系统文件属于哪个 RPM 包
[root@localhost ~]# rpm –qf 系统文件名
选项:
-f: 查询系统文件属于哪个软件包(file)
6)查询软件包所依赖的软件包
查询系统中和已经安装的软件包有依赖关系的软件包
[root@localhost ~]# rpm –qR 包名
选项:
-R: 查询软件包的依赖性(requires)
可以查询没有安装的软件包的依赖性吗?加“-p”选项即可。例如,查看一下还没有安装的 httpd 软件包的依赖包,可以执行如下命令:
[root@localhost ~]# rpm -qpR /mnt/cdrom/Packages/httpd-2.2.15-53.el6.centos.x86_64
2.6 验证
1)基本命令
[root@localhost ~]# rpm –Va
选项:
-Va 校验本机已经安装的所有软件包
[root@localhost ~]# rpm –V 已安装的包名
选项:
-V 校验指定 RPM 包中的文件(verify)
[root@localhost ~]# rpm –Vf 系统文件名
选项:
-Vf 校验某个系统文件是否被修改
2)验证举例
[root@localhost ~]# rpm -V httpd
S.5....T. c /etc/httpd/conf/httpd.conf
验证内容 文件类型 最后是文件名。
那么验证内容中的 8 个信息的具体内容 如下:
S 文件大小是否改变
M 文件的类型或文件的权限(rwx)是否被改变
5 文件 MD5 校验和是否改变(可以看成文件内容是否改变)
D 设备的主从代码是否改变
L 文件路径是否改变
U 文件的属主(所有者)是否改变
G 文件的属组是否改变
T 文件的修改时间是否改变
apache 配置文件的文件类型是 c,那么还有哪些文件类型呢?
c 配置文件(config file)
d 普通文档(documentation)
g “鬼”文件(ghost file),很少见,就是该文件不应该被这个 RPM 包
l 授权文件(license file)
r 描述文件(read me)
2.7 数字证书
上面的校验方法只能对已经安装的 RPM 包中的文件进行校验,但是如果 RPM 包本身就被动过手脚, 那么校验就不能解决问题了。
我们就必须使用数字证书验证了。首先必须找到原厂的公钥文件,然后进行安装 ,再安装 RPM 包是。
用rpm命令安装软件时会去提取 RPM 包中的证书信息,然后和本机安装的原厂证书进行验证,如果验证通过,则允许安装;如果验证不通过,则不允许安装并警告。
1)数字证书位置
[root@love2 yum.repos.d]# ll /mnt/cdrom/RPM-GPG-KEY-CentOS-6
-r--r--r-- 2 root root 1706 11月 27 2013 /mnt/cdrom/RPM-GPG-KEY-CentOS-6
2)数字证书导入
[root@localhost ~]# rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
选项:
--import 导入数字证书
#查询已经安装的证书
[root@love2 yum.repos.d]# rpm -qa | grep gpg-pubkey
gpg-pubkey-c105b9de-4e0fd3a3
2.8 RPM包中文件的提取
有时候我们会将某些软件的文件误删,所以我们可以通过命令提取特定文件。
1)使用命令 rpm2cpio+ cpio
[root@localhost ~]# rpm2cpio 包全名 | cpio -iduv .文件绝对路径
rpm2cpio 将 rpm 包转换为 cpio 格式的命令
cpio 是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
cpio还原时,命令解释。
-i:copy-in 模式,还原
-v:显示还原过程
-c:使用较新的 portable format 存储方式
-d:还原时自动新建目录
-u:自动使用较新的文件覆盖较旧的文件
2)示例、假如我们不小心 将位于 /bin/find 删掉了。我们可以通过以下步骤恢复
1、先查出该命令对应的软件包名
[root@love2 ~]# rpm -qf /bin/find
findutils-4.4.2-9.el6.x86_64
2、提取文件到当前文件下
[root@love2 ~]# rpm2cpio /mnt/cdrom/Packages/findutils-4.4.2-9.el6.x86_64.rpm | cpio -iduv ./bin/find
3、将find命令移动到/bin目录下
[root@love2 ~]# mv bin/find /bin/
三 、rpm包在线安装(yum安装)
3.1 yum源文件解析
yum 源配置文件保存在/etc/yum.repos.d/目录中,文件的扩展名一定是“.repo”。也就是说, yum 源配置文件只要扩展名是“.repo”就会生效。
[root@love2 ~]# ls /etc/yum.repos.d/
bak CentOS-Media.repo
#由于我配置了光盘yum源,所以将其他 .repo 文件移动了一下。
配置文件详情如下
[base]:容器名称,一定要放在[]中
name:容器说明,可以自己随便写。
mirrorlist:镜像站点,这个可以注释掉。
baseurl:我们的 yum 源服务器的地址。默认是 CentOS 官方的 yum 源服务器,是可以使用的。 如果你觉得慢,则可以改成你喜欢的 yum 源地址。
enabled:此容器是否生效,如果不写或写成 enabled=1 则表示此容器生效,写成 enabled=0 则表示此容器不生效。
gpgcheck:如果为 1 则表示 RPM 的数字证书生效;如果为 0 则表示 RPM 的数字证书不生效
gpgkey:数字证书的公钥文件保存位置。不用修改。
3.2 搭建本地光盘yum源
第一步:放入 CentOS 安装光盘,并挂载光盘到指定位置
[root@love2 ~]# mkdir /mnt/cdrom # 创建 cdrom 目录,作为光盘的挂载点
[root@localhost ~]# mount /dev/sr0 /mnt/cdrom/ #挂载
第二步:修改其他几个 yum 源配置文件的扩展名,让它们失效,因为只有扩展名是“*.repo”的 文件才能作为 yum 源配置文件。当然你也可以将不需要的移动到另外的目录。
自行选择
第三步:修改光盘 yum 源配置文件 CentOS-Media.repo,参照以下方法修改:
[c6-media]
name=CentOS-$releasever - Media
baseurl=file:///mnt/cdrom/
# file:///media/cdrom/
# file:///media/cdrecorder/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
第四步 清除原先yum缓存,并且建立新的缓存
yum clean all && yum makecache
3.3 yum命令
1)查询
查询 yum 源服务器上所有可安装的软件包列表
[root@love2 bak]# yum list
查询 yum 源服务器中是否包含某个软件包。
[root@love2 bak]# yum list bind
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
可安装的软件包
bind.x86_64 32:9.8.2-0.47.rc1.el6 c6-media
搜索 yum 源服务器上所有和关键字相关的软件包
[root@love2 bak]# yum search apache #搜索包含有apache关键字软件包
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
======================================================== N/S Matched: apache ========================================================
ant-apache-bcel.x86_64 : Optional apache bcel tasks for ant
ant-apache-bsf.x86_64 : Optional apache bsf tasks for ant
查询指定软件包的信息
[root@love2 bak]# yum info bind
已加载插件:fastestmirror, security
Loading mirror speeds from cached hostfile
可安装的软件包
Name : bind
Arch : x86_64
Epoch : 32
Version : 9.8.2
Release : 0.47.rc1.el6
Size : 4.0 M
Repo : c6-media
...
2)安装
[root@love2 yum.repos.d]# yum -y install 包名
选项:
install 安装
-y 自动回答 yes。如果不加-y,那么每个安装的软件都需要手工回答 yes
3)升级
[root@love2 yum.repos.d]# yum -y update 包名
# 升级指定的软件包
选项: update: 升级
-y: 自动回答 yes
[root@love2 yum.repos.d]# yum -y update
# 升级本机所有软件包
4)卸载
[root@love2 yum.repos.d]# yum remove 包名
# 卸载指定的软件包
3.4 yum组管理命令
1)查询可以安装的软件组
[root@love2 ~]# yum grouplist
# 列出所有可用的软件组列表
2)查询软件组内包含的软件
[root@love2 ~]# yum groupinfo 软件组名
# 列出软件组中包含的软件
例:
[root@love2 bak]# yum groupinfo Emacs
已加载插件:fastestmirror, security
设置组进程
Loading mirror speeds from cached hostfile
组:Emacs
描述:GNU Emacs 可扩展、可自定义的文本编辑器。
必要的软件包:
emacs
可选的软件包:
ctags-etags
emacs-auctex
emacs-gnuplot
emacs-nox
3)安装软件组
[root@love2 ~]# yum groupinstall 软件组名
# 安装指定软件组,组名可以由 grouplist 查询出来
4)移除软件组
[root@love2 ~]# yum groupremove 软件组名
# 卸载指定软件组