大家好,我是"屌爆了"(RPM)!,今天我还带来了我的朋友"屌翻了"(YUM)!
首先我们先介绍一下内核的功能:进程管理、内存管理、文件管理、设备管理、网络管理等 。
1、进程管理:进程是在计算机系统中资源分配的最小单元。内核负责创建和销毁进程,而且由调度程序采取合适的调度策略,实现进程间的合理且实时的处理器资源的共享。从而内核的进程管理活动实现了多个进程在一个或多个处理器上的抽象。内核还负责实现不同进程间、进程和其他部件之间的通信。
2、内存管理:内存是计算机系统中最主要的资源。内核使得多个进程安全而合理地共享内存资源,为每个进程在有限的物理资源上建立一个虚拟地址空间。内存管理部分代码可分为硬件无关部分和硬件有关部分:硬件无关部分实现进程和内存之间的地址映射等功能;硬件有关部分实现不同体系结构上的内存管理相关功能并为内存管理提供与硬件无关的虚拟接口。
3、文件管理:在Linux系统中的任何一个概念几乎都可以看做一个文件。内核在非结构化的硬件上建立了一个结构化的虚拟文件系统,隐藏了各种硬件的具体细节,从而在整个系统的几乎所有机制中使用文件的抽象。Linux在不同物理介质或虚拟结构上支持数十种文件系统。例如,Linux支持磁盘的标准文件系统ext3和虚拟的特殊文件系统。
4、设备管理:Linux系统中几乎每个系统操作最终都映射到一个或多个物理设备上。 除了处理器、内存等少数的硬件资源之外,任何一种设备控制操作都由设备特定的驱动代码来进行。内核中必须提供系统中可能要操作的每一种外设的驱动。
5、网络管理:内核支持各种网络标准协议和网络设备。网络管理部分可分为网络协议栈和网络设备驱动程序。网络协议栈负责实现每种可能的网络传输协议(TCP/IP协议等);网络设备驱动程序负责与各种网络硬件设备或虚拟设备进行通信。
什么是程序包管理器
用于管理Linux 下软件包的软件,其主要功能为:将编译好的程序打包成一个文件或有限的几个文件,可用于实现安装、卸载、升级、查询等功能。
两种包管理各有用处,其中主要区别是:YUM使用简单但需要联网,YUM会去网上的YUM包源去获取所需要的软件包。而RPM的需要的操作精度比较细,需要我们做的事情比较多。
程序包的组成部分:
二进制程序:/bin, /sbin,/ /usr/bin, /usr/sbin,
库文件:/lib64, /usr/lib64
配置文件:/etc
帮助文件:manual, info,
RPM全称为RedhatPackage Manager,最早由RedHat公司制定实施,随后被GNU开源操作系统接受并成为很多Linux系统(RHEL)的既定软件标准。一个RPM包包含了已压缩的软件文件集以及该软件的内容信息(在头文件中保存),通常表现为以.rpm扩展名结尾的文件,例如package.rpm。对其操作,需要使用rpm\ yum命令。
包命名、分包机制认识以及如何获取rpm包
(1)包命名格式
源码命名:程序名-版本号:name-version.tar.{gz,bz2,xz}
version:major.minor.release 主版本号.次版本号.修正号
例如:bash-4.2.3.tar.gz
rpm包命名:程序名-版本号-包修正号.硬件平台:name-version-relase.arch.rpm
version:和源码格式相同
release: 包修正号。rpm自身的发行号,与程序源码的发行号无关,仅用于标识对rpm包不同制 作的修订
arch: 适用于的硬件平台
x86: i386, i486, i586, i686等
x86_64: x86_64
powerpc: ppc
noarch: 依赖于虚拟机(解释器)
例如:bash-4.2.3-3.centos5.x86_64.rpm
(2)分包机制
一个程序有一定数量的功能。这些功能被打包成核心包(主包)和多个子包。
核心包(主包):命名与源程序一致
例如:bash-4.2.3-3.centos7.x86_64.rpm
子包:在名称后加上功能名命名
例如 :
具有a功能的包命名: bash-a-4.2.3-3.centos7.x86_64.rpm
和二次开发相关的功能命名:bash-devel-4.2.3-3.centos7.x86_64.rpm
(3)获取rpm包的途径
1. 发行的光盘或站点服务器
例如:
http://mirrors.163.com
http://mirrors.sohu.com
2. 项目的官网
获取源代码、rpm包
3. 很多第三方机构或个人制作并公开发布许多rpm包
4. 可靠的途径
发行版提供的程序包;
EPEL
Fedora-EPEL
项目的官方站点
搜索引擎
http://rpmfind.net
http://rpm.pbone.net
http://pkgs.org
rpm包管理器的常见使用场景
(注;软件包名称使用 package_name代替)
(1)安装程序包
命令:rpm [option] /.../.../package_file (选项后跟软件包的路径)
命令选项:
-i: 安装
-v:显示安装过程
-vv:显示详细安装过程
-vvv:显示更详细安装过程
-h: 使用#号显示安装进度
--test: 仅作测试,不执行安装
例如:rpm -ivh --test /media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
--nodeps: 忽略依赖关系
注: 能安装上,但有可能无法运行
--replacepkgs 重新安装
注:如果原有配置文件作了修改,很有可能不执行替换,而是将应该安装生成的配置文件重
命名为 .rpmnew
(2)卸载软件包
命令: rpm [option] package_name (选项后直接跟包名)
命令选项:
-e:erase 卸载
--nodeps: 忽略依赖关系卸载
注:1. 能卸载,但依赖于此包程序包可能会运行不正常;
2. 如果包的配置文件安装后被改动过,卸载时此文件将不会卸载,而是被重命名并保留 卸载时可能会有提示。例如:
[root@localhost ~]# rpm -e zsh
warning: /etc/zprofile saved as /etc/zprofile.rpmsave
(3)升级软件包
命令:rpm [option] /.../.../package_file (选项后跟软件包的路径)
命令选项:
-Uvh: 升级或安装
-Fvh:只升级
--force:强制升级
注:1. 由于依赖关系可能会带来升级后的版本冲突等,导致依赖于此包的其他包不能正常运行
2. 不应该对内核执行升级操作,而是安装系统允许多内核并存
(4)软件包相关查询
1. 查询软件包是否已经安装
命令:rpm -q package_name...
2. 查询所有已经安装的包
命令:rpm -qa
另外,可按条件过滤查询指定的已安装的包,例如,查询已安装的内核:rpm -qa | grep '^kernel*'
3. 查询已安装包的描述信息
命令:rpm -qi package_name
4. 查询某包安装生成了哪些文件
命令:rpm -ql package_name
更详细的:
(1)查询某已安装包安装生成了那些配置文件
命令:rpm -qc package_name
(2)查询某已安装包安装生成了哪些文档(帮助文件)
命令:rpm -qd package_name
(3)查询程序包的相关脚本
命令:rpm -q --scripts package_name
(4)查询某文件是由哪个包安装生成的
命令:rpm -qf /path/to/some_file
对尚未安装的包执行查询:
命令:rpm [option] /path/to/package_file
命令选项:
-qpi:查询某为安装包的描述信息
-qpl:查询某未安装包安装会生成那些文件
-qpc:查询某未安装包安装会生成那些配置文件
-qpd:查询某为安装包安装会生成那些文档
(5)校验
用于检查包安装生成的文件属性是否发生变化:
命令:rpm -V package_name
例如:
[root@localhost ~]# rpm -V zsh
S.5....T. c /etc/zprofile
各表示符代表意义:
S :文件大小改变
M: 权限和文件类型改变
5 :MD5校验码改变
D :设备文件的主设备号、次设备号改变
L :readLink路径改变
U: 属主改变
G: 属组改变
T :修改时间改变
P:功能改变
.号 :表示安装文件属性没有改变
(6)rpm包来源合法性及完整性检验
以发行光盘rpm包检验为例:
1. 在当前系统上导入包的制作者的公钥
命令:rpm --import /media/cdrom/RPM-GPG-KEY-CentOS-6
显示所有已经导入的gpg格式的公钥:
命令:rpm -qa gpg-pubkey*
显示密钥的详细信息:
命令:rpm -qi /media/cdrom/RPM-GPG-KEY-CentOS-6
注:公钥导入后,包来原型及合法性检验会在软件包安装时执行。
2. 手动检查
例如,检查程序包zsh:
[root@localhost ~]# rpm -K /media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
/media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
不检查包完整性:
[root@localhost ~]# rpm -K --nodigest /media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
/media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm: rsa (md5) pgp OK
不检查来源合法性:
[root@localhost ~]# rpm -K --nosignature /media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm
/media/cdrom/Packages/zsh-4.3.10-7.el6.x86_64.rpm: sha1 md5 OK
(7)数据库重建
如果数据库损坏,则需要进行数据库重建。
注:数据库目录所在位置 /etc/var/lib/rpm
重建方式:
1. 初始化,如果事先没有库,会新建一个;如果有,则不新建:
命令:rpm --initdb
2. 直接重建,覆盖原有的数据库
命令:rpm –rebuilddb
YUM: Yellowdog Updater Modified,是一个基于RPM 包管理的字符前端软件包管理器。能够从指定的服务器自动下载 RPM 包并且安装,可以处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。被Yellow Dog Linux本身,以及Fedora、Red Hat Enterprise Linux采用。
Yum结构
Yum遵循C/S架构设计,server端是基于ftp、http、nfs等协议的文件服务器,提供软件仓库,客户端连接服务器获取RPM包并处理依赖关系后安装。
1. server端,提供yum仓库
yum仓库包含:
(1). 数据:各个rpm包
(2). 元数据:是简要的关系型数据库,标明包名、版本信息、各包所包含的文件列表、依赖关系、包分组信息 元数据位于repodata目录下,在CentOS 5上以xml类型文件存在,在CentOS 6上主要以sqlite类 型文件存在。
2.客户端安装软件包策略
第一步: 获取仓库元数据。第一次获取元数据后缓存于本地:/var/cache/yum目录下,之后再访问服务器就
直接使用本地元数据。
第二步: 分析元数据,做出安装决策。yum客户端程序在本地分析元数据文件,并结合本地系统环境(查看已
安装包,已安装的包不会安装)做出要安装的程序包的决策。
第二步: 获取程序包。根据决策联系Yum仓库,下载各程序包缓存于本地后,一并进行安装。
yum机制
仓库的类别:
base库:基本库,提供的通常为系统发行版所提供的程序包
updates库:提供的是制作一个新的发行版之前所有更新的程序包
extra库:提供的是base库中不存在的额外的程序包
epel库:fedora epel提供的程序包
注:对于客户端来说,仓库是使用有优先级,例如对于base库和updates库,一般先使用update库。另外,可以指定仓库的启用或否。
1. 首先应确保有可有的yum 仓库:
yum的server端是rpm包的基于ftp、http、nfs等协议的文件服务器,server端的repodata目录所在父目录就是一个可用仓库。
2. yum客户端提供repo配置文件,指明仓库访问路径及各种属性信息
配置文件分为主配置文件和repo文件:
(1). 主配置文件:中心配置文件,文件名位于:/etc/yum.conf
(2). repo配置文件:一个或几个相关仓库的配置信息可保存为一个文件,文件名都以.repo结尾,保存在/etc/yum.repos.d/目录下。
yum.conf中的各条目解释:
cachedir=/var/cache/yum/$basearch/$releasever 仓库元数据系数据本地缓存目录
keepcache=0 缓存的数据安装后是否保存(0表示不保存)
debuglevel=2 调试级别
logfile=/var/log/yum.log 日志文件目录
exactarch=1 平台是否精确匹配才能安装
obsoletes=1 安装包的时候是否检查过期的仓库
plugins=1 是否支持使用yum的插件
在.repo文件定义一个yum repo指向的格式:
[REPOID] 仓库的类型
name= 此处填写仓库的名称
baseurl= 此处填写仓库的所在位置
enabled={0|1} 是否启用此仓库
gpgcheck={0|1} 使用gpg机制检测包来源合法性和完整性
gpgkey=URL 校验key文件所在位置
mirrorlist=URL to a file mirrors指向一个存在可用rul的文件(条目baseurl和mirrorlist二选一)
cost={1..n} 默认为1000,指定此repo文件中url访问仓库的开销,数值越小优先级越高
( yum配置文件中可用的四个变量:
$releasever: 程序的版本,对Yum而言指的是redhat-release版本;只替换为主版本号, 如RedHat 6.5,则替换为6
$arch: 系统架构
$basearch: 当前系统基本架构,如i686,i586等的基本架构为i386
$YUM0-9: 在系统中定义的环境变量,可以在yum中使用 )
包组:
grouplist
groupinfo "GRP_NAME"
groupinstall "GRP_NAME"
groupremove "GRP_NAME"
仓库:
repolist [all|enabled|disabled]
repoinfo [all|enabled|disabled]
清除缓存目录(/var/cache/yum)下的软件包
命令:yum clean packages
清除缓存目录(/var/cache/yum)下的 headers
命令:yum clean headers
清除缓存目录(/var/cache/yum)下旧的 headers
命令:yum clean oldheaders
清除缓存目录(/var/cache/yum)下的软件包及旧的headers
命令:yum clean, yum clean all (= yum clean packages; yum clean oldheaders)
如何使用光盘当做本地仓库?
挂载光盘至某目录 ;
定义仓库,使用file:// /指明某路径;
创建本地仓库:
yum install createrepo
createrepo /PATH/TO/RPMFILES/
yum install dnf
DNF新一代的RPM软件包管理器。他首先出现在 Fedora 18 这个发行版中。而最近,他取代了YUM,正式成为 Fedora 22 的包管理器。