程序包的编译与安装

程序源代码-->预编译-->编译-->汇编-->链接-->运行

链接时关联到相关的数据库

编译又分 静态编译:程序文件自带库 动态编译:.so程序文件不自带库,而是共享操作系统的库来编译

API:应用程序接口

编译和开发源程序的接口
	如果一个程序包在两个平台都支持posix标准 即在windows上开发的程序也可以在linux上编译,反之亦然
	pos:可移植操作系统 后改名成posix

	posix标准即是该程序包在两个平台的api接口相同,意味着有关库的接口相同(库的功能相同又互相兼容)

	即编译时要移植api要相同

ABI:应用二进制接口

如果一个编译完的程序如果想要在另一个平台上运行 要保证abi要相同

例如:在linux上编译完的程序移到windows上运行 即使api相同  也不能运行 因为不同操作系统的链接库的格式有可能不同如windows的动态库为.dll结尾linux 的时.so而且不同操作系统的二进制格式可能不同如windows的可执行二进制格式为exe,linux的为elf

查看二进制程序所依赖的库文件 ldd /path/to/file

管理查看本机的库文件 ldconfig 系统重新生成缓存 -p 显示本机一斤缓存的所有可用的库文件即其路径映射关系 -v 显示详细信息

	配置文件
			/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
	缓存文件
			/etc/ld.so.cache

二进制应用程序的组成部分

	二进制文件  库文件  帮助文件  配置文件
	------------------  ------------------ 
	是源代码的组成部分   通常放在源代码目录中,不能编译

程序包管理

debian :deb ,dpt
redhat :rpm ,rpm

源代码的命名方式

name-version.tar.gz 

rpm包的命名方式

name-version-release.arch.rpm

version:majoy,minor.release
release:release.os

常见的arch

X86:i386,i486,i586,i686
X86_64: x64 x86_64 amd64
powerpc:ppc

程序包管理工具

yum: rpm包管理器的前端管理工具
dnf: Fredora 22+ rpm包管理工具 用法与yum相同
apt-get: deb包前端管理工具
zyypper:suse全段管理工具

rpm 程序包管理 功能:将编译好的应用程序的各组组成各组文件打包成一个或几个程序包文件,从而方便快捷的实现程序包的安装,卸载,查询,升级,和校验等管理操作

1.程序的组成清单(每个包独有) 文件清单 安装或卸载时运行的脚本(如安装nginx程序包运行时需要使用nginx用户运行,如果系统中没有nginx用户在安装程序包的时候会帮你创建) 2.数据库(公共) 程序包名及其版本 依赖关系 功能说明 安装生成各文件的文件路径机器校验码信息

程序包搜索引擎 http://pkgs.org http://rpmfind.net http://prpm.bphone.net

升级操作时注意事项 1.不要对内核执行升级操作,linux支持多内核版本的并存,因此直接安装新版本内容 2.如果原程序包的配置,在安装之后被修改,升级时,新版本提供的同一个配置文件不会直接覆盖原程序配置文件,而是把新版本的配置文件重命名(filename.rpmnew)后保存,但如果配置文件相同则不会新建配置文件

rpm相关命令 rpm{i|install} -v:显示详细安装信息 -vv:显示更详细的安装信息 -h:显示安装包时的安装进度 rpm -ivh package

--test:测试安装但不真正执行安装操作
--nodeps:忽略依赖关系
--replacepkgs:重新安装
--nosignature:不检查来源合法性
--nodigest:不检查包的完整性
--noscript:不执行包的脚本片段
	pre 安装前执行
	post 安装后执行
	perun 卸载前执行
	postun 卸载后执行

升级
	-U 升级操作,如果安装有旧版本的程序包,则执行升级操作,否则就下载新版程序包
	-F 升级操作,如果没有安装旧版的程序包,则不执行升级操作,也不下载

	--oldpackage 降级操作
	--force 强制

查询rpm包

	rpm {-q|--query}[selection-options][query-options]

		[selection-options]
			-a:查询已安装的所有包
			-f:查看指定的文件由哪个程序包安装完成
			-p:/path/to/packfile 查询未安装的程序包文件
		
		--whatprovides capability 查询指定的能力由那个程序包所提供
					如	/bin/ls
		--whatrequires capability 查询指定的能力被哪些包所依赖
					如  /etc/cat	
		
		[query-options]

			--changelog:查询已安装rpm包的changelog(改变日志)
			-d:查看指定rpm包的帮助文件
			-c:查看指定rpm包的配置文件
			-i:查看指定rpm包的信息
			-l:查看指定程序包安装后生成的所有文件
			--script:查看指定rpm的脚本片段
			-R:查询指定程序包所依赖的capability
			--provides 查询指定程序包所提供的capability
				例如 rpm -qR php-common
					 rpm --provides	php-common



卸载
	rpm {-e|--erase}

		--scripts
			per
			post
			perun
			postun
		--test
		--nodeps

检验 rpm包是否发生了更改

	rpm -V (zsh) 跟程序名

	 	S M 5 D L U G T D 
	 	S 文件大小发生了改变
	 	M 文件的模式(包括许可和文件类型)发生了改变
	 	5 MD5校验码不一样
	 	D 设备主从设备号发成了改变
	 	L 符合连接发生了改变
	 	U 文件的属主发生了改变
	 	G 文件的属组发生了改变
	 	T 文件的修改时间发生了改变
	 	P 功能发生改变

数据库的重建(数据库损坏或文件损坏)/var/lib/rpm
	rpm {--initdb|--rebuilddb}
			
			--initdb 初始化
				如果实现不存在数据库则创建否则不执行任何操作
			--rebuilddb
				无论当前有无数据库,直接创建数据库
	其是通过读取每个文件的元数据进行构建

导入GPG密钥 --import,-K

		rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY

yum源

yum的安装rpm包过程

	yum在安装rpm时,根据配置文件指定的url路径去寻找指定的地址,此时相关的文件服务器需要开启文件共享接口,在下载文件之前,先下载一份文件服务器上仓库的元数据文件

	(repodata目录下的一些元数据文件到客户端文件的cache(/var/cache/yum)中)
	
	之后yum在分析这些元数据文件 有无我们需要的rpm包及其相关依赖的包,如果相关依赖的包中有部分依赖的包我们已经下载,则不会重复下载因为在下载前yum会检查本地
	是否有那些依赖包。安装完成后卸载装好的程序包缓存,但是一般都不去删除元数据文件。

	不删除元数据文件 这样会导致一个问题如果仓库现在又更新除了新的文件,或者除了新版本的文件,或出现新的依赖关系,那我们客户端如果想要下载新版本的文件但是无法下载这显然时不可以的
	所以我们每次去请求下载程序包的时候都会请求元数据信息如果我们每次都请求那我们不删除元数据信息又有什么意义呢 在服务器仓库中会提供一个文件 他将文件中的每个元数据文件的特征码记录下来
	如果这些文件中的内容发生了变化,那其中的特征码坑定发生了改变,所以我们请求的元数据信息其实不是元数据文件而是请求一个校验码,将其与缓存中的元数据文件进行对比,如果两个文件的特征码相同,则不下载元数据文件,否则则下载。

	如 /var/cache/yum/X86_64/7/base 中repomd.xml记录的就是特征码 primary的记录的就是文件相关的元信息

在rpm或者使用yum工具安装的过程中如果有对安装修改文件卸载等操作都会建立一个事务,linux中只支持一个这样的事务运作,也就是说在下载的时候不能再打开一个终端进行更新卸载下载

关于yum的配置文件注意 在一个仓库中如果有多个url如 [base]中有多个下载路径,系统默认是随机选择一条路径进行下载,但也可以按顺序指定,域名、相关命令中会讲到

仓库的定义

[repositoryID]
name=some name for this repository
baseurl=url
enabled={0|1} 默认为1 可不写enabled
gpgcheck={0|1} 指定是否检测文件的来源合法性文件的完整性,此项为一时,如果没有指定gpgkey则无法安装成功
gpgkey=url
failovermethod={roundrobin|priority} 默认为随机(roundrobin) url使用priority按指定的url顺序查找

yum的repo中可用变量

	$releasever
	$arch
	$basharch

如 http://mirror.122.com/centos/$releasever/$basharch/os

	灵活根据发行版下载程序包

yum的相关命令

安装 :yum install package1 [package2] [..]
重装 :    reinstall package1 [package2] [..] 
升级 :    update [package1] [package2] [..]
降级 :	   downgrade package1 [package2]
卸载 :    remove package1 ..

检查升级 check-update 查看程序包信息(包括没装的) info[..] 清理本地缓存 clean[packages|metadata|all|..] 构建缓存 makecache 搜索 search string1 以指定的关键字 查看指定包所依赖的capability deplist package1 查看yum事务历史 history [info|list|package=list|stats(统计)] 包组管理的相关命令 groupinstall group1 [group2] groupupdate ~ grouplist ~ groupremove ~ groupinfo ~

若显示的是中文 可以使用中文安装

如 groupinstall "开发工具"

yum命令行选项 --nogpgcheck 禁止进行gpgcheck -y 自动回答为yes -q 静默模式 --disablerepo=repoidglob 临时禁用指定的repo --enablerepo=repoidglob 临时启用指定的repo --noplugins 禁用所有插件

源代码编译

安装包 gcc  gcc-c++ glibc devel 

源代码的组成格式
	多文件:文件中的代码中,很可能出现跨文件依赖关系
		可以通过make来解决
	c,c++:make(configure --> makefile.in --> makefile)
	java:maven

编译安装三步骤

	一 
		./configure
		
				1.通过选项传递参数,指定启用的特性,安装路径等,执行时会参考用户的指定以及makefile.in文件生成makefile
				2.检测依赖的外部环境
	二
		make
				根据生成的makefile文件构建应用程序
	三
		make install

开发工具
	
	autoconf:生成 configuer 	
	automake:生成 makefile.in 

安装先看install或者readme

编译c源代码 前提:提供开发工具,及开发环境、 开发工具:make gcc等 开发环境:开发库,头文件 glibc:标准库

	通过包组提供开发组件
		centos6 "Development Tools" "Server Platform Development"

第一步

	一. configure脚本
		选项: 指定安装位置,指定启用特性
			安装路经指定
				--perfix==/path/to/somewhere 指定默认安装路径 否则默认安装路径为/usr/local
				--sysconfdir=/path/to/somewhere 指定配置文件安装位置

				optional feature :可选特性

				optional package :可选包
						--with-package
						--without-package       指定安不安装相关依赖包

	二. make

	三. make install

安装后的配置 因为是源码包 所以安装路径都是我们指定的 所以我们要指明相关配置

	1.导出二进制程序至PATH环境变量中
		编译/etc/profile.d/name.sh
			export PATH=/path/to/bin:$path
			因为执行程序在bin中 所以路径上有bin

	2.导出库文件路径
		编译/etc/ld.so.conf.d/name.conf
			添加新的库文件所在目录至此文件中
					例如 在配置文件中添加 /usr/local/apache/lib/

	3.导出头文件 一般都在(/usr/include)
		基于链接的方式实现
			ln -s /usr/local/apache/include /usr/include/apache

	4.导出帮助文件
		centos6 /etc/man.config
			添加一行MANPATH /usr/local/apache/man
		centos7 /etc/man_db.conf
			添加一行MANDATORY_MANPATH /usr/local/apache/man