程序包管理
软件的开发分为四个层次
1、面向硬件,操作系统
2、面向内核,譬如驱动的开发
3、面向库,诸多应用程序、像C、C++
4、面向应用级,譬如java、php、python、perl、ruby等
4、面向应用程序的开发可实现一处编译到处执行,为什么?因为它的运行只需要自己的虚拟机平台,没有库或者说CPU架构不同而无法运行问题
1、面向硬件的操作系统必须要在合适的CPU架构上才能安装运行,譬如ix86 86_64等CPU架构
2、面向内核的应用程序必须要有相同的systemcall 接口才能(异地)运行
3、面向lib的应用程序必须要有相同的库才能迁移运行
问题:
而大多数不是面向应用平台、只单一的依赖库的程序,到底能不能在你的平台上运行?你的开发平台上有没有它所需的特有的库呢?它们在编译过程中需要哪些库呢?是如何调用的?它们安装后该怎样被执行运行(放置)呢?
linux上的大多数应用程序是面向lib的C应用程序!
解决:
为了解决以上问题
大多开发版linux为用户提供了软件包管理器
程序包管理器:
debian:deb,dpt
redhat:rpm
rpm:RedhatPacket Manager(早期的)
RPMis Package Manager
Gentoo:archlinux
二进制应用程序的组成部分
二进制文件、库文件、配置文件、帮助文件
linux多数应用程序开发者为用户提供应用程序形式为
源代码:需手动编译、安装、需要编译环境
rpm包:运行rpm程序安装
如下:
源代码:name-VERSION.tar.gz
VERSION:major.minor.release
rpm包命名方式:
name-VERSION-release.arch.rpm
VERSION:major.minor.release
release.arch:
release:release.OS
如: zlib-1.2.7-13.el7.i686.rpm
常见的arch:
x86:i386, i486, i586, i686
x86_64:x64, x86_64, amd64
powerpc:ppc
跟平台无关:noarch
testapp:拆包(一个程序不一定有一个程序员开发,可能会把程序放在不同的包中)
testapp-VERSION-ARCH.rpm:主包
testapp-devel-VERSION-ARCH.rpm:支包
testapp-testing-VERSION-ARHC.rpm
几乎所有程序不是独立一个包完成任务的,包与包之间,存在依赖关系
(linux的哲学思想:任务由多个小程序组合完成的)
要想完成安装、完美运行,多数情况需要解决依赖关系、安装所需的依赖包,因此linux开发者又提出了程序白管理器前端工具
如下:
yum:rpm包管理器的前端工具;
apt-get:deb包管理器前端工具;
zypper:suse上的rpm前端管理工具;
dnf:Fedora 22+ rpm包管理器前端管理工具;
那么如何查看你的二进制程序所需的库文件呢?
ldd /path/to/BINARY_FILE
[[email protected] Packages]#ldd /bin/ls
linux-vdso.so.1 => (0x00007fff845b4000)
libselinux.so.1 =>/lib64/libselinux.so.1 (0x00007f2494b76000)
libcap.so.2 => /lib64/libcap.so.2(0x00007f2494971000)
libacl.so.1 => /lib64/libacl.so.1(0x00007f2494767000)
libc.so.6 => /lib64/libc.so.6(0x00007f24943a6000)…
你的主机中开机时有装载了哪些库文件呢?
ldconfig–p 显示主机已经缓存的所有可用库文件及文件路径映射关系
其配置文件为:/etc/ld.so.conf /etc/ld.so.conf.d/*.conf
其缓存文件为:/etc/ld.so.cache
程序包管理
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等管理操作;
1、程序的组成组成清单 (每个包独有)
文件清单
安装或卸载时运行的脚本
2、数据库(公共)
程序包名称及版本
依赖关系;
功能说明;
安装生成的各文件的文件路径及校验码信息;
管理程序包的方式:
使用包管理器:rpm
使用前端工具:yum dnf(新式)
获取程序包的途径
(1)系统发行版的光盘或官方的服务器
CentOs镜像
(2)项目官方站点
(3)第三方组织 fedora-EPEL
搜索引擎:
(4)自己制作
建议:检查其合法性。
来源合法性
程序包的完整性
一、CentOS系统上rpm命令管理程序包
安装、卸载、升级、查询、校验、管理数据库
安装
-v verbose
-vv
-h 以#显示程序包管理执行进度;每个#表示2%的进度
rpm -ivh PACKAGE_FILE ...
[install-option]
--test:测试安装,并不真的安装 干跑模式
--nodeps:忽略依赖关系
--replacepkgs 替代 修改的配置文件可能不能使用
--ignoreos 忽略os
--nodigest 忽略包的完整性
--nosignature 忽略来源合法性
--noscripts 不执行程序包脚本片段
%pre 安装前脚本 --nopre
%post 安装后脚本 --nopost
%preun 卸载前脚本 --nopreun
%postun 卸载后脚本 --nopostun
升级
rpm{-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm{-F|--freshen} [install-options] PACKAGE_FILE ...
升级后的配置文件一般不变
rpm -Uvh 即可升级,也可安装
rpm -Fvh 只用于升级
--oldpackage :降级:由旧版替代新版
--force :强制升级
注意:1、不要对内核作升级操作:linux支持多内核版本并存,因此,对直接安装新版本内核
2、如果源程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一配置文件并不会直接覆盖
假如,你不确定是否安装,或者不确定是否已经完全解决了依赖关系可以加
--test 如下
[[email protected]]# rpm -ivh --test httpd-2.4.6-31.el7.centos.x86_64.rpm
错误:依赖检测失败:
/etc/mime.types 被 httpd-2.4.6-31.el7.centos.x86_64 需要
httpd-tools = 2.4.6-31.el7.centos 被 httpd-2.4.6-31.el7.centos.x86_64 需要
libapr-1.so.0()(64bit) 被 httpd-2.4.6-31.el7.centos.x86_64 需要
libaprutil-1.so.0()(64bit) 被 httpd-2.4.6-31.el7.centos.x86_64 需要
假如即试图忽略依赖关系则可用--nodeps这次则没有提示依赖关系失败
[[email protected]]# rpm -ivh --test --nodeps httpd-2.4.6-31.el7.centos.x86_64.rpm
准备中... ################################# [100%]
同样,你也可以忽略os 包完整性,来源合法性等,也可以替换安装
[[email protected]]# rpm -ivh --replacepkgs net-tools-2.0-0.17.20131004git.el7.x86_64.rpm
准备中... ################################# [100%]
正在升级/安装...
1:net-tools-2.0-0.17.20131004git.el#################################[100%]
重新安装了一遍
升级操作后一般配置文件不发生修改
查询
rpm {-q|--query} [select-options] [query-options]
-p/path/to/package_file 针对尚未安装的程序包文件作查询操作
[select-options] 由指定文件查找指定包
-a:所有包
-f 查看指定的文件是由哪个程序包安装生成的
--whatprovides 查询指定的功能或特性是由哪个包提供
--whatrequires 查询哪个包依赖指定的功能或特性
[query-options] 由指定包查找其文件
--changelog 查询rpm包的修改日志
-c 由程序的配置文件
-d 查询doc文件
-i 查询 程序的简要信息
-L Liense
-l 查看指定程序包安装后生成后的所有文件
--scripts 程序包自带的脚本
--trigger
-R: --requires查询指定的程序包所依赖的程序包
--provides 列出指定程序包所提供的功能
-p针对尚未安装的程序包文件作查询操作
对为安装的程序包进行修改日志查询
对包的查询
查找/bin/ls由那个包提供类似与--whatprovides
~]# rpm -qf/bin/ls
coreutils-8.22-11.el7.x86_64
~]# rpm -q--whatprovides /bin/ls
coreutils-8.22-11.el7.x86_64
查询某特型依赖与哪些包
~]# rpm -q--whatrequires /bin/bash
nss-softokn-freebl-3.16.2.3-9.el7.x86_64
iproute-3.10.0-21.el7.x86_64
…
查询为安装的某程序包的配置文件
~]# rpm -qpc zsh-5.0.2-7.el7.x86_64
/etc/skel/.zshrc
/etc/zlogin
…
查询某rpm程序包的修改日志
~]# rpm -q--changelog bash-4.2.46-12.el7.x86_64 |more
* 日 1月 11 2015 Ondrej Oprala<[email protected]> - 4.2.46-12
- Shellshockrelated parser bugs - patches
Related: #1175647
…
查询某程序包的帮助手册
~]# rpm -qdbash-4.2.46-12.el7.x86_64
/usr/share/doc/bash-4.2.46/COPYING
/usr/share/info/bash.info.gz
…
查询某程序包的简要信息
~]# rpm -qibash-4.2.46-12.el7.x86_64
Name : bash
Version : 4.2.46
Release : 12.el7
Architecture:x86_64
Install Date:2015年08月27日星期四 18时58分50秒
Group : System Environment/Shellsr
Size : 3663626
License : GPLv3+
Signature : RSA/SHA256, 2015年03月14日星期六15时39分08秒, Key ID 24c6a8a7f4a80eb5
SourceRPM : bash-4.2.46-12.el7.src.rpm
BuildDate : 2015年03月06日星期五06时09分15秒
BuildHost : worker1.bsys.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 BourneAgain shell (Bash) is a shell or command language
interpreterthat is compatible with the Bourne shell (sh). Bash
incorporatesuseful features from the Korn shell (ksh) and the C shell
(csh). Most shscripts can be run by bash without modification.
查询某程序包安装后可能的生成的所有文件
~]# rpm -qlbash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
...
查询与某程序包的脚本信息
~]# rpm -q--scripts net-tools-2.0-0.17.20131004git.el7.x86_64
postinstallscriptlet (using /bin/sh):
if [ $1 -eq 1] ; then
# Initial installation
/usr/bin/systemctl presetarp-ethers.service >/dev/null 2>&1 || :
fi
查询某程序包所依赖的关系(一般是库)
~]# rpm -qRnet-tools-2.0-0.17.20131004git.el7.x86_64
/bin/sh
libc.so.6()(64bit)
libc.so.6(GLIBC_2.14)(64bit)
…
查询某程序包安装后提供的功能特性
~]# rpm -q--provides net-tools-2.0-0.17.20131004git.el7.x86_64
net-tools =2.0-0.17.20131004git.el7
net-tools(x86-64)= 2.0-0.17.20131004git.el7
以上查询的常用组合
-qiPACKAGE 查询指定包的简要信息
-qf FILE 查询指定文件或特性是由哪个程序包提供的
-qc PACKEAGE 查询指定包的配置文档
-ql PACKEAGE 查询指定包安装后产生的所有文件
-qd PACKAGE 查询指定报的doc文件
-qpi PACKEAGE 查询为安装包的简要信息
-qpl 列出未安装的指定包可能产生的文件
卸载
rpm –e
校验
当程序安装后,我们可以通过数据库中的校验信息与现有数据作校验,就会发现数据是否被修改过以下是用法和常用的校验项
rpm {-V|--verify} [select-options][verify-options]
S file Size differs 文件大小校验
M Mode differs (includes permissions andfile type) 权限和类型的校验
5 digest (formerly MD5 sum) differs 数据完整性校验
D Device major/minor number mismatch 设备的设备号校验
L readLink(2) path mismatch 读链接是否匹配
UUser ownership differs 属主关系校验
G Group ownership differs 属组关系校验
T mTime differs 修改时间是否匹配
P caPabilities differ
包的安装是要确保其安全性、可靠性
因此要进行校验
完整性校验
来源合法性校验
一般通过公钥私钥非对称算法进行的
CentOS 6/7的公钥为RPM-GPG-KEY-CentOS-6/7
rpm的数据库文件
C7 /var/lib/rpm
数据库重建
rpm{initdb|rebuilddb}
initdb初始化
如果实现不存在,则新建至,否则,不执行任何操作
rebuilddb重建数据库
无论当前是否存在,直接重建之
导入数据校验码
~]# rpm--import /media/cdrom/RPM-GPG-KEY-CentOS-7
二、YUM安装
1 、command is oneof:
* install package1 [package2] [...]
#安装程序包
* update [package1] [package2] [...]#更新程序包
* update-to [package1] [package2] [...]#
* update-minimal [package1] [package2][...]
* check-update #检查更新
* upgrade [package1] [package2] [...]
* upgrade-to [package1] [package2][...]
* distribution-synchronization[package1] [package2] [...]
* remove | erase package1 [package2] [...]#卸载
* autoremove [package1] [...]
* list [...] #列出指定软件包
* info [...] #显示指定软件包的信息
* provides | whatprovides feature1[feature2] [...]
* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ] 清除软件包,当变换yum仓库时很有用
* makecache [fast]
* groups [...]
* search string1 [string2] [...]
* shell [filename]
* resolvedep dep1 [dep2] [...]
(maintained for legacy reasons only- use repoquery or yum provides)
* localinstall rpmfile1 [rpmfile2][...]
(maintained for legacy reasons only- use install)
* localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only- use update)
* reinstall package1 [package2] [...]重新安装
* downgrade package1 [package2] [...]
* deplist package1 [package2] [...] #显示软件包的依赖关系
* repolist [all|enabled|disabled] #列出repo仓库的简要信息
* repoinfo [all|enabled|disabled] #列出repo仓库的详细信息
* repository-packages<enabled-repoid> <install|remove|remove-or-reinstall|remove-or-
distribution-synchronization>[package2] [...]
* version [ all | installed | available| group-* | nogroups* | grouplist | groupinfo
* history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|roll? #显示yum安装的更新历史信息
back|new|sync|stats]
*load-transaction [txfile]
* updateinfo[summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all #显示软件包的更新信息
| check-running-kernel]
* fssnapshot [summary | list |have-space | create | delete]
* fs [filters | refilter |refilter-cleanup | du]
* check
* help [command]
2、简要解释:
显示仓库列表:
repolist[all|enabled|disabled]
显示程序包:
list
# yum list[all | glob_exp1] [glob_exp2] [...]
# yum list{available|installed|updates} [glob_exp1] [...]
安装程序包
installpackage1 [package2] [...]
reinstallpackage1 [package2] [...] (重新安装)
升级程序包
update [package1] [package2][...]
downgradepackage1 [package2] [...] (降级)
检查可用升级
check-update
卸载程序包
remmove|erase package1[...]
查看程序包information
info[...]
查看指定的特性,(可以是某文件)是由那个程序包所提供
provides |whatprovides feature1 [feature2] [...]
查看yum事务历史信息
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
本地安装即升级本地程序
*localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)
*localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)
包组管理的相关命令
groupinstall group1 [group2] [...]
* groupupdate group1 [group2][...]
* grouplist [hidden] [groupwildcard] [...]
* groupremove group1 [group2] [...]
* groupinfo group1 [...]
~]# yum grouplist
已加载插件:fastestmirror
设置组进程
Loading mirror speeds from cached hostfile
http://172.16.0.1/fedora-epel/6/x86_64/repodata/repomd.xml:[Errno 14] PYCURL ERROR 22 - "The requested URL returned error: 501 NotImplemented"
尝试其他镜像。
已安装的组:
CIFS 文件服务器
FTP 服务器
MySQL 数据库客户端
yum groupinstall “ FTP 服务器”
注:默认可升级不可降级:yum源可以是更新的,但不可是旧版本
--nogpgcheck:禁止进行gpgcheck
-y:
-q:静默模式(无information)
-disablerepo=repoidglob:临时禁用此处仓库
--enablerrpo= 指定安装那个yum仓库中的软件包
--noplugins 禁用所有插件
3、制作yum仓库
createrepo
制作yum仓库时,要手动软件包依赖关系
三、编译安装
testapp-VERSION-release.src.rpm 安装后,使用rpmbuild命令制作成二进制格式的rpm包,而后再安装,
源代码——预处理——编译——汇编——链接——执行
源代码组织格式
多文件:文件中的代码之间,很可能存在跨文件依赖关系
C、C++: make (项目管理器) (configure ——Makefile.in——> makefile)
java:maven
编译安装三步走
./comfigure
1. 通过选项传递参数,指定启用特性、安装路径等,执行时会参考用户的指定以及Makefile.in 文件生成makefile
2. 检查依赖到的外部环境
make
根据makefile文件,构建应用程序
make install
将对应文件放在对应文件下
开发工具:
autoconf:生成configure脚本
automake:生成Makefile.in
建议:安装前查看INSTALL,README
源程序源代码的获取
官方自建站点
appache.org
mariadb.org
代码托管站点
SourceForge
Github.com
code.google.com
C++ :gcc (GNU C Complier)
编译C源代码
前提:提供开发工具及开发环境
开发工具:make,gcc等
开发环境:开发库,头文件
glibc标准库
通过“包组”提供的开发组件
CentOS 6“”
第一步:configure脚本
选项:指定安装位置、指定启用的特性
--help
选项分类
安装路径设定
系统类型
(指定目标系统平台,只用于交叉编译)
optional Features
enable
disable
可选程序包
--with-Package[arg]
--without-package[arg]
第二步:make
第三步:make install
安装后的配置
(1)导出二进制程序目录至PATH
(2)导出库文件路径
编辑/etc/ld.so.conf.d/NAME.conf
添加至新的库文件所在的目录至此文件中
让系统重新生成缓存:ldconfig [-v]
(3)导出头文件
基于链接的方式实现
-ln -sv
(4)导出帮助手册
编辑/etc/man.conf文件
添加一个MANPATH
转载于:https://blog.51cto.com/fallcamel/1698993