一、程序包管理概述 1.程序包语言 (1)系统级开发:一般直接调用硬件 C/C++:httpd, vsftpd, nginx Go语言 (2)应用级开发:Java/Python/perl/ruby/PHP: java: Hadoop, Hbase, (基于jvm虚拟机) Python:OpenStack, (基于pvm虚拟机) perl: (perl解释器) ruby: (ruby解释器) php: (php解释器) 2.程序语言格式 (1)C/C++程序格式: 源代码:文本格式的程序代码; 编译开发环境:编译器、头文件、开发库 二进制格式:文本格式的程序代码 --> 编译器 --> 二进制格式(二进制程序、库文件、配置文件、帮助文件) (2)java/python程序格式: 源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式; 开发环境:编译器、开发库 二进制 3.项目构建工具: c/c++: make java: maven 4.程序包管理器:要完成安装、升级、卸载、查询、校验(校验为Linux所有)功能 (1)功能 将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等管理操作; (2)组成方式 1)程序包的组成清单(每个程序包都单独实现):文件清单、 安装或卸载时运行的脚本 2)数据库(公共):/var/lib/rpm/ 程序包的名称和版本、依赖关系、 功能说明、安装生成的各文件的文件路径及校验码信息... (3)不同系列Linux所用程序包管理器: debian:dpt, dpkg, ".deb" redhat:redhat package manager, rpm, ".rpm"; rpm is package manager; S.u.S.E:rpm, ".rpm", Gentoo:ports ArchLinux: 5.包的命名格式 (1)源代码:name-VERSION.tar.*z VERSION:major.minor.release 主版本号.次版本号.发行号 (2)RPM包:name-VERSION-release.arch.rpm VERSION:major.minor.release release.arch:rpm包的发行号,arch 平台号 6.RHEL制作RPM包时会拆包:主包和支包,方便安装所需要组件而非全部 主包:name-VERSION-release.arch.rpm 支包:name-function-VERSION-release.arch.rpm function(功能):devel, utils, libs, ... 7.程序包管理器前端工具:自动解决依赖关系; yum:rhel系列系统上rpm包管理器的前端工具; apt-get (apt-cache):deb包管理器的前端工具; zypper:suse的rpm管理器前端工具; dnf:Fedora 22+系统上rpm包管理器的前端工具,yum的升级版; 8.获取程序包的途径: (1)系统发行版的光盘或官方的文件服务器(或镜像站点): http://mirrors.aliyun.com、http://mirrors.sohu.com、http://mirrors.163.com (2)各个项目自己的官方站点 (3)第三方组织: 1) EPEL等可靠地开源社区组织 2) 搜索引擎:http://pkgs.org、 http://rpmfind.NET 、http://rpm.pbone.Net (4)自动编译二进制代码、制作
二、RPM方式管理(CentOS 7.1为例讲解) rpm命令:rpm [OPTIONS] [PACKAGE_FILE] 安装:-i, --install 升级:-U, --update, -F, --freshen 卸载:-e, --erase 查询:-q, --query 校验:-V, --verify 数据库维护:--builddb, --initdb 前提:挂载官方镜像CentOS-7-x86_64-Everything-1503-01.iso,RPM包位置Packages目录
Last login: Mon Dec 21 06:57:01 2015 from 172.16.250.39 [root@localhost ~]# mkdir /media/cdrom #创建挂载点目录 mkdir: 无法创建目录"/media/cdrom": 文件已存在 [root@localhost ~]# mount /dev/cdrom /media/cdrom #挂载光盘 mount: /dev/sr0 写保护,将以只读方式挂载 [root@localhost ~]#
1.安装: (1)rpm {-i|--install} [install-options] PACKAGE_FILE ... rpm -ivh PACKAGE_FILE ... GENERAL OPTIONS(通用选项): -v:verbose,详细信息 -vv:更详细的输出 [install-options]: -h:hash marks输出进度条;每个#表示2%的进度; --test:测试安装,检查并报告依赖关系及冲突消息等; --nodeps:忽略依赖关系;不建议; --replacepkgs:重新安装 --nosignature:不检查包签名信息,不检查来源合法性; --nodigest:不检查包完整性信息; 注意:rpm可以自带脚本; 四类:--noscripts preinstall:安装过程开始之前运行的脚本,%pre , --nopre postinstall:安装过程完成之后运行的脚本,%post , --nopost preuninstall:卸载过程真正开始执行之前运行的脚本,%preun, --nopreun postuninstall:卸载过程完成之后运行的脚本,%postun , --nopostun (2)实例演示 1)[root@localhost Packages]#rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm #安装zsh程序,显示过程
2)[root@localhost Packages]# rpm -ivh --test zsh-5.0.2-7.el7.x86_64.rpm [root@localhost Packages]# rpm -ql zsh 测试安装zsh,并不会真正的安装。查看zsh程序安装所生成的所有文件列表显示无程序
3)[root@localhost Packages]# rpm -ivh --nosignature zsh-5.0.2-7.el7.x86_64.rpm 安装时不检验签名信息,此处则不再显示警告信息,NOKEY
5)[root@localhost Packages]# rpm -ivh --nodigest zsh-5.0.2-7.el7.x86_64.rpm 安装时不检查安装包的完整性,直接强制安装 一般除非在十分确定自己做什么和相信此程序视乎才会使用 6)[root@localhost Packages]# rpm -ivh --test php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm [root@localhost Packages]# rpm -ivh --nodeps php-mysqlnd-5.4.16-23.el7_0.3.x86_64.rpm #测试安装 php-mysqlnd,需要安装php-pdo(x86-64),直接安装会报错,安装不了 #--nodeps 参数会忽略安装包之间的依赖关系,但时安装后很大可能不能正常使用,痴肥依赖关系实际上用不到,如.doc的帮助文档等
2.升级: (1)rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... rpm {-F|--freshen} [install-options] PACKAGE_FILE ... -U:升级或安装 -Uvh; rpm -Uvh PACKAGE_FILE ... -F:纯粹升级,必须存在老版本,不支持安装操作 -Fvh rpm -Fvh PACKAGE_FILE ... --oldpackage:降级; --force:强制升级; 注意: 1) 不要对内核做升级操作;Linux支持多内核版本并存,可直接安装新版本内核; 2) 如果某原程序包的配置文件安装后曾被修改过,升级时,新版本的程序提供的同一个配置文件 不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供; (2)实例演示 1)[root@localhost Packages]# rpm -e zsh [root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm [root@localhost Packages]# rpm -U zsh-5.0.2-7.el7.x86_64.rpm #卸载zsh程序包 #用 -F参数升级安装zsh程序细胞,查询结果显示无法安装 # -C 参数则在当不存在原有安装包的时候能够安装该程序
2)将zsh-4.3.10版本升级到zsh-5.0.2版本
[root@localhost /]# rpm -q zsh #查看当前系统上的zsh程序 未安装软件包 zsh #显示当前系统上未安装zsh相关程序 [root@localhost /]# rpm -ivh zsh-4.3.10-9.el6.x86_64.rpm #安装4.3.10版本 警告:zsh-4.3.10-9.el6.x86_64.rpm: 头V3 RSA/SHA1 Signature, 密钥 ID c105b9de: NOKEY 准备中... ################################# [100%] 正在升级/安装... 1:zsh-4.3.10-9.el6 ################################# [100%] [root@localhost /]# rpm -q zsh #显示当前zsh版本信息 zsh-4.3.10-9.el6.x86_64 [root@localhost /]# cd /media/cdrom/Packages/ #移动到光盘镜像5.0版本位置 [root@localhost Packages]# rpm -F zsh-5.0.2-7.el7.x86_64.rpm #升级安装更高版本 警告:zsh-5.0.2-7.el7.x86_64.rpm: 头V3 RSA/SHA256 Signature, 密钥 ID f4a80eb5: NOKEY [root@localhost Packages]# rpm -q zsh #显示当前zsh版本信息 zsh-5.0.2-7.el7.x86_64
3.卸载: (1)rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--test] PACKAGE_NAME ... --allmatches:卸载所有匹配指定名称的程序包的各版本; --nodeps:忽略依赖关系 --test:测试卸载,dry run模式 (2)实例演示 1)[root@localhost Packages]#rpm -e --test zsh #测试卸载zsh [root@localhost Packages]#rpm -ql zsh #查看zsh程序安装所生成的所有文件列表 结论:--test不会真的卸载程序
2)[root@localhost Packages] rpm -e zsh #卸载程序
4.查询: (1)rpm {-q|--query} [select-options] [query-options] [select-options] PACKAGE_NAME:查询指定的程序包是否已经安装,及其版本; -a, --all:查询所有已经安装过的包; -f FILE:查询指定的文件由哪个程序包安装生成; -p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作; --whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供; --whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖; [query-options] --changelog:查询rpm包的changlog; -l, --list:程序安装生成的所有文件列表; -i, --info:程序包相关的信息,版本号、大小、所属的包组,等; -c, --configfiles:查询指定的程序包提供的配置文件; -d, --docfiles:查询指定的程序包提供的文档; --provides:列出指定的程序包提供的所有的CAPABILITY; -R, --requires:查询指定的程序包的依赖关系; --scripts:查看程序包自带的脚本片断; 用法总结: -qi PACKAGE, -qf FILE, -qc PACKAGE, -ql PACKAGE, -qd PACKAGE -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, -qpc PACKAGE_FILE, ...d (2)实例演示 1)[root@localhost Packages]# rpm -ql php-mysqlnd #查询程序安装所以生成的所有文件列表
2)[root@localhost Packages]# rpm -qi zsh #显示程序的相关信息
显示内容注解: [root@localhost Packages]# rpm -qi zsh Name : zsh #安装包名称 Version : 5.0.2 #版本号 Release : 7.el7 #发行号 Architecture: x86_64 #所编译的安装平台64位架构平台 Install Date: 2015年12月22日 星期二 09时30分50秒 #安装日期 Group : System Environment/Shells #属在组:系统环境的shell中的一种 Size : 5834441 #程序大小 License : MIT #许可证:麻省理工大学 Signature : RSA/SHA256, 2014年07月04日 星期五 13时54分12秒, Key ID 24c6a8a7f4a80eb5 #签名 Source RPM : zsh-5.0.2-7.el7.src.rpm #安装源码RPM包 Build Date : 2014年06月10日 星期二 10时47分02秒 #RPM包创建时间 Build Host : worker1.bsys.centos.org #创建的主人 Relocations : (not relocatable) #重新安置 Packager : CentOS BuildSystem <http://bugs.centos.org> #制作人 Vendor : CentOS #卖主 URL : http://zsh.sourceforge.net/ # 文件所在URL Summary : Powerful interactive shell # 简介:强大的交互式shell Description : #详细描述 The zsh shell is a command interpreter usable as an interactive login shell and as a shell script command processor. Zsh resembles the ksh shell (the Korn shell), but includes many enhancements. Zsh supports command line editing, built-in spelling correction, programmable command completion, shell functions (with autoloading), a history mechanism, and more. 3)[root@localhost Packages]# rpm -qd zsh #查看包所提供文档位置
4)[root@localhost Packages]# rpm -qc zsh #显示zsh相关的配置文件的位置
5)[root@localhost Packages]# rpm -q --changelog zsh #查询zsh的改变日志 # 从近到远显示出该程序每次改版更新的相关信息
6)[root@localhost Packages]# rpm -q --provides zsh #显示程序包所提供的功能
7)[root@localhost Packages]# rpm -qR zsh #显示安装包所要依赖的库及其他相关
8)[root@localhost Packages]# rpm -q --scripts zsh #显示程序包自带的运行脚本片段 此处有四类脚本中的三类: #postinstall scriptlet (using /bin/sh):安装完成会后执行脚本 #preuninstall scriptlet (using /bin/sh):卸载开始之前执行脚本 #postuninstall scriptlet (using /bin/sh):卸载完成之后执行脚本
9)[root@localhost Packages]# rpm -q --whatprovides zsh #显示zsh功能是被哪个程序包所提供
10)[root@localhost Packages]# rpm -q --whatrequires zsh #查询功能被哪个所依赖,此处zsh未被系统上安装的包做依赖
5.校验: (1)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 #MD5校验码是否改变 D Device major/minor number mismatch #设备的主次版本号是否错配 L readLink(2) path mismatch # readlink路径是否错配 U User ownership differs #用户本身关系 G Group ownership differs # 用户组本身关系 T mTime differs # 修改时间modify time P caPabilities differ (2)实例演示 测试安装的程序的校验信息 [root@localhost Packages]# rpm -ivh --nodeps php-5.4.16-23.el7_0.3.x86_64.rpm [root@localhost Packages]# rpm -V php # 忽略依赖关系安装php程序,此处为了测试使用 #测试程序的校验信息
6.包来源合法性验正和完整性验证: (1) 检验方式 数字签名:用私钥加密对应程序的特征码 (2) 获取并导入信任的包制作者的密钥: 1)对于CentOS发行版来说:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
2)对于官方光盘内秘钥导入:[root@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-7 此处的RPM-GPG-KEY-CentOS-7为光盘内适配当前系统的光盘所自带的验证秘钥,不同系统不同 当秘钥导入到系统之后,再次安装后会自动执行验证,此时不会警告NOKEY
(3)验证: 1) 安装此组织签名的程序时,会自动执行验证; 2) 手动验正:rpm -K PACKAGE_FILE 在导入秘钥的CentOS7.1上验证
在未导入秘钥的CentOS 6.7 系统上验证
7.数据库重建: (1)rpm管理器数据库路径:/var/lib/rpm/ 查询操作:通过此处的数据库进行; (2)获取帮助:CentOS命令查询位置不同 CentOS 6:man rpm CentOS 7:man rpmdb (3)rpm {--initdb|--rebuilddb} [--dbpath DIRECTORY] [--root DIRECTORY] --initdb:初始化数据库,当前无任何数据库可实始化创建一个新的;当前有时不执行任何操作; --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建; [--dbpath DIRECTORY] :指明建立位置 (4)实例演示 1)在指定目录下/rpmdb下初始化一个rpm的数据库 注意:此时的库是没用的,所以大小和原来的库不同
2)查看/var/lib/rpm
(责任编辑:IT) |