Linux软件包
软件包管理
-
一个操作系统没有软件做支持能实现的功能非常少,Linux中的大多软件主要是给服务器来用的,不管是稳定性还是多样性还是安全性都不比Windows差甚至更好。windows的所有安装包都不能在Linux中使用,好处是Windows中大量的病毒和木马都对Linux无用,坏处是所有的软件包都必须针对Linux再做单独的开发。
-
Linux能够识别的软件包主要有两大类:源码包和二进制包
- 源码包:把源代码直接开放给你的包,绝大多数都是C语言写的,需要手工安装且安装的时候比较慢而且容易报错。
- 脚本安装包:绝大多数都是源码包进行再开发之后的源码包,不需要手工安装,安装过程与Windows类似但是这种包不多,适合初学者。
- 二进制包(系统默认包):经过编译之后的包含0和1的机器语言包,不能看到源代码,Windows大多数是exe的二进制安装包,Linux下也有二进制包,只不过编译格式不一样。二进制包是厂商在发行的时候用源码包编译好的,好处是用户安装速度相比源码包更快且安装过程报错几率大大减小,坏处是不能看到源码。
- RPM包:Redhat系列用的二进制软件包就是RPM包
- DPKG包:Debian系列用的二进制包,两种包除了管理系统不同,其余的基本一样,命令、配置文件保存位置、内核等基本一致。
-
源码包优点:
- 开源,如果有足够的能力,可以修改源代码
- 可以自由选择所需的功能
- 软件是编译安装,所以更加适合自己的系统,更加稳定也效率更高
- 卸载方便(可以通过直接删除安装目录的方式来卸载)
源码包缺点:
- 安装过程步骤较多,尤其安装较大的软件集合时(如LAMP环境搭建),容易出现拼写错误
- 编译过程时间较长,安装比二进制安装时间长
- 因为是编译安装,安装过程中一旦报错新手很难解决
-
二进制包优点:
- 包管理系统简单,只通过几个命令就可以实现包的安装、升级、査询和卸载
- 安装速度比源码包安装快的多(跟Windows下安装软件速度差不多)
二进制包缺点:
- 经过编译,不再可以看到源代矼
- 功能选择不如源码包灵活
- 依赖性(软件包a的安装依赖软件包b,所以在安装a的时候要先安装b,卸载的时候也要先卸载a)
rpm命令管理
-
RPM包命名规则
包全名:
httpd-2.2.15-15.el6.centos.1.i686.rpm
httpd 软件包名
2.2.15 软件版本
15 软件发布的次数
el6. centos 适合的 Linux平台(不写表示任何Linux版本都可以安装)
i686 适合的硬件平台(
i386/i486/i586/i686
都可以在我们的普通计算机上安装,x64
则只能在64位的CPU上安装,noarch
指任何硬件平台都可以安装)rpm rpm包扩展名
(Linux中没有文件扩展名这个概念,也就是说,文件名和扩展名可以随意命名,比如可以叫
a.exe
,Linux只是认为它是一个普通文件。但是所有的rpm包的扩展名必须写成.rpm
,方便管理员查看) -
RPM包依赖性:
-
树形依赖:
a->b->c
。装软件包a要先装b,装软件包b要先装c。卸载的时候要先卸载a再卸载b最后卸载c。 -
环形依赖:
a->b->c->a
。软件包a、b、c用一条命令同时装即可解决。 -
模块依赖:当想要安装
mysql-connector-odbc
这个包的时候发现缺少依赖libodbcinst.so.2
这个包,但是并没有这个依赖包,这是一个库依赖,.so.number
结尾的都是库依赖,库依赖不是单独独立的一个包,它是某一个软件包中的一个软件,所以我们要安装的是这个软件所在的包。问题是我们怎么知道这个软件属于哪个包,解决方案是前往模块依赖查询网站:www.rpmfind.net,搜索之后就会找到我们要安装的依赖包。
-
安装升级与卸载
-
包全名与包名
- 包全名:操作的包是没有安装的软件包时,使用包全名。而且要注意路径
- 包名:操作已经安装的软件包时,使用包名。是搜索/var/lib/rpm/中的数据库
-
RPM安装:
#rpm -ivh 包全名
选项: -i(install) 安装
-v(verbose) 显示详细信息
-h(hash) 显示进度
--nodeps 不检测依赖性(实际不使用)
-
RPM包升级:
#rpm -Uvh 包全名
选项: -U(upgrade) 升级
-
卸载:
#rpm -e 包名
选项: -e(erase) 卸载
--nodeps 不检查依赖性
查询
-
查询是否安装
#rpm -q 包名
#查询是否安装
选项: -q(query) 查询
#rpm -qa
#查询所有已安装的RPM包
选项: -a(all) 所有
#rpm -qa | grep 包名
#查询所有与包相关的RPM包
-
查询软件包详细信息
#rpm -qi 包名 #rpm -qip 包全名
选项: -i(information) 查询软件信息
-p(package) 查询未安装包信息
-
查询包中文件安装位置
#rpm -ql 包名 #rpm -qlp 包全名
选项: -l(list) 列表
-p(package) 查询未安装包信息(该包的计划安装位置)
-
查询系统文件属于哪个RPM包
#rpm -qf 系统文件名
选项: -f(file) 查询系统文件属于哪个软件包
-
查询软件包的依赖性
#rpm -qR 包名 #rpm -qRp 包全名
选项: -R(requires) 查询软件包的依赖性
-p(package) 查询未安装包信息
校验和文件提取
-
RPM包校验:判断系统文件是否被人更改
#rpm -V 已安装的包名
#没有任何提示信息证明包没有做过修改
选项: -V(verify) 校验制定RPM包中的文件
执行结果示例:
S.5....T. c /etc/httpd/conf/httpd.conf
,S.5....T.
表示验证内容信息,c
表示配置文件。验证内容中的8个信息的具体内容如下:(命令执行结果为8个字符,
.
表示相应类型没有修改)- 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包中文件提取:提取RPM包中指定文件(误操作删除系统文件后修复)
#rpm2cpio 包全名 | cpio -idv .文件绝对路径 //“.”代表把指定文件提取到当前目录下
rpm2cpio
:将rpm包转换为cpio格式的命令cpio
:是一个标准工具,它用于创建软件档案文件和从档案文件中提取文件#cpio 选项<[文件|设备]
选项: -i copy-in模式,还原
-d 还原时自动新建目录
-v 显示还原过程
举个栗子:假设做了误操作把系统中的
ls
命令删掉了,执行下列命令。不知道ls命令属于哪个包可以到网上查找,这里我们查找到是coreutils-8.4-19.el6.i686.rpm
这个包。rpm2cpio /Packages/coreutils-8.4-19.el6.i686.rpm | cpio -idv ./bin/ls
#提取RPM包中ls命令到当前目录的/bin/ls下
cp /root/bin/ls /bin/
#把ls命令复制回/bin/目录,修复文件丢失
yum在线管理
- yum就是为了解决依赖性问题而产生的。yum不是必须要联网,可以用本地光盘来作为yum源。yum的问题在于像Redhat这样的公司认为yum是一种售后服务,需要付费才可以使用,CentOS作为社区版Linux可以免费使用,但是在服务器上如果使用的是Redhat系列则需要付费使用。
- yum在线管理的意思就是yum和rpm命令管理的都是RPM包,并不存在yum包。rpm命令管理是手动操作而yum是自动管理。
网络yum源
CentOS只要能联网,就可以直接利用CentOS官方网站的yum源进行下载安装和升级。只是CentOS的官方网站在国外,连起来有时候可能比较慢,这时候我们可以换成国内一些公开的免费的yum源地址。
网络yum源保存在/etc
下的yum.repos.d
目录当中,在这个目录中后缀名是.repo
的都是合法的yum源,默认是CentOS-Base
yum源生效。
#vi /etc/yum.repos.d/CentOS-Base.repo
- [base] 容器名称,一定要放在[]中
- name 容器说明,可以自己随便写
- mirrorlist 镜像站点,这个可以注释掉
- baseurl 我们的yum源服务器的地址。默认是CentOS官方的yum源服务器,是可以使用的,如果你觉得慢可以改成你喜欢的yum源地址
- enabled 此容器是否生效,如果不写或写成enable=1都是生效,写成enable=0就是不生效
- gpgcheck 如果是1是指RPM的数字证书生效,如果是0则不生效
- gpgkey 数字证书的公钥文件保存位置。不用修改
yum命令
-
查询
#yum list
#查询所有可用软件包列表
#yum search 关键字
#搜索服务器上所有和关键字相关的包
-
安装
#yum -y install 包名
选项:install 安装
-y 自动回答yes
-
升级
#yum -y update 包名
#update后如果不加包名则会升级所有的软件包包括Linux内核
选项:update 升级
-y 自动回答yes
-
卸载
#yum -y remove 包名
#remove会卸载掉该包所依赖的所有包,有可能会造成系统出现一定问题。
选项:remove 卸载
-y 自动回答yes
Linux使用原则:安装的时候最小化安装,不安装多余软件;用什么软件装什么软件,尽量不卸载。
-
YUM软件组管理命令
#yum grouplist
#列出所有可用的软件组列表
#yum groupinstall 软件组名
#安装指定软件组,组名可以由
grouplist
查询出来,如果组名有空格,则用“软件组名”这样的格式。#yum groupremove 软件组名
#卸载指定软件组
源码包管理
-
区别:
- 安装前:概念上的区别(前面已讲)
- 安装后:安装位置不同
-
RPM包安装位置(安装在默认位置)
RPM包默认安装路径 /etc/ 配置文件安装目录 /usr/bin/ 可执行的命令安装目录 /usr/lib/ 程序所使用的函数库保存位置 /usr/share/doc/ 基本的软件使用手册保存位置 usr/share/man/ 帮助文件保存位置 -
源码包安装位置:安装在指定位置中,一般是
/usr/local/软件名
-
安装位置不同的影响:
- RPM包安装的服务可以使用系统服务管理命令(service)来管理(RPM包安装的服务的执行文件全都会安装在
/etc/rc.d/init.d
下),例如RPM包安
装的apache的启动方法是:#/etc/rc.d/init.d/httpd start
#service httpd start
(Redhat专有)
- 源码包安装的服务则不能被服务管理命令管理,因为没有安装到默认路径中。所
以只能用绝对路径进行服务的管理,如:/usr/local/apache2/bin/apachectl start
- RPM包安装的服务可以使用系统服务管理命令(service)来管理(RPM包安装的服务的执行文件全都会安装在
源码包安装
- 安装准备
- 安装C语言编译器(gcc)
- 下载源码包
- 注意事项
- 源代码保存位置:
/usr/local/src/
- 软件安装位置:
/usr/local/
- 如何确定安装过程报错:
- 安装过程停止
- 出现error、warning或no的提示
- 源代码保存位置:
- 源码包安装过程
- 下载源码包;
- 解压缩下载的源码包;
- 进入解压缩目录(查看INSTALL安装说明和README使用说明);
- 安装说明中会有安装步骤,不熟悉安装过程的可以参考;
- ./configure 软件配置与检查;
- 定义需要的功能选项。
- 检测系统环境是否符合安装要求。
- 把定义好的功能选项和检测系统环境的信息都写入Makefile文件,用于后续的编辑。
#make
编译;- 至此上述操作如果失败的话不需要删除任何文件,执行
#make clean
清空编译产生的临时文件即可; #make install
安装。
- 源码包卸载:不需要卸载命令,直接删除安装目录即可。不会遗留任何垃圾文件。
脚本安装包
- 脚本安装包并不是独立的软件包类型,常见安装的是源码包。
- 是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装。
- 非常类似于Windows下软件的安装方式。
- Linux中常见的脚本安装包主要是一些硬件驱动,硬件驱动在Linux中安装比较困难,厂商为了推广自己的硬件,针对Linux做了很多的安装脚本。