一、编程语言与操作系统:
应用程序
____________________
|lib call | |
|-------------------|
|system call |
|———————————----————|
|各种硬件 |
————————————————————|
API:application program interface
ABI:application binary interface
Api应用层级兼容,未必abi层次也兼容,有些程序对二进制的识别格式是不相同的
UNix-like:ELF格式的程序
windows:exe,msi
linux:wine模拟windows库
windows:Cywin虚拟出linux运行环境
系统级开发:C/C++:httpd,vsftpd,nginx
go编程语言:新贵
C/C++编程依赖于系统上的标准库
应用级开发:java/Python/perl/ruby/php
java:hadoop,hbase,(jvm)运行环境
Python:openstack 云管理平台,(pvm)
perl:(perl)perl的解释器
ruby:(ruby)解释器/虚拟机{运行环境}
php:(php)
//一般解释器或者虚拟机{jvm,pvm} 使用C/C++编写
php:世界上最好的语言
c/C++程序格式:
源代码:文本格式的程序代码
编译开发环境:编译器、头文件、开发库
二进制格式:文本格式的代码-->编译器-->二进制格式(二进制程序、库文件、配置文件)
java/python
源代码:编译成能够在其虚拟机(jvm/pvm)上运行的格式
开发环境:编译器、开发库
二进制:
项目构建工具://不再需要考虑程序编译主次关系,由项目构建关系负责,项目构建工具借助于配置文件实现
c/c++:make
java:maven
程序包管理器:
源代码 --> 目标二进制格式 -->组织成为一个或有限几个“包”文件;
安装、升级、卸载、查询、校验等操作
程序包管理器:
debian:kali,ubuntu //dpt,dpkg , ".deb"
redhat:rhel,centos,fedora //redhat package manager,rpm , ".rpm" //perl-C现在使用的是C语言写的
//rpm:rpm is package manager;成为标准
slckware:S.u.S.E: //rpm,suse的rpm和rhel的是不兼容的,suse为rpm开发了一个重要的库,后期被rhel收纳
//rpm:".rpm" 命令rpm
Gentoo: //采用了freebsd的机制,ports的包机制
Archlinux //轻量级,
源代码:name-VERSION.tar.[xz,gz,bz2]
VERSION:major-minor-release
major:重大改变
minor:局部改变
release:修复bug,小串代码改变
rpm包命令格式:
vsftpd-3.0.2-10.el7.x86_64.rpm
name-VERSION-release.arch.rpm
release:是制作rpm包的次数
VERSION.release是源代码的release
arch:architecture:i386,x64(amd64),ppc(powerpc),noarch(通用平台)
i386:支持较老版本的32bit cpu
i686:支持较新版本的32bit cpu
拆包:
redis-3.0.2.tar.gz--> redis.3.0.2-1.el7.x86_64
//把一个包的多种功能,拆成多个部分,按需组织rpm包
//主包和分支包
主包:name-VERSION-release.arch.rpm
支包:name-function-VERSION-release.arch.rpm
function:devel,utils(工具程序),libs,plugins(插件)
依赖关系:每个程序包的功能都很简单,包之间存在很复杂的依赖关系
x,y,z
x-->y,z
y-->a,c,b
c-->Y
前端工具:自动解决依赖关系
yum:rpm包管理器的前端工具
apt-get(apt-cache):deb包
zypper:suse上的rpm包管理器
dnf:Fedora 22+ 系统上的rpm包管理器的前端工具
程序包管理:
功能:将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而更方便地实现程序包的安装、升级、卸载和查询等操作
1.程序包的组成清单(每个程序包单独实现)
文件清单
安装或卸载时运行的脚本
2.数据库(公共)
程序包的名称和版本
依赖关系
功能说明
安装生成的各文件路径及校验码信息
/var/lib/rpm/ rpm数据库所在
二、获取程序包的途径:
1.系统发行版的光盘或者官方的文件服务器
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
2.项目官方站点
apache官网:www.apache.org
zabbix:www.zabbix.com
3.第三方组织
(a)EPEL:
mirrors.aliyun.com/epel/7/x86_64
(b)搜索引擎
pkgs.org
rpmfind.net
rpm.pbone.net
4.自己动手,丰衣足食
建议:校验,检查其合法性
来源合法性:
程序包的完整性:
三、Centos上rpm命令管理程序包
(1)安装
安装,升级,卸载,查询和校验,数据库维护
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-i :install
-v verbose通用选项,显示过程
-vv 更详细
-h 以hash输出进度条
--test 仅仅是检查一下,测试不安装
--nodeps //忽略依赖关系,no dependce
--replacepkgs //替代安装
--noscripts //有些程序包安装过程中,可能需要运行一段自带脚本,
rpm可以自带脚本:
四类:
preinstall:安装之前,%pre
postinstall:安装完成之后,%post
preuninstall:卸载开始前,%preun
postuninstall :卸载完成之后,%postun
--noscripts
--nopre
--nopost
--nopreun
--nopostun
--nosignature //来源合法性,不检查包签名信息
--nodigest //不检查包完整幸信息,头文件摘要
-U :update,-F --freshen//使更新
-e :--erase
-q:--query
-l :list生成文件
-V:--verify校验
数据库维护:
--builddb,--initdb
(2)升级
-U update
Uvh /Fvh
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ... //和安装一样
-U 升级或者安装,有没有老版本,都会安装
-F 升级,有老版本才会安装
--oldpackage :降级安装老的程序包,不兼容
--force:强制升级
其他和rpm -ivh 一样
注意:
(1)不要对内核做升级操作,更新内核需要重启系统
//linux支持多内核版本并存,因此,直接安装新版本内核即可
(2)如果某源程序包的配置文件,安装后曾被修改过,升级时,新版本的程序提供的同一个配置那文件不会覆盖原有的
配置文件,而是把新版本的配置文件,重命名后(filename.rpmnew)后,提供
(3)卸载
-e
--allmatches //假如存在多版本的话,多版本一并删除
--nodeps //忽略依赖关系
--test //dry run 仅仅测试
--noscripts //不执行脚本
rpm -e zsh //pack_name zsh即可,数据库中有文件保存
rpm -ivh 文件名
(4)查询
rpm {-q|--query} [select-options] [query-options]
-q zsh //查询指定包zsh是否安装
select-options:
-a,--all 不加选项,查询所有已经安装的包
rpm -qa |grep zsh
-f /etc/fstab 查询文件的安装包
-g,--group 组名//查询指定包组中包含的包
-p,--packaeg package_file:实现查看未安装包的,结合query-optionss实现
rpm -qpl zsh-5.0.2-14.el7.x86_64.rpm //查询未安装程序包的安装能够生成文件
--wahtprovice CAPABILITY//查询提供某种能力的包
rpm -q --whatprovide 'config(bash)'
--whatrequires CAPABLITY //查询指定的CAPABILITY被哪个程序包所依赖
query-options
--changelog //查询rpm包的changelog,不是源码的
rpm -q --changelog zsh //查看zsh的改进日志
-l,--list //程序包安装生成的所有文件列表
rpm -ql zsh
-i info,查询程序包相关信息,版本号,大小,所属的包组,等
rpm —qi bash
-c ,--configfiles:查询指定的程序包的配置文件
rpm -qc bash
-d,--docfile :查询指定的程序包的帮助文档
rpm -qd bash
--provides:列出指定的程序包提供的CAPABILITY
rpm -q --provides bash //bash提供的
rpm -q --whatprovides 'config(bash)'
-R requires//查询指定程序包的所依赖的程序包
rpm -qR bash
--scripts //查询脚本
rpm -q --scripts bash
rpm -qp --scripts zsh-5.0.2-14.el7.x86_64.rpm
ql,qf,qc,qi,qd //qf文档的产生源
(5)校验
rpm {-V|--verify} [select-options] [verify-options]
-V //rpm -V zsh //安装完成后,校验
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
rpm -ql zsh //随意修改其中一个文件
rpm -V zsh //就能看到效果
select-options:和查询的select-options一样
-a,-f,-g,-p
verify-options:
--nodeps 不校验依赖
--nodigest 不校验包头,
--noscripts 不检查脚本
--nofiles 不检查
--nosignature 不检查包头签名信息
//默认检查所有属性
rpm -V --nofiles zsh
(6)包来源合法性验证和完整性验证
来源合法性验证:
数字签名:非对称加密:一个公钥,一个私钥
包的制作者,
1.首先使用单项加密,计算出包的特征码,定长输出
2.然后再用自己的私钥加密特征码,这叫数字签名 ,
3.把加密后的特征码附加到包后
//只要拿到公钥,就能解密
中间者:能够解密特征码,因为能拿到对方公钥,但是不能再次加密,因为没有作者的私钥
//用户拿到作者的公钥,进行解密特征码,解密成功,则认为来源合法
//我用同样的方法,进行单项加密计算特征码,一样则证明包内容没有修改过//完整性
如何拿到对方的公钥:
1.从网上下载,不可靠
2.互联网上是使用CA来实现,可靠手段拿到对方公钥
rpm --import /mnt/RPM-GPG-KEY-CentOS7 //导入公钥
/etc/pki/rpm-gpg/ 导入到此地
对于CentOS发行版:rpm --import
rpm -ivh zsh-***** //自动进行校验操作
rpm -K zsh-5.03..... //手动验证
验证:
安装此组织签名的程序时,会自动执行验证
手动验证:rpm -K PACKAGE_FILE
1
数字签名:保证来源合法性和数据完整性
(7)数据库重建
rpm管理数据库路径:/var/lib/rpm/
查询操作:就是基于该数据库查询
Centos6:man rpm //rpm --initdb|--rebuilddb
Centos7:man rpmdb
rpmdb
--initdb 初始化db,当前无任何数据库时创建一个新的,当前有,不执行任何操作
--rebuildb 重建db,重新构建,通过读取当前系统上所有已经安装过的程序包进行重新创建
--dbpath 指定db路径
rpmdb --initdb --dbpath=/tmp/rpm
四、rpm命令小结
linux程序包管理器,rpm包管理器
安装:rpm -ivh ,--nodeps,--replacepkgs 卸载:-e,--nodeps 升级:-U|-F vh //F只用于升级,--nodeps,--oldpackage 查询:-q,-a,f,i,qd,qc,--script,changelog,provides/whatprovides,requires/whatrequires 校验:-V, 验证合法性:--import,-K手动验证,--nodigest,--nosignature 数据库重建:rpmdb --initdb --rebuilddb