优点:
包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载
安装速度比源码包安装快的多
缺点:
经过编译,不再可以看到源代码
功能选择不如源码包灵活
依赖性
有时我们会发现需要安装软件包a时需要先安装b和c,而安装b时需要安装d和e。这是需要先安装d和e,再安装b和c,最后才能安装a包。比如说,我买了个漂亮的灯具,打算安装到我们家客厅,可是在安装灯具之前我们家客厅总要有顶棚吧,顶棚总要是做好了防水和刷好油漆了吧,这个装修和安装软件其实类似总要有一定的顺序的。可是有时依赖性会非常繁琐。
若在安装rpm包提示缺少依赖时,可通过www.rpmfind.net查找该依赖存在哪个包中,安装包含该依赖的包即可。
命名规则httpd-2.2.15-15.e16.centos.1.i686.rpm
httpd 软件包名
2.15 软件版本
15 软件发布的次数
e16软件发行商。el6 是RedHat 公司发布,适合x(Red Hat Enterprise Linux)和Cent0S6.x下使用。
i686 适合的硬件平台。RPM包可以在不同的硬件平台安装,选择适合不同CPU的软件版本,可以最大化的发挥CPU性能,所以出现了所谓的i386(386以上计算机都可以安装)、i586(586以上的计算机都可以安装)、i686(奔腾II以上计算机都可以安装,目前所有的CPU都是奔腾II以上,所以这个软件版本居多)、x86_64(64位CPU可以安装)和noarch(没有硬件限制)等文件名了。
rpm rpm包的扩展名。我们说过Linux下文件不是靠扩展名区分文件类型,也就是Linux中扩展名没有任何含义。可是这里怎么又出现了扩展名呢?原因很简单,如果我不把RPM的扩展名叫做".rpm",管理员很难知道这是一个RPM包,当然也就无法正确安装了。也就是说如果RPM包不用".rpm"作为扩展名,系统可以正确识别没有问题,可是管理员很难识别这是个什么样的软件。
包全名:如果操作的是未安装软件包,则使用包全名,而且需要注意绝对路径
包名:如果操作的是已经安装的软件包,则使用包名即可,系统会生产RPM包的数据库
默认安装位置
/etc/配置文件安装目录/usr/bin/可执行的命令安装目录/usr/lib/程序所使用的函数库保存位置/usr/share/doc/基本的软件使用手册保存位置/usr/share/man/帮助文件保存位置rpm安装命令[root@aliyun ~]# rpm [选项] 包全名
-a 查询所有的软件包
-b或-t 设置包装套件的完成阶段,并指定套件档的文件名称;
-c 只列出组态配置文件,本参数需配合”-l”参数使用
-d 只列出文本文件,本参数需配合”-l”参数使用
-e 卸载软件包
-f 查询文件或命令属于哪个软件包
-h 安装软件包时列出标记
-i 安装软件包
-l 显示软件包的文件列表
-p 查询指定的rpm软件包
-q 查询软件包
-R 显示软件包的依赖关系
-s 显示文件状态,本参数需配合”-l”参数使用
-U 升级软件包
-v 显示命令执行过程
-vv 详细显示指令执行过程
--nodeps 不检测依赖性安装。软件时会检测依赖性,确定所需的底层软件是否安装。
如果没有安装则会报错。如果我不管依赖性,想强行安装,可以使用这个选项。注意:这样不检测依赖性安装的软件基本是不能使用的,所以不建议这样做
--replacefiles 替换文件安装。如果安装软件包,可是包中部分文件已经存在,那么正常安装时候,会报错“某个文件已经存在”从而导致软件无法安装,使用这个选项可以忽视这个报错,而覆盖安装
--replacepkgs 替换软件包安装。如果软件包已经安装,此选项可以把软件包重复安装一遍。
--force 强制安装。不管是否已经安装,都重新安装。就是-replacefiles和--replacepkgs 的综合。
--test 测试安装。不会实际安装,只是检测一下依赖性。
--prefix 指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。注意:如果指定了安装路径,软件没有安装到系统默认路径中的话,系统会找不到这些安装的软件,需要进行手工配置才能被系统识别。所以rpm包我们一般都采用默认路径安装。
验证基本验证
rpm -V 已安装的软件名列出该软件被修改过的配置文件
rpm -Vf 文件名称列出某个文件是否被改动过修改
[root@loaclhost ~]# rpm -Vf /etc/zabbix/zabbix_agentd.confS.5....T. c /etc/zabbix/zabbix_agentd.conf#表示此文件的Size,MD5,modify time不一致,且这是一个配置文件
出现了提示信息,我们来解释下最前面共有8个信息内容,是表示验证内容的。文件名前面的c是表示这是个配置文件(configuration)。最后是文件名。那么验证内容中的8个信息的具体内容如下:
S 文件大小是否改变
M 文件的类型或文件的权限(rwx)是否被改变
5 文件MD5校验和是否改变(可以看成文件内容是否改变)
D 设备的主从代码是否改变
L 文件路径是否改变
U)文件的属主(所有者)是否改变
G 文件的属组是否改变
T0文件的修改时间是否改变
apache配置文件的文件类型是c,那么还有哪些文件类型呢?
c 配置文件(config file)
d 普通文档(documentation)
g"鬼”文件(ghost file),很少见,就是该文件不应该被这个RPM包包含1授权文件(license file)
r描述文件(read me)
RPM包中文件的提取
cpio命令
cpio 命令主要有三种基本模式:“-o”模式指的是 copy-out 模式,就是把数据备份到文件库中;
“-i”模式指的是 copy-in 模式,就是把数据从文件库中恢复;“-p”模式指的是复制模式,就是不把数据备份到 cpio 库中,而是直接复制为其他文件。命令如下:
[root@aliyun ~]# cpio -o[vcB] > [文件|设备]
备份
-o:copy-out 模式,备份
-v:显示备份过程
-c:使用较新的 portable format 存储方式
-B:设定输入输出块为 5120bytes,而不是模式的 512butes
[root@aliyun ~]# cpio -i[vcdu] < [文件|设备]
还原
-i:copy-in 模式,还原
-v:显示还原过程
-c:使用较新的 portable format 存储方式
-d:还原时自动新建目录
-u:自动使用较新的文件覆盖较旧的文件
[root@aliyun ~]# cpio -p 目标目录
举几个例子吧,先来看看使用 cpio 备份数据的方法,命令如下:
# 利用 find 指定要备份/etc/目录,使用>导出到 etc.cpio 文件[root@aliyun ~]# find /etc -print | cpio -ocvB > /root/etc.cpio[root@aliyun ~]# ll -h etc.cpio- rw-r--r--. 1 root root 21M 6 月 5 12:29 etc.cpio #etc.cpio 文件生成# 再来看看如何恢复 cpio 的备份数据,命令如下:[root@aliyun ~]# cpio -idvcu < /root/etc.cpio #还原 etc 的备份# 但是如果大家查看下当前目录/root,会发现没有生成 etc 目录。这是因为备份是/etc 目录使用的是绝对路径,所以恢复的数据直接恢复到了/etc 系统目录中,而没有生成在/root/etc 中。# 在 CentOS5.x 的版本中,是可以利用上面的命令备份与恢复指定的文件。但是到 CentOS6.x 当中,需要更加严谨。如果备份时使用绝对路径,则恢复的数据会直接到绝对路径指定的路径中,如果需要把数据恢复到当前目录中,则需要使用相对路径,例如:# 备份:[root@aliyun ~]# cd /etc #进入/etc 目录# 利用 find 指定要备份/etc/目录,使用>导出到 etc.cpio 文件[root@aliyun ~]# find . -print | cpio -ocvB > /root/etc.cpio#恢复:[root@aliyun ~]# cd /root #回到/root 目录中[root@aliyun ~]# mkdir etc_test #建立恢复测试目录[root@aliyun ~]# cd etc_test #进入测试目录,数据恢复到此#还原/etc 目录的数据,因为备份时使用的是相对路径,则会还原到/root/etc_test/目录下[root@localhost etc_test]# cpio -idvcu < /root/etc.cpio#最后来演示一下 cpio 命令的“-p”复制模式,命令如下:[root@aliyun ~]# cd /tmp/ #进入/tmp 目录[root@localhost tmp]# rm -rf * #删除/tmp 目录中所有数据[root@localhost tmp]# mkdir test #建立备份目录#备份/boot/目录到/tmp/test/目录中[root@localhost tmp]# find /boot/ -print | cpio -p /tmp/test
提取 RPM 包中文件
[root@aliyun ~]# rpm2cpio 包全名 | cpio -idv .文件绝对路径
rpm2cpio #将 rpm 包转换为 cpio 格式的命令
cpio #是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件
举个例子,现在我假设把系统中的/bin/ls 命令不小心误删除了,那么我可以修复回来吗?这时有两种方法修复,要不就是使用—force 选项覆盖安装一遍 coreutils-8.4-19.el6.i686 包,要不就可以使用 cpio 命令提取出/bin/ls 命令文件,再把它拷贝到对应位置就可以了。不过我是怎么知道/bin/ls命令是属于 coreutils-8.4-19.el6.i686 这个软件包的呢?还记得-qf 选项吗?命令如下:
[root@aliyun ~]# rpm -qf /bin/ls #查看 ls 文件属于哪个软件包# 那么我们在讲 RPM 包中文件提取,所以我们使用第二章方法,cpio 命令提取出 ls 命令文件,然后拷贝到对应位置,命令如下:#把/bin/ls 命令移动到/root 目录下,造成误删除的假象[root@aliyun ~]# mv /bin/ls /root/[root@aliyun ~]# ls- bash: ls: command not found #这时执行 ls 命令,系统会报错“命令没有找到”# 提取 ls 命令文件到当前目录下[root@aliyun ~]# rpm2cpio /mnt/cdrom/Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls ./bin/ls[root@aliyun ~]# cp /root/bin/ls /bin/ #把提取出来的 ls 命令文件复制到/bin 目录下[root@aliyun ~]# lsanaconda-ks.cfg bin inittab install.log install.log.syslog ls#恭喜你,ls 命令又可以正常使用了
yum安装yum源文件解析yum 源配置文件保存在/etc/yum.repos.d/目录中,文件的扩展名一定是“.repo”。也就是说,yum 源配置文件只要扩展名是“.repo”就会生效。
[root@aliyun ~]# ls /etc/yum.repos.d/CentOS-Base.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo
这个目录中有 5 个 yum 源配置文件,默认情况下 CentOS-Base.repo 文件生效。我们打开这个文
件看看,命令如下:
[root@localhost yum. repos. d]# vim /etc/yum. repos. d/CentOS-Base. repo[base]name=CentOS-$releasever-Basemirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=osbaseurl=http://mirror.centos. org/centos/$releasever/os/$basearch/gpgcheck=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6
在 CentOS-Base.repo 文件中有 5 个 yum 源容器,这里只列出了 base 容器,其他容器和 base 容
器类似。我们解释一下 base 这个容器。
[base]:容器名称,一定要放在[]中。
name:容器说明,可以自己随便写。
mirrorlist:镜像站点,这个可以注释掉。
baseurl:我们的 yum 源服务器的地址。默认是 CentOS 官方的 yum 源服务器,是可以使用的。如果你觉得慢,则可以改成你喜欢的 yum 源地址。
enabled:此容器是否生效,如果不写或写成 enabled=1 则表示此容器生效,写成 enabled=0则表示此容器不生效。
gpgcheck:如果为 1 则表示 RPM 的数字证书生效;如果为 0 则表示 RPM 的数字证书不生效。
gpgkey:数字证书的公钥文件保存位置。不用修改。
更换 or 搭建本地光盘yum源通常使用centos官方yum源时会比较慢,可以更换为国内yum源。当主机无法使用外网时,可以使用本地yum源。这部分在后期文章中介绍。
yum命令[root@aliyun ~]# yum [选项] 软件包
-h 显示帮助信息
-y 对所有的提问都回答“yes”
-c 指定配置文件
-q 安静模式
-v 详细模式
-t 检查外部错误
-d 设置调试等级(0-10)
-e 设置错误等级(0-10)
-R 设置yum处理一个命令的最大等待时间
-C 完全从缓存中运行,而不去下载或者更新任何头文件
install 安装rpm软件包
update 更新rpm软件包
check-update 检查是否有可用的更新rpm软件包
remove 删除指定的rpm软件包
list 显示软件包的信息
search 检查软件包的信息
info 显示指定的rpm软件包的描述信息和概要信息
clean 清理yum过期的缓存
shell 进入yum的shell提示符
resolvedep 显示rpm软件包的依赖关系
localinstall 安装本地的rpm软件包
localupdate 显示本地rpm软件包进行更新
deplist 显示rpm软件包的所有依赖关系
yum组管理命令形式就直接在对应的选项前加上group即可。例如查询组列表 yum grouplist
源码包安装注意事项应该选择哪种软件包?
如果软件包是给大量客户提供访问,建议使用源码包安装,如LAMP环境搭建,因为源码包效率更高。
如果软件包是给Linux底层使用,或只给少量客户访问,建议使用rpm包安装,因为rpm包简单。
源码包是从哪里来的?
rpm包是光盘中直接包含的,所以不需要用户单独下载。而源码包是通过官方网站下载的,如果需要使用,是需要单独下载的。
安装过程我们来解释一下源码包安装的具体步骤。
(1)下载软件包。
(2)解压缩。
(3)进入解压目录。
(4)./configure 编译前准备
这一步主要有三个作用:
在安装之前需要检测系统环境是否符合安装要求。
定义需要的功能选项。“./configure”支持的功能选项较多,可以执行“./configure --help”命令查询其支持的功能。一般都会通过“./configure --prefix=安装路径”来指定安装路径。
把系统环境的检测结果和定义好的功能选项写入 Makefile 文件,后续的编译和安装需要依赖这个文件的内容。
需要注意的是,configure 不是系统命令,而是源码包软件自带的一个脚本程序,所以必须采用“./configure”方式执行(“./”代表在当前目录下)。
(5)make编译
make 会调用 gcc 编译器,并读取 Makefile 文件中的信息进行系统软件编译。编译的目的就是把源码程序转变为能被 Linux 识别的可执行文件,这些可执行文件保存在当前目录下。编译过程较为耗时,需要有足够的耐心。
(6)make clean:清空编译内容(非必需步骤)。
如果在“./configure”或“make”编译中报错,那么我们在重新执行命令前一定要记得执行 make clean 命令,它会清空 Makefile 文件或编译产生的“.o”头文件。
(7)make install: 编译安装
这才是真正的安装过程,一般会写清楚程序的安装位置。如果忘记指定安装目录,则可以把这个命令的执行过程保存下来,以备将来删除使用。
删除源码包没有删除命令,如果需要删除,直接删除安装目录即可。
补丁生成补丁
diff:比较两个文件的不同
[root@aliyun ~]# diff选项old new
-a 将任何文档当做文本文档处理
-b 忽略空格造成的不同
-B 忽略空白行造成的不同
-I 忽略大小写造成的不同
-N 当比较两个目录时,如果某个文件只在一个目录中,则在另一个目录中视作空文件
-r 当比较目录时,递归比较子目录
-u 使用同一的输出格式
[root@localhost]# mkdir test # 建立测试目录[root@localhost]# cd test # 进入测试目录[root@localhost test]#cat > old.txt <<-EOF # 文件 old.txt,为了一会输出便于比较,每行分开ourschoolisxuansuEOF[root@localhost test]#cat > new.txt <<-EOFourschoolisxuansuinBeijing# 比较两个文件的不同,同时生成 txt.patch 补丁文件[root@localhost test]#diff -Naur /root/test/old.txt /root/test/new.txt > txt.patch[root@localhost test]#cat txt.patch # 查看下这个文件----/root/test/old.txt 2012-11-23 05:51:14.347954373 +0800 # 前一个文件++++/root/test/new.txt 2012-11-23 05:50:05.772988210 +0800 # 后一个文件@ @ -2,3 +2,5 @ @schoolisxuansu+in+beijing
后一个文件比前一个文件多两行,使用 + 号表示
打入补丁
[root@localhost test]# patch –pn < 补丁文件
-pn n 为数字。代表按照补丁文件中的路径,指定更新文件的位置。
“-pn”不好理解,我们说明下。补丁文件是要打入旧文件的,但是你当前所在的目录和补丁文
件中的记录的目录是不一定匹配的,所以就需要“-pn”来同步两个目录。
比如我当前是在“/root/test”目录中(我要打补丁的旧文件就在当前目录下),补丁文件中记录的文件目录为“/root/test/old.txt”,这时如果写入“-p1”(在补丁文件目录中取消一级目录)那么补丁文件就会打入“/root/test/root/test/old.txt”文件中,这显然是不对的。那如果写入的是“-p2”(在补丁文件目录中取消二级目录)那么补丁文件打入的就是“/root/test/test/old.txt”,这显然也不对。如果写入的是“-p3”(在补丁文件目录中取消三级目录)那么补丁文件就是打入的“/root/test/old.txt”,我们的 old.txt 文件就在这个目录下,所以就应该是“-p3”。 那么我们更新下“old.txt”文件,命令如下:
[root@localhost test]# patch-p3 < txt.patch patching file old.txt # 给 old.txt 文件打补丁[root@localhost test]# cat old.txt # 查看下old.txtourschoolisatguiguinBei jing# 多出来了 in Beijing 两行
脚本安装程序脚本程序简介脚本程序包并不多见,所以在软件包分类中并没有把它列为一类。它更加类似于 Windows 下的程序安装,有一个可执行的安装程序,只要运行安装程序,然后进行简单的功能定制选择(比如指定安装目录等),就可以安装成功,只不过是在字符界面下完成的