Linux程序包管理
API:Application Program Interface ABI:Application Binary Interface Unix-like, ELF Windows exe,msl 库级别的虚拟化: Linux:WinE Windows:Cywin 系统及开发 C/C++:httpd,vsftpd,nginx 应用级开发 java/Python/perl/ruby/php java:hadoop,hbase,(jvm) Python:openstack,facebook,(pvm) perl:(perl) ruby:(ruby) php:(php) C/C++程序格式: 源代码:文本格式的程序代码; 编译开发环境:编译器,头文件,开发库 二进制格式:文本格式的程序代码-->编译器-->二进制格式(二进制程序,库文件,配置文件,帮助文件) java/python程序格式: 源代码:编译成能够在其虚拟机(jvm/pvm)运行的格式; 开发环境:编译器,开发库 二进制 项目构建工具: C/C++:make java:maven
程序包管理器:
源代码-->目标二进制格式(二进制程序,库文件,配置文件,帮助文件)-->组织成为一个或有限几个“包”文件
安装,升级,卸载,查询,校验
程序包管理器: debian:dpt,dpkg,".deb" redhat:rpm[redhat package manager],".rpm"; rpm is package manager S.u.S.E:rpm,".rpm" 源代码:name-VERSION.tar.gz VERSION:major.minor.release rpm包命名格式: name-VERSION-release.arch.rpm VERSION:major.minor.release release.arch:rpm包的发行号 release.os:2.el7.i386.rpm archetecture:i386,x64(amd64),ppc,noarch 如:redis-3.0.2.tar.gz-->redis-3.0.2-1.centos7.x64.rpm 拆包:主包和子包 主包:name-VERSION-release.arch.rpm 子包:name-function-VERSION-release.arch.rpm function:devel,utils,libs,... 依赖关系: X,Y,Z X-->Y,Z Y-->A,B,C C-->Y 前端工具:自动解决依赖关系; yum:rhel系列系统上rpm包管理器的前端工具; apt-get(apt-cache):deb包管理器的前端工具; zypper:suse的rpm包管理器的前端工具; dnf:Fedora 22+系统上rpm包管理器的前端工具; 程序包管理器: 功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装,升级,卸载和查询等管理操作; 1.程序包的组成清单(每个程序包都单独实现); 文件清单 安装或卸载时运行的脚本 2.数据库(公共) 程序包的名称和版本; 依赖关系; 功能说明; 安装生成的各文件的文件路径及校验码信息; 等等等 /var/lib/rpm/ 获取程序包的途径: 1.系统发行版的光盘或官方的文件服务器(或镜像站点) http://mirrors.aliyun.com http://mirrors.sohu.com http://mirrors.163.com 2.项目的官方站点: EPEL 搜索引擎 http://pkgs.org http://rpmfind.net http://rpm.pbone.net 自己动手,丰衣足食 建议:检查其合法性 来源合法性 程序包的完整性 CentOS系统上rpm命令管理程序包: 安装,升级,卸载,查询,校验,数据库维护 rpm命令:rpm [OPTIONS] [PACKAGE_FILE] 安装:-i,--install 升级:-U,--update,-F,--freshen 卸载:-e,--erase 查询:-q,--query 校验:-V,--verify 数据库维护:--builddb,--initdb 安装: 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:重新安装 注意:rpm可以自带脚本; 四类: preinstall:安装过程开始之前运行的脚本,%pre,--nopre postinstall:安装过程完成之后运行的脚本,%post,--nopost preuninstall:卸载过程真正开始执行之前运行的脚本,%preun,--nopreun postuninstall:卸载过程完成之后运行的脚本,%postun,--nopostun --nosignature:不检查包签名信息,不检查来源合法性 --nodigest:不检查包完整性信息; 升级: rpm {-U|--upgrade}{install-options}PACKAGE_FILE... rpm {-F|--freshen}{install-options}PACKAGE_FILE... -U:升级或安装 -F:升级 rpm -Uvh PACKAGE_FILE... rpm -Fvh PACKAGE_FILE... --oldpackage:降级; --force:强制升级; 注意: 1.不要对内核做升级操作;Linux支持多内核版本并存,因此,直接安装新版本内核; 2.如果某原程序包的配置文件安装后曾被修改过,升级时,新程序的程序提供的同一个配置文件不会覆盖原有版本的配置文件,而是把新版本的配置文件重命名(FILENAME.rpmnew)后提供; 卸载: rpm {-e|--erase}{--allmatches}{--nodeps}{--noscripts}{--test} PACKAGE_FILE... --allmatches:卸载所有匹配指定名称的程序包的各版本; --nodeps:忽略依赖关系; --test:测试卸载,dry run模式; 查询: rpm {-q|--query}{select-options}{query-options} {select-options} PACKAGE_FILE:查询指定的程序包是否已经安装,及其版本; -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,... 校验: 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 differs 包来源合法性验证和完整性验证: 来源合法性验证: 完整性验证: 获取并导入信任的包制作者的密钥: 对于CentOS发行版:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 验证: 1.安装此组织签名的程序时,会自动执行验证; 2.手动验证:rpm -l PACKAGE_FILE 数据库重建: rpm管理器数据库路径:/var/lib/rpm/ 查询操作:通过此处的数据库进行; 获取帮助: CentOS 6:man rpm CentOS 7:man rpmdb rpm {--initdb|--rebuilddb}{--dbpath DIRECTORY}{--root DIRECTORY} --initdb:初始化数据库,当前无任何数据库可初始化创建一个新的;当前有时不执行任何操作; --rebuilddb:重新构建,通过读取当前系统上所有已经安装过的程序包进行重新构建;