Linux基础之软件安装

萱蘇的运维日常 2024-04-07 14:17:34
RPM(二进制)安装特点

优点:

包管理系统简单,只通过几个命令就可以实现包的安装、升级、查询和卸载

安装速度比源码包安装快的多

缺点:

经过编译,不再可以看到源代码

功能选择不如源码包灵活

依赖性

有时我们会发现需要安装软件包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 下的程序安装,有一个可执行的安装程序,只要运行安装程序,然后进行简单的功能定制选择(比如指定安装目录等),就可以安装成功,只不过是在字符界面下完成的

0 阅读:1