软件包管理
API(Application Programming Interface): 应用程序编程接口, API 兼容, 意味着开发库兼容, 因此源代码可跨平台
ABI(Application Binary Interface): 应用程序二进制接口, ABI 兼容, 意味着编译后的程序可跨平台
库为函数提供头文件, 是可执行的二进制程序, 不能作为程序执行的入口, 但可为其他程序所调用, 是编译好的二进制程序
动态链接库: 各个程序所共享
静态链接库: 将库包含在程序的自身中, 仅供本程序自身所使用
编译: 将源代码翻译成特定 cpu 指令集的过程, 此时的 ABI 库已经整合到程序中
应用程序跨平台应考虑:
1,os 平台: 编译好的应用程序必须为特定平台所支持的版本
2, 硬件平台: 应用程序为特定的 cpu 所支持, 这是由于 cpu 指令集不一定相同
软件包的组成部分:
二进制程序:/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64 通常到特定路径 (前四个) 下寻找
配置文件:/etc 配置文件无法共享, 仅为当前一个程序所使用, 无需额外配置
帮助文件: man 文件, info 文件, README,INSTALL,Changelog
--help: 在程序内部存放, 不需额外配置
man Command: 都某特定路径下查找以. gz 结尾的同名压缩文件, 通常查找路径 / usr/share/man
例如: 安装 nginx 至 / usr/local/nginx 路径
二进制程序:/usr/local/nginx/bin 或 / usr/local/sbin
需 PATH 提供路径或用绝对路径执行程序
自身库文件:/usr/local/nginx/lib 或 / usr/local/nginx/lib64
通过调整 / etc/ld.so.conf(主配置文件), 或添加至 / etc/ld.so.conf.d/*.conf 或添加软链接, 推荐最后一种
头文件:/usr/local/nginx/include
帮助文件:/usr/local/nginx/man
添加 / etc/man.config 中 MANPATH=/usr/local/nginx/man, 或执行
man -M /user/local/nginx/man nginx
查看命令帮助
配置文件:/usr/local/nginx/etc/
ldd: 显示共享库依赖关系, 查看应用程序所依赖的共享库
ldd [option] 二进制文件
或
- ldd [option] `which command`
- [root@ZYB ~]# ldd `which cat`
linux-vdso.so.1 => (0x00007fff6a73f000) `` 所有以动态方式调用其他库的入口, 每一个应用程序只要制作成动态调用其他库的格式后都应依赖的库, 但他直接被做进应用程序里面, 不是真正的调用库
libc.so.6 => /lib64/libc.so.6 (0x00007f3d901c3000) `` 共享库位置 =>可执行程序的位置(调用加载后内存中的地址)
/lib64/ld-linux-x86-64.so.2 (0x000055f8c3c99000) `` 直接说明调用的哪个库
所有能够使用一个相对应的包管理器所对应的包一定是事先打包好的包
包管理器指定特定路径, 把二进制程序, 头文件, 帮助文件, 配置文件等文件打包成一个文件, 按照某种格式存放, 组织, 或者把特定格式组织在一起的归档打包文件能够自动展开至系统相对应的路径下, 并且将展开的各文件保存在数据库中
功能:
1, 数据库:
名称和版本; 安装生成的各文件路径及校验码; 管理依赖关系(循环依赖, 版本依赖); 提供功能性的说明
例如 nginx: 记录二进制程序安装在哪些路径分别有哪些文件, 配置文件位置分别有哪些文件, 还保存每个文件的校验码
2, 提供程序组成格式:
文件清单; 安装卸载时运行的脚本; 等等
包管理器的基本功能
打包, 安装, 查询, 升级, 卸载, 校验, 数据库管理
应用程序的安装方式总结
使用包管理器: rpm, 便捷, 易用
包管理器的前端管理: yum, 可自动解决依赖关系, 建立在 rpm 基础之上
源代码编译:
简单打包的二进制格式: 展开至特定路径下, 简单配置就好
rpm 包命名格式
源程序: name-version.tar.{gz|bz2|xz}
version:major.minor.release
rpm 包: name-version-release.arch.rpm
release: 通常包含 rpm 包的制作发行号, 还包含使用的 OS
bash-4.3.2-2.el6.x86_64.rpm: 第二次制作的 rpm 包
nginx-1.4.16-5.rpm: 不限系统, 有些 32,64 系统, 架构都可用
分包
主包: bash-4.3.2-2.el6.x86_64.rpm
支包: bash-hello-4.3.2-2.el6.x86_64.rpm
bash-word-4.3.2-2.el6.x86_64.rpm
来源合法性验证
源程序: 通过 md5 或 sha1 校验码验证;
rpm 包: 发行商提供的是合法性是可信的
验证包完整性: 校验码
验证来源合法: 公钥加密算法
安装
rpm {-i|--install} /path/to/rpm_package ...
安装成功没有提示消息
-v 显示安装信息
-vv 二级详细
-vvv 三级详细
-h 以 #的个数显示安装进度, 一个 #表示 2% 的进度
--test 仅测试, 不真正执行安装过程
如果存在依赖
解决依赖关系: 手动一个一个查找, 遇到循环依赖基本挂了
忽略依赖关系:--nodeps, 有些包制作者认为需要依赖关系, 但实际不用
重新安装
rpm -ivh /path/to/rpm_package ... --replacepkgs
原来的配置文件不会被覆盖, 新安装的配置文件将会重命名为以. rpmnew 为后缀的文件, 有些没有这些功能, 所以要测试一下
卸载
rpm {-e|--erase} package_name
卸载如果卸载的包被其他包所依赖, 则报错不允许卸载
如果卸载被其他程序所依赖的包解决办法
1, 把依赖者一同卸载
2, 忽略依赖关系:--nodeps
3, 不再卸载, 有点废话
查询 rpm -q package_name
查询所有已安装的包: rpm -qa
可使用文件名通配或
rpm -qa | grep "^*"
正则表达式
查询包的描述信息
rpm -qi package_name
可不用跟版本号, q 和 i 顺序不可调换
- [root@ZYB ~]# rpm -qi bash
- Name : bash
- Version : 4.2.46
Release : 28.el7 rpm 包的发行号, 不是源码包发行号
- Architecture: x86_64
- Install Date: Sat 17 Mar 2018 12:06:19 PM CST
Group : System Environment/Shells 包组
Size : 3663637
License : GPLv3+ 许可证
Signature : RSA/SHA256, Thu 10 Aug 2017 11:03:40 PM CST, Key ID 24c6a8a7f4a80eb5
数字签名验证包完整性来源合法性
Source RPM : bash-4.2.46-28.el7.src.rpm 源码的 rpm 包
Build Date : Thu 03 Aug 2017 05:13:21 AM CST 包制作时间
Build Host : c1bm.rdu2.centos.org 在那个系统制作的
Relocations : (not relocatable)
Packager : CentOS BuildSystem <http://bugs.centos.org> 包制作者
- Vendor : CentOS
- URL : http://www.gnu.org/software/bash
- Summary : The GNU Bourne Again shell
- Description :
- The GNU Bourne Again shell (Bash) is a shell or command language
- interpreter that is compatible with the Bourne shell (sh). Bash
- incorporates useful features from the Korn shell (ksh) and the C shell
- (csh). Most sh scripts can be run by bash without modification.
rpm -q package_name 查询某单个包是否安装
rpm -ql package_name
查询包安装之后在当前系统生成文件列表
rpm -qf /path/to/somefile
查询某文件是由哪个包安装生成的
rpm -qd package_name
查询包安装后生成的帮助文档
rpm -qc package_name
查询安装后生成的配置文件
rpm -q --scripts package_name
查询包相关的脚本
脚本分四类
preinstall 安装前脚本
postinstall 安装后脚本, 如安装后启动服务程序
preuninstall 卸载前脚本, 如卸载前停止程序
postuninstall 卸载后脚本, 如卸载后删除相关文件
查询尚未安装的 rpm 包文件的相关信息:
rpm -qpl /path/to/package_file
查询安装后会生成的文件列表:
rpm -qpi /path/to/package_file
查询其简单描述信息 :
升级
rpm -U 升级或安装
rpm -F 只升级
rpm {-Uvh|-Fvh} /path/to/package_file
--nodeps 忽略依赖关系, 用于升级的时候其他包依赖于这个包
--force 强行安装, 有冲突时强行安装
注意: 不要对内核执行升级操作
多版本内核可以并存, 因此, 建议执行安装操作
校验, 检查包安装后生成的文件是否被修改过
- rpm -V package_Name
- [root@ZYB zyb]# rpm -V zsh
- [root@ZYB zyb]# vi /usr/share/zsh/5.0.2/functions/zfcget
- [root@ZYB zyb]# rpm -V zsh
- S.5....T. /usr/share/zsh/5.0.2/functions/zfcget
S file Size differs 大小
M Mode differs (includes permissions and file type) 头文件
5 digest (formerly MD5 sum) differs MD5
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 能力改变了
校验来源合法性和软件完整性, 这个是安装之前
包完整行: 通过单向加密机制(MD5|sha1)
来源合法性: 通过公钥加密机制(RSA)
导入制作者的公钥, CentOS 发行版的公钥在 iso 文件中
导入命令
- rmp --import /path/to/gog-key-file
- [root@ZYB mnt]# rpm --import RPM-GPG-KEY-CentOS-7
命令: gpg,pgp, 导入密钥后做检验
- rpm -K /path/to/somefile
- [root@ZYB ~]# rpm -K /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm
- /mnt/Packages/tree-1.6.0-10.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
- rpm --checksig /path/to/package_file
--nosigeature 不检查来源合法性
--nodigest 不检查包完整性
数据库重建
默认位置:/var/lib/rpm
非默认位置指令
rpm -{initdb| rebuilddb} [--dbpath /path/dir]
重建
rpm --initdb 初始化, 如果事先不存在一个数据库, 则新建之如果, 已存在不会重复执行, 也不会覆盖原有数据库
rpm --rebuilddb 重建, 直接新建数据库, 会覆盖原有库
rpm 包前端管理器: yum
yum(Yellowdog Update Modifier): 只是 rpm 的补充工作依然依赖于 rpm 包, 不能取代 rpm 包管理器, 自动解决依赖关系, 自动过程依赖于某一层机制, 意思是某个地方存放了许多的程序包
文件服务器 (共享 rpm 包) 通过 yum 所支持的文件共享机制, 将各 rpm 包通过文件服务共享
repository: 仓库, 可以有多个
1, 需要的各 rpm 包
2, 依赖关系, 程序包安装后所能够生成文件列表等元数据文件
yum 客户端
1, 配置文件: 指定各可用的 yum 仓库;
2, 缓存元数据: yum 会到各可用 yum 仓库获取元数据, 并缓存至本地
3, 分析元数据: 根据具体的操作请求完成元数据分析, 可能包括检查依赖关系, 文件列表等信息
4, 根据元数据分校结果执行具体操作
客户端配置文件指定对应服务器 (ftp,http,nfs,file) 访问方式:
- ftp ftp://server/path/to/repo
- http http://server/path/to/repo
- nfs nfs://servr/nfs_path
- file file:///path/to/path 用于客户端和服务器端是同一个主机
安装和卸载不用指定路径, 自动到 yum 仓库中获取, 因此可以直接指定 package_name, 要使用 yum 管理应用程序, 首先得配置其可用的 yum 仓库, 保存在配置文件中
/etc/yum.conf: 核心配置,[main]: 主配置段
/etc/yum.repo.d/*.repo: 仓库, 仓库配置段, 每一个仓库都有一个独立的这个配置段, 当前仓库的 ID
- [root@ZYB ~]# cat /etc/yum.conf
- [main]
cachedir=/var/cache/yum/$basearch/$releasever 缓存文件夹, 先对比本地缓存和远程仓库是否一样, 一样不用下载, 否则重新下载, 对比 md5 码
keepcache=0 是否保存缓存中曾已经被下载安装的 rpm 包
debuglevel=2 调试级别
logfile=/var/log/yum.log 日志文件
exactarch=1 精确匹配主机版本
obsoletes=1 废弃包
gpgcheck=1 检验程序包来源合法性及数据包完整性
plugins=1 是否支持 yum 插件
- installonly_limit=5
- bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
- distroverpkg=centos-release
- # This is the default, if you make this bigger yum won't see if the metadata
- # is newer on the remote and so you'll"gain" the bandwidth of not having to
- # download the new metadata and "pay" for it by yum not having correct
- # information.
- # It is esp. important, to have correct metadata, for distributions like
- # Fedora which don't keep old packages around. If you don't like this checking
- # interupting your command line usage, it's much better to have something
- # manually check the metadata once an hour (yum-updatesd will do this).
- # metadata_expire=90m
- # PUT YOUR REPOS HERE OR IN separate files named file.repo
- # in /etc/yum.repos.d 个人配置 yum 仓库路径
配置 repo
[base_1] 不能随便加空格,** 不能和其他仓库重名 **
name=Centos 7 x86_64 release 不需要加引号, 用空格也无所谓
baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/ 有 repodata 目录所在路径
enabled=1 1, 表示启用. 0 表示不启用, 默认启用
gpgcheck=1 1, 验证 gpg.0 表示不验证, 若启用 gpgkey 必选
gpgkey=http://mirrors.163.com/centos/RPM-GPG-KEY-CentOS-7 公钥地址可以是本地, 也可以是服务器端路径
cost=2000 默认为 1000, 开销越小越被优先使用
确定内核版本 uname -a
- [root@ZYB ~]# uname -a
- Linux ZYB 3.10.0-693.el7.x86_64 #1 SMP Tue Aug 22 21:09:27 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
查看是否启用 yum 仓库
[root@ZYB yum.repos.d]# grep "^enabled=.*" *.repo
yum 仓库信息
- [root@ZYB yum.repos.d]# ls /var/cache/yum/x86_64/7/base
- 017a874b73d9668d5eee574fb94c91bb7718e2107cfa4bd6356ee84e45204f84-primary.sqlite.bz2
- cachecookie
- gen
- mirrorlist.txt
- packages
- repomd.xml
yum 的各命令
repolist [all|enabled(默认)|disabled]: 列出所有可用的 yum repo
clean [all|packeages(包)|metadata(元数据)|expire-cache(过期数据)|rpmdb(rpm 数据)|plugins]: 清理缓存
list [all(默认)|installed(已安装过的)|available(可用)]: 列出 yum 包,@符号代表已安装
info package_name: 显示包的详细信息
grouplist: 列出所有的包组
groupinfo "package_group_name": 显示包组信息, 必须安装的包组, 可选包组, 可能有空格, 加引号
三个跟开发相关的包组:
Desktop Platform Development 有图形程序时需安装此组
- Server Platform Development
- Development Tools
如果系统为 Centos 5, 开发包组为 "Development Tools" 和 "DeveLopment Libraries"
如何系统为 centos 6, 常用的开发包为 "Development tools" 和 "Server Platform Development"
install package_name ...: 安装指定的程序包
reinstall package_name ...: 重新安装指定的包
yum check-update: 检查可升级的包
update packe_name ...: 指定升级的程序包, 默认升级到最高版本, 要升级到指定版本要带版本号
downgrade packe_name: 降级
erase|remove pack_name ...: 会自动把依赖到这个包的包卸载, 同 rpm -e 不同
whatprovides|provides /path/to/somefile: 查询某文件是由谁提供的
groupinstall "group_name": 安装指定包组
groupremove "group_name": 卸载指定组
yum history: 查看 yum 的命令历史
安装本地包: 若此前没导入公钥文件, yum 检查依赖关系完整性来源合法性时可能失败, 则安装不上
yum install /path/to/package_file
若检查公钥失败 yum 命令无法安装
手动禁止检查来源及完整性:--nogpgcheck
yum install /tmp/zsh-2.3.1-2.el6.x86_64.rpm --nogpcheck
yum 配置文件中可用的四个宏
$releasever: 程序的版本, 对 Yum 而言指是 redhat-relrase 版本. 只替换为主版本号, 如 Redhat6.5 则替换为 6
$arch: 系统架构, 与 pathon 中 os.uname()版本相同
- [root@ZYB ~]# python
- Python 2.7.5 (default, Aug 4 2017, 00:39:18)
- [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import os
- >>> os.uname()
- ('Linux', 'ZYB', '3.10.0-693.el7.x86_64', '#1 SMP Tue Aug 22 21:09:27 UTC 2017', 'x86_64')
- >>> quit()
$basharch: 系统基本架构, 如 i686,i586 等的基本架构为 i386
$YUM0-9: 在系统定义的环境变量, 可以在 yum 中使用, 给用户自定义用
获取当前系统相应宏替换的办法
- [zyb@ZYB ~]$ python
- Python 2.7.5 (default, Aug 4 2017, 00:39:18)
- [GCC 4.8.5 20150623 (Red Hat 4.8.5-16)] on linux2
- Type "help", "copyright", "credits" or "license" for more information.
- >>> import yum,pprint
- >>> yb = yum.YumBase()
- >>> pprint.pprint(yb.conf.yumvar,width=1)
- Loaded plugins: fastestmirror, langpacks
- {'arch': 'ia32e',
- 'basearch': 'x86_64',
- 'infra': 'stock',
- 'releasever': '7',
- 'uuid': '2e295e02-51b3-438b-8804-e955af8290e5'}
- >>> quit()
利用宏替换配置 yum 仓库的访问路径
- [base_1]
- name=Centos 7 x86_64 release
- baseurl=http://mirrors.163.com/centos/$releasever/os/$basearch/
- enabled=1
- gpgcheck=0
来源: http://www.bubuko.com/infodetail-2551555.html