今天完整的学完了关于程序包管理的知识。
下面梳理一下学习的知识。
一个程序想要在机器上运行,大致经历一下几个过程:
程序源代码->预处理->编译->汇编->机器能读懂的指令格式
而在汇编过程中,除了要将源代码汇编,还将要源代码调用的库文件进行汇编;
- 静态编译:程序源代码自己工程中带有库。但这种方式就有弊端。就比如100个源代码都带有相同的库文件,得不偿失。
- 共享编译:源代码直接调用/lib,/lib64等目录下的共享库文件即可。(.so结尾)
ABI:(Application Binary Interface)应用二进制接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行
目标源代码在不同平台上编译为二进制代码之后:
- linux: .ELF 结尾
- Window: .exe 结尾
API:(Application Programming Interface)
只要遵循POSIX,操作系统就可以移植
因此就有了库级别的虚拟化,虚拟了操作系统的运行环境。运用API转换技术实现
eg:Linux中的WINE,能够支持Window的程序。只要将该程序相关的DLL库文件引入linux中即可。
二进制应用程序的组成部分:
二进制文件:位于/bin, /sbin, /usr/bin, /usr/bin, /usr/sbin, /usr/local/bin etc
库文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib ,/usr/local/lib64 .(note:系统是32位的没有lib64文件)
配置文件:/etc, /usr/local/etc etc ..
帮助文件:/usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc
所以在真正安装一个二进制程序时,上述组成部分到底放在哪个位置?因此就有了程序包管理器
程序包管理器:
redhat:rpm(redhat package manager)管理rpm包(以.rmp结尾的包)
不同程序包的命名方式:
源代码软件包:(需要手动编译安装)
name-VERSION.tar.gz
VERSION:主版本号.次版本号.发行号
rmp包:
name-VERSION-release.arch.rpm
VERSION:主版本号.次版本号.发行号
release:常见写法为release.os
arch:平台,eg:i386,i486,i586;x86_64,x64,amd64;ppc;noarch
eg:bash-4.3.2-1.centos.i386.rpm
如果一个应用程序大部分用户只使用一部分95%功能,而只有少部分用户使用剩下的5%,因为可以只将95%的功能汇编成二进制代码。
因此就出现了拆包。拆为主包和次包。因此就出现了包与包之间的依赖关系。
yum:rpm包管理器的前端工具。
使用yum在安装程序包时,它能够自动查找源数据文件并获取到包之间的依赖关系,而且能在指定的包仓库中去下载依赖包。
两个和库有关的命令:
ldd /PATH/TO/BINARY_FILE :查看二进制程序所依赖的库文件
ldconfig -p :显示本机已缓存的所有可用库文件名以及文件路径的映射文件
ldconfig 还可以改变配置后,让系统重新生成缓存然后读取
配置文件所在目录:/etc/ld.so.conf, /etc/ld.so.conf.d/*.conf
缓存文件所在目录:/etc/ls.so.cache
程序包管理:
将编译好的应用程序的各组成文件打包成一个或几个程序包文件,从而方便的实现程序包的安装,卸载,查询,升级和校验等管理操作
程序包的组成:
- 程序的组成清单(每个包都有各自的组成清单)
- 文件清单
- 安装或卸载时运行的脚本
- 数据库(公共)
- 程序包名称以及版本
- 依赖关系
- 功能说明
- 安装生成的文件的文件路径以及校验码信息(防止第三方更改)
管理程序包的方式:
- 使用包管理器:rpm
- 使用前端工具:yum,dnf
CentOS系统上rpm命令管理程序包
安装,卸载,升级,查询,校验,数据库维护。(使用直接查看 man rpm)
注意:rmp命令执行安装操作时不会安装依赖包
CentOS系统上yum命令管理程序包(类似于C/S架构)
yum repository:存储了众多rpm包,以及与包相关的元数据文件(放在特定目录下/repodata)
文件服务器类型:ftp://, http://, file:///, nfs://
yum客户端:
配置文件:
/etc/yum.conf:为所有仓库提供公共配置 (eg:缓存文件放在哪里)
/etc/yum.repos.d/*.repo:为仓库的指向提供配置信息
1 [root@VM_11_5_centos etc]# cd yum.repos.d/ 2 [root@VM_11_5_centos yum.repos.d]# ll 3 total 12 4 -rw-r--r-- 1 root root 614 Jul 25 18:43 CentOS-Base.repo 5 -rw-r--r-- 1 root root 230 Jul 25 18:43 CentOS-Epel.repo 6 -rw-r--r-- 1 root root 245 Sep 3 08:28 centos-local.repo.bak
自定义仓库
格式:
[repositoryID]
name=
baseurl=url://PATH/TO/repository(即repodata所在的目录,可设置多个)
enabled={1|0} 是否启用本仓库,默认启动1
gpgcheck={1|0}对此仓库中的所有程序包安装前是否检查其完整性及来源合法性
gpgkey=URL 指明密钥文件。(能访问到密钥文件的访问路径,可能是对方仓库提供多个)
enablegroups={1|0}是否允许在此仓库上基于组执行程序包管理
failovermethod={"roundrobin"|"priority"}故障转移方法。roundrobin:随机,priority:次序
cost=[1000]开销。默认1000
yum命令的用法(man yum)
程序包的编译安装:
- ./configure
- make
- make install
- ./configure(具体选项查看命令使用方法)
- 通过选项传递参数,指定启动特性,安装路径等。执行时会参考用户的指定以及Makefile.in文件生成makefile文件
- 检查依赖到的外部环境(如果某个依赖包不存在,则报错,下一步不能执行)
- make:
- 根据makefile文件构建应用程序
- make install
- 把构建好的应用程序的二进制文件放到二进制安装路径下,库文件方法哦指定的库文件中等
建议:安装之前查看INSTALL,README文档
安装后的配置:
- 导出二进制程序目录至PATH环境变量中,否则只能使用绝对路径来访问
- 编辑文件/etc/profile.d/*.sh
- export PATH=/PATH/TO/BINARY:$PATH
- 导出库文件路径
- 编辑/etc/ld/so/conf.d/*.conf,把库文件路径直接添加进去即可
- 让系统重新生成缓存 ldconfig [-v]
- 导出头文件
- 基于软链接的方式实现即可 ln -sv ..
- 导出帮助手册
- 编辑/etc/man.config文件,添加一个manpath即可,会立即生效。
编译安装具体执行见下一篇;P ---by:孙好烦