相关理论介绍
为什么需要RPM包来管理程序?
由于Linux真正可以执行的程序一定是二进制文件,因为机器只能识别二进制数字,而程序员在开发时多是使用高级语言进行编程的,所以要想这些程序能够在Linux上运行,源代码必须最终被编译成二进制文件。但是二进制应用程序的文件的构成也是复杂的,如果单独安装管理应用程序,并记录程序相关的文档,配置文件,会很不方便,所以需要对这些编译后的二进制文件打包处理,因此就有了RPM包和PRM包管理器。
二进制应用程序的组成部分:
二进制文件:/bin, /sbin, /usr/bin, /usr/sbin
库文件:/linb, /lib64, /usr/lib6
配置文件:/etc
帮助文件:manaul, info,README.txt, INSTALL.txt
常见程序包管理器有:
debian:deb, dpt
redhat: rpm,
rpm: Redhat Package Manager
RPM程序包管理:
功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作。
1、程序的组成清单 (每个包独有)
文件清单
安装或卸载时运行的脚本
2、数据库(公共)
程序包名称及版本
依赖关系;
功能说明;
安装生成的各文件的文件路径及校验码信息;
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum, dnf
获取程序包的途径:
(1) 系统发的光盘或官方的服务器;
CentOS镜像:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 项目官方站点,如apache官方站点www.apache.org
(3) 第三方组织:
Fedora-EPEL
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
RPM程序包管理器
RPM主要能实现对rpm包安装、升级、卸载、查询、校验等功能。
安装:
rpm {-i|--install} [install-options] PACKAGE_FILE ... -ivh:安装包, v显示安装进度, -ivvh: vv的作用是详细显示安装了哪些文件, 还有vvv --nodeps:忽略依赖关系强制安装, 可能导致软件功能不正常 --test:测试安装,但不会正真安装;dry run模式 --replacepkgs:强制重新安装 --no scripts: 不执行程序包脚本片段 %pre: 安装前脚本;--nopre %post: 安装后脚本; --nopost %preun: 卸载前脚本; --nopreun %postun: 卸载后脚本; --nopostun [root@node2 Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:zsh ########################################### [100%] #显示进度 [root@node2 Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm #重新安装 warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:zsh ########################################### [100%] [root@node2 Packages]# rpm -ivh php-5.3.3-38.el6.x86_64.rpm warning: php-5.3.3-38.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY error: Failed dependencies: #由于被依赖的包没有安装,所以导致安装失败,此时需先安装被其依赖的包,才可继续安装;或强制忽略依赖关系 php-cli(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64 php-common(x86-64) = 5.3.3-38.el6 is needed by php-5.3.3-38.el6.x86_64 [root@node2 Packages]# rpm -ivh --nodeps php-5.3.3-38.el6.x86_64.rpm #强制忽略后,可以完成安装,但程序不一定可以正常运行 warning: php-5.3.3-38.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:php ########################################### [100%] [root@node2 Packages]# rpm -ivh --test httpd-2.2.15-39.el6.centos.x86_64.rpm #测试安装不会真正安装程序包 warning: httpd-2.2.15-39.el6.centos.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] package httpd-2.2.15-39.el6.centos.x86_64 is already installed [root@node2 Packages]# rpm -q httpd-2.2.15-39.el6.centos.x86_64.rpm #测试安装并没有正真安装程序包 package httpd-2.2.15-39.el6.centos.x86_64.rpm is not installed
升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... rpm {-F|--freshen} [install-options] PACKAGE_FILE ... upgrage:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则“安装”(有则升级,无则安装); freeshen:安装有旧版程序包,则“升级”;如果不存在旧版程序包,则不执行升级操作(有则升级,无则不管); 格式:选项和普通安装时的选项一致: rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ... --oldpackage:降级; --force: 强行升级;
注意:
(1) 不要对内核做升级操作(防止升级失败后,无法启动系统);Linux支持多内核版本并存,因此,可直接安装新版本内核;
(2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留;
查询:
rpm {-q|--query} [select-options] [query-options]
[select-options]:查询选项
-a: 所有 -f: 查看指定的文件由哪个程序包安装生成 -p: /PATH/TO/PACKAGE_FILE 针对未安装的程序包做查询操作 --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供 --whatrequires CAPABILITY: 查询指定的CAPABILITY被谁所依赖 [root@node2 Packages]# rpm -qa #可查看系统安装过的所有的包 [root@node2 Packages]# rpm -qf /etc/passwd #查看/etc/passwd 由那个包提供 setup-2.8.14-20.el6_4.1.noarch [root@node2 Packages]# rpm -q --whatprovides passwd #查询那个包提供了passwd功能 passwd-0.77-4.el6_2.2.x86_64 [root@node2 Packages]# rpm -q --whatrequires passwd #查询passwd功能被谁依赖 usermode-1.102-3.el6.x86_64 [root@node2 //]# rpm -q php-com #查询php-com有否安装 package php-com is not installed [root@node2 //]# rpm -ql -p /mnt/cdrom/Packages/php-common-5.3.3-38.el6.x86_64.rpm #指定路径,查找还未安装的php-common包 warning: /mnt/cdrom/Packages/php-common-5.3.3-38.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY /etc/php.d /etc/php.d/curl.ini /etc/php.d/fileinfo.ini /etc/php.d/json.ini /etc/php.d/phar.ini /etc/php.d/zip.ini /etc/php.ini /usr/lib64/php
常用组合:
-qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE
-qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ...
-qa
卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE [root@node2 ~]# rpm -q zsh zsh-4.3.11-4.el6.centos.x86_64 [root@node2 ~]# rpm -e zsh #卸载zsh程序包,如果成功卸载不会有任何输出 [root@node2 ~]# rpm -q zsh #已经卸载成功 package zsh is not installed
校验:
rpm {-V|--verify} [select-options] [verify-options] S file Size differs M Mode differs (includes permissions and file type) 5 digest (formerly MD5 sum) differs D Device major/minor number mismatch L readLink(2) path mismatch U User ownership differs G Group ownership differs T mTime differs P caPabilities differ
包来源合法性验正及完整性验正:
完整性验正:SHA256
来源合法性验正:RSA
数据库重建:
[root@centos7 rpm]# ls /var/lib/rpm #数据库相关文件 Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5 Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername rpm {--initdb|--rebuilddb} initdb: 初始化 如果事先不存在数据库,则新建之;否则,不执行任何操作; rebuilddb:重建 无论当前存在与否,直接重新创建数据库; [root@node2 //]# echo '###' >> /etc/httpd/conf/httpd.conf #向httpd.conf末尾追加一行 [root@node2 //]# rpm -V httpd #对比httpd安装包的元数据,查看httpd相关文档是否有变化 S.5....T. c /etc/httpd/conf/httpd.conf #S, 5,T 表明其有改动过 [root@node2 Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm #未导入gpgkey,安装时候会有warning提示信息 warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:zsh ########################################### [100%] [root@node2 Packages]# rpm --import /mnt/cdrom/RPM-GPG-KEY-CentOS-6 #导入gpgkey [root@node2 Packages]# rpm -ivh --replacepkgs zsh-4.3.10-7.el6.x86_64.rpm #不再有warning Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
Yum介绍
RPM包管理器在安装rpm包时,如果有包的安装存在依赖关系,则得首先安装被其依赖的包,有时候包与包之间的依赖关系复杂,使用RPM来手动安装包,就变得非常痛苦和低效。
Yum(Yellowdog Updater Modified): 是一前端包管理软件,基于RPM包管理,能够从指定服务器下载PRM包,并且自动判断依赖关系,并自动安装所有被依赖的包,无需频繁的一次次下载,安装。
yum repository: yum repo(yum仓库)
存储了众多rpm包,以及包的相关的元数据文件(放置于特定目录下:repodata,所以repodata所在的目录就是yum 仓库要指向的路径)
每次启动yum命令时,都连接yum服务器调取取元数据(通过对比校验码确认是否有数据更改,决定是否要下载,更新本地过时的缓存)
yum客户端:
配置文件:
/etc/yum.conf:为所有仓库提供公共配置 ,一般无需修改
/etc/yum.repos.d/*.repo:为仓库的指向提供配置,如果文件名字不以.repo结果,则该仓库不会被应用
仓库指向的定义:
[repositoryID] #仓库ID name=name for this repository #仓库名称 baseurl=url://path/to/repository/ #指定仓库的路径 enabled={1|0} #1代表启用 gpgcheck={1|0}#是否检查源的合法性,验证签名信息 gpgkey=ur1 #指明密钥文件 enablegroups={1|0} failovermethod={roundrobin|priority} 默认为:roundrobin,意为随机挑选;priority 从第一个开始查找 cost= 默认为1000 相关命令: 显示仓库列表: repolist [all|enabled|disabled]
显示程序包:
list
# yum list [all | glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates} [glob_exp1] [...]
[root@node2 ~]# yum list httpd Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile Installed Packages httpd.x86_64 2.2.15-39.el6.centos @LocalCD/$releasever Available Packages httpd.x86_64 2.2.15-45.el6.centos
安装程序包:
install package1 [package2] [...]
reinstall package1 [package2] [...] (重新安装)
升级程序包:
update [package1] [package2] [...]
downgrade package1 [package2] [...] (降级)
检查可用升级:
check-update
卸载程序包:
remove | erase package1 [package2] [...]
查看程序包information:
info [...]
包组管理的相关命令:
* groupinstall group1 [group2] [...]
* groupupdate group1 [group2] [...]
* grouplist [hidden] [groupwildcard] [...]
* groupremove group1 [group2] [...]
* groupinfo group1 [...]
yum grouplist #查看源里面的所有包组
yum groupinstall "Development tools"
yum groupinfo "Development tools"
清理本地缓存:
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
常用yum clean all, yum通常会自动删除已安装的包的缓存
构建缓存:
makecache
yum的命令行选项:
--nogpgcheck:禁止进行gpg check;
-y: 自动回答为“yes”;
-q:静默模式;
--disablerepo=repoidglob:临时禁用此处指定的repo,(即便配置文件中已经启用,命令模式优先于配置文件)
--enablerepo=repoidglob:临时启用此处指定的repo;
--noplugins:禁用所有插件;
练习:使用本地光盘搭建一个Yum仓库,利用Yum安装程序包
第一步:挂载光盘,找到Repodata目录
[root@node2 /]# mount /dev/cdrom /mnt/cdrom/ mount: block device /dev/sr0 is write-protected, mounting read-only [root@node2 /]# ls /mnt/cdrom/ #Repodata所在的目录就是仓库要指向的路径,里面定义了包与包之间的依赖关系 [root@node2 /]# ll /mnt/cdrom/ total 712 -r--r--r-- 2 root root 14 Oct 24 2014 CentOS_BuildTag dr-xr-xr-x 3 root root 2048 Oct 24 2014 EFI -r--r--r-- 2 root root 212 Nov 28 2013 EULA -r--r--r-- 2 root root 18009 Nov 28 2013 GPL dr-xr-xr-x 3 root root 2048 Oct 24 2014 images dr-xr-xr-x 2 root root 2048 Oct 24 2014 isolinux dr-xr-xr-x 2 root root 686080 Oct 24 2014 Packages -r--r--r-- 2 root root 1354 Oct 20 2014 RELEASE-NOTES-en-US.html dr-xr-xr-x 2 root root 4096 Oct 24 2014 repodata -r--r--r-- 2 root root 1706 Nov 28 2013 RPM-GPG-KEY-CentOS-6 -r--r--r-- 2 root root 1730 Nov 28 2013 RPM-GPG-KEY-CentOS-Debug-6 -r--r--r-- 2 root root 1730 Nov 28 2013 RPM-GPG-KEY-CentOS-Security-6 -r--r--r-- 2 root root 1734 Nov 28 2013 RPM-GPG-KEY-CentOS-Testing-6 -r--r--r-- 1 root root 3380 Oct 24 2014 TRANS.TBL [root@node2 /]#
第二步:自定义xxx.repo文件,并配置,并禁用系统自带的.repo文件
[root@node2 yum.repos.d]# cat local.repo [LocalCD] name="local CD" baseurl=file:///mnt/cdrom #定义了yum仓库的路径 gpgcheck=no #不做包合法性检查 enabled=1 #启用此yum源,如果没有此行,也会默认启用 [root@node2 yum.repos.d]# ls CentOS-Base.repo CentOS-Debuginfo.repo CentOS-fasttrack.repo CentOS-Media.repo CentOS-Vault.repo local.repo [root@node2 yum.repos.d]# mv CentOS-Base.repo{,.bak} #J将系统自带的仓库配置文件改名后,就可以停用它
第三步:检查yum仓库能否正常使用
[root@node2 yum.repos.d]# yum repolist Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile repo id repo name status LocalCD "local CD" 6,518 repolist: 6,518 [root@node2 yum.repos.d]# yum install zsh #尝试yum install zsh, 出现如下信息即代表正常 Loaded plugins: fastestmirror, refresh-packagekit, security Setting up Install Process Loading mirror speeds from cached hostfile Resolving Dependencies --> Running transaction check ---> Package zsh.x86_64 0:4.3.10-7.el6 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================================= Package Arch Version Repository Size ============================================================================================================================================================================================= Installing: zsh x86_64 4.3.10-7.el6 LocalCD 2.1 M Transaction Summary ============================================================================================================================================================================================= Install 1 Package(s) Total download size: 2.1 M