程序是什么?指令+数据也好,算法+数据结构也罢。它的存在形式有两种:
1.源代码:包含了整个应用程序的编程语言的所有代码的文本文件
2.二进制:将源代码经过一系列转换之后得到的直接执行的文件
其中,使用源代码安装的过程如下:
预处理(用到预处理器) --> 编译(编译器) --> 字节码Bitcode 进行汇编(汇编器) --> systemcall直接运行;libcall需要链接(链接器);最终得到可执行的二进制程序文件。
汇编时,不一样的硬件往往不能兼容互通。因此诞生了一个国际化标准:
POSIX:Portable Operating System 可移植操作系统。至于IX是向unix致敬一下下
最终二进制文件到底能不能执行,取决于计算机的ABI接口。在不同OS上有着明显的差异,类unix系统上,ABI往往是ELF格式,如果是Windows系列 ;一般是exe或者msi格式.
我们再来回顾一下编程语言的分类
应用级编程语言:
Java(做应用程序很强,做系统菜鸡)
hadoop2-大数据处理平台,hbase-数据库,ELK-日志查询和分析检索系统
这些软件运行环境需要专有的一个环境叫:JVM
Python(离底层硬件距离太远,刚开始太消耗系统资源。现在来说,消耗已经可以忽略了 )
Openstack--云栈,saltstack--自动化运维管理工具 运行环境:PVM
perl、ruby(日本流行,开发很多曾经的经典游戏。)
PHP、go
而JVM PVM 和其他应用级语言所需要的解释器,都是由C语言开发的;
系统级编程语言:
C/C++
Linux、Unix的内核编程语言
编译开发环境:预处理器、编译器、头文件、开发库文件(能够让编译库运行的库)
(而像Java或者Python等应用级语言的开发环境:预处理器、编译器、开发库文件;)
通常情况下,源代码文件有多个,这些文件之间存在着一定的关联关系;我们称之为依赖关系;
软件项目构建工具:
C/C++:make
Java:maven
Python:buildout
尽管有了这些构建工具,编译源代码还是十分困难,因此有一些人把常用的代码打包封装成程序包,发布开源社区,方便使用
程序包的管理器:
不同的linux发行版本,有着不同的程序包管理器
Debian:dpt-Debian Package Toolkits。所有软件包封装成.deb后缀名的包文件,命令行工具 dpkg
Redhat:rpm-Redhat Package Manager ,rpm工具,.rpm后缀名
rpm称为linux的程序包管理器的行业标准
开始使用的是perl语言编写,后来用C语言重写了rpm,公布后改名为rpm is package manager。
Slackware(S.u.S.e):用的是rpm,但是对rpm进行了修改,以至于得到Redhat认可
Gentoo:从内核开始,可以供用户任意选择挑选软件;
采用的包管理器 : FreeBSD 的 portage的程序包管理机制,emerge工具
Archlinux:pacman
以CentOS为例,介绍下rpm程序包管理器的相关内容:
1.程序包的命名规则:
源代码包:software_name-VERSION.tar.gz
VERSION:major.minor.release
major:主版本号,通常代表重大功能改进的版本分支;
minor:次版本号,代表在某个版本的分支中的某个功能发生变化;
release:发行版本号,修复了某些BUG或者对某段代码进行了优化;
rpm程序包:
源代码包:software_name-VERSION.src.rpm
二进制文件包:
software_name-VERSION-[release].[os].arch.rpm
VERSION:major.minor.release
[release]:rpm包的发行版本号
[os]:软件所支持的操作系统版本信息,el6、el7、suse11、fedora22...
arch:硬件架构类型:i386 i686 x64(amd64) ppc sparc noarch...
例如 gcc-4.8.5-4.el7.x86_64.rpm
在制作rpm程序包的时候,通常其制作者会采用分包技术来构建rpm程序包:根据程序的不同功能,构建多个程序包;被分包的一般分为两类
1.主程序包:
software_name-VERSION-[release].[os].arch.rpm
2.附属功能包:
software_name-function-VERSION-[release].[os].arch.rpm
一般来讲,主程序包和附属功能包具有相同版本号 发行版本号 操作系统要求和硬件架构类型
所以 主程序包往往被所有的附属程序包所依赖;依赖关系:A --> B -->C D --> A 构成一个依赖黑洞 因此rpm存在着诸多‘不与人为善‘的弊端
获取程序包的途径:
1.系统发行版的光盘,或镜像
2.官方的文件服务器或者镜像站点:
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
http://mirrors.tuna.tsinghua.edu.cn
http://mirrors.hust.edu.cn
...
3.某项目的官方站点 例如apache
4.第三方组织制作的rpm程序包站点
Fedora EPEL:红帽官方的社区组织,在镜像站点中也包含EPEL镜像
搜索引擎:
http://pkgs.org 基本可以搜索到所有
http://rpmfind.net 法国的一个站点
http://rpm.pbone.net
5.自己制作 咯
建议:在获得程序包之后实施校验,完整性检查:
1.来源合法性
通过程序提供者的数字签名加密的数据,我们可以通过其公钥进行解密验证;
2.程序包完整性
sha-1校验码
rpm命令行工具:
安装 卸载 升级(降级) 查询 文件校验
【通用选项】:
-v --verbose:显示安装历程详情,仅仅显示安装软件名
-vv 显示非常详细的操作信息
安装:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
[install-options]
-h --hash 用50个“#”来表示安装进度
--test: 并不是真正的安软件包,仅仅是测试是否在安装时能够正常完成,dry run
--nodeps : 忽略因为依赖关系导致的安装错误,不建议使用
--replacefiles 安装软件包时,软件包中的文件会直接将原来安装的文件替换
--replacepkgs 不卸载软件包 而是重新装一遍
--noscripts 不运行任何脚本
--nopre
--nopost
--nosignature 不考虑软件包的来源是否合法
--nodigest 不考虑软件包是否完整
升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
可以升级也可以全新安装
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
仅仅是对已经安装的低版本的程序包进行升级安装
常用选项与安装相同
特殊的选项:
--oldpackage 降级安装
--force 强制升级
注意:
1.强烈建议:不要对内核进行升级操作;linux支持多内核
2.升级后带来文件的变化,系统默认不会直接更改之前的配置文件,新程序包的配置文件会被重命名,通常是:FILENAME.rpmnew
卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
--allmatches:卸载所有匹配指定名称的程序包的各个版本
--nodeps:忽略依赖关系
--test:测试卸载
--nopreun
--nopostun
查询:
rpm {-q|--query} [select-options] [query-options]
[select-options]
-a,--all:查询所有已安装的程序包名
-f,--file FILE 查找指定的文件是由哪个程序包提供的
-p,--package PACKAGE_FILE : 对还没安装的程序包文件中执行查询操作
--whatprovided CAPABILITY 查询指定的 CAPABILITY是由哪个程序包提供的
--whatrequires CAPABILITY
[query-options]
-c,--configfiles: 查看相关配置文件
-i,--info 查询程序包相关信息,包括版本号,发行号,等等
-l,--list 列表显示安装程序包会生成哪些文件
--providers: 列出指定程序包提供的所有的 CAPABILITY;
-R,--requires 查询指定的程序包的依赖关系
--scripts: 查询程序包的脚本
校验:
rpm {-V|--verify} [select-options] [verify-options]
[select-options] 与查询的[select-options]相同
认证:
--import PUBKEY ...导入相应的/PATH/TO/KEY_FILE
{-K|--checksig} [--nosignature] [--nodigest] PACKAGE_FILE ...
手动测试 验证软件包的合法性
数据库管理:
数据库的初始化和重建:/var/lib/rpm
rpm {--initdb|--rebuilddb}
[--dbpath DIRECTORY]