软件包管理
- rpm,yum
软件运行和编译
- ABI:Application Binary Interface(应用程序与OS之间的接口)
Windows与Linux不兼容;可执行程序文件格式
Windows:PE(Portable Executable)
Linux:ELF(Executable and Linkable Format)
库级别的虚拟化
Windows:Cygwin
Linux:WINE - API:Application Programming Interface(应用程序与库之间的接口)
- 程序源代码–>预处理–>编译–>汇编–>链接
- C程序编译过程:
①预处理:主要包括将宏定义展开、导入头文件、处理条件预预编译指令等
②编译:进行语法语义分析等生成汇编代码
③汇编:汇编则是将汇编语言转化为机器语言,生成二进制文件
④链接:通过调用连接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的库文件,最后生成可执行文件
ldd - 查询程序所依赖的库(.so)
[root@centos7 test]# ldd `which --skip-alias ls`
linux-vdso.so.1 => (0x00007ffef91c6000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fb3a8316000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007fb3a8111000)
libacl.so.1 => /lib64/libacl.so.1 (0x00007fb3a7f08000)
libc.so.6 => /lib64/libc.so.6 (0x00007fb3a7b3b000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fb3a78d9000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fb3a76d5000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb3a853d000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007fb3a74d0000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fb3a72b4000)
- 静态和动态链接:链接主要的作用是把各个模块之间相互引用的各个部分处理好,使得各个模块之间能够正确地衔接,分为静态链接和动态链接。
静态链接:
①把程序对应的依赖库复制一份到包
②libxxx.a
③嵌入程序包
④升级难,需重新编译
⑤占用较多空间,迁移容易
动态链接:
①只把依赖加做一个动态链接
②libxxx.so
③连接指向
④占用较少空间,升级方便 - Java程序运行
Linux包和包管理器
-
程序在互联网一般是以源代码的方式提供,.tar.gz的打包的源代码,用户使用软件必须将源码编译为Linux上能运行的二进制文件。因此Linux发行版商考虑用户对软件编译时可能存在的困难,将大多数可能用到的软件编译为可以在Linux直接运行的代码,开发出包和包管理器的概念,对Linux系统的包实现安装、卸载
查询、升级等功能。最早由Debian提出,它的管理工具被称为dpkg,随后Red Hat也开发了自己的包管理器rpm。 -
包的组成:
二进制文件、库文件、配置文件、帮助文件 -
程序包管理器:
debian: deb包文件,dpkg包管理器
redhat:rpm包文件,rpm包管理器
rpm:RedHat Package Manager
rpm:RPM Package Manager -
包的命名:
源代码:name-VERSION.tar.gz|xz|bz2
VERSION:major.minor.release -
rpm包命名方式:
name-VERSION-release.arch.rpm
eg:tree-1.6.0-10.el7.x86_64
软件名-主版本号.次版本号.末版本号.Redhat编译次数.系统版本.CPU架构.rpm
常见的arch
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64
跟平台无关:noarch -
大软件分包:
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 开发子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包
eg:
httpd-2.4.6-88.el7.centos.x86_64.rpm 主包
httpd-manual-2.4.6-88.el7.centos.noarch.rpm 手册
httpd-devel-2.4.6-88.el7.centos.x86_64.rpm 开发
httpd-tools-2.4.6-88.el7.centos.x86_64.rpm 工具
这样可以根据需要安装相应的包。 -
包与包之间存在依赖关系,包管理器rpm解决依赖关系相对麻烦
-
解决包之间依赖关系的工具:
yum:rpm包管理器的前端工具
apt:deb包管理器前端工具
zypper:suse上的rpm前端管理工具
dnf:Fedora 18+ rpm包管理器前端管理工具 -
库文件
查看二进制程序所依赖的库文件
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载的库文件
ldconfig 加载配置文件中指定的库文件
/sbin/ldconfig -p 显示本机已经缓存的所有可用的库文件名即文件路径映射
配置文件:/etc/ld.so.conf , /etc/ld.so.conf.d/*.conf
缓存文件:/etc/ld.so.cache -
包管理器
1、程序包管理器:
功能:将编译好的应用程序的各组成文件打包成一个或多个程序文件,从而方便快捷地实现程序包的安装、卸载、查询、升级等操作
2、包文件的组成:(每个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本
3、数据库(公共):/var/lib/rpm
程序包名称及版本
依赖关系
功能说名
包安装后生成的各文件路径及校验码信息
注意:使用rpm均会使/var/lib/rpm目录中文件更新,使用rpm查询时也是查询此数据库中的数据,此数据库非常重要,破坏会系统不能安装、卸载、查询等各种包,建议备份。
-
程序包的来源
1)系统发版的光盘或官方的服务器
CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com
(2) 项目官方站点
(3) 第三方组织:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推荐,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/
(4) 自己制作
注意: 第三方包建议要检查其合法性来源合法性,程序包的完整性
RPM包管理器
-
安装:rpm -i
-ivh:以#显示程序包的安装进度,v显示安装详细过程
--test:测试安装,并未真正安装,即dry run 模式
--nodeps:忽略依赖关系
--replacepkgs|replacefile
--nosignature:不检查包完整性
--noscripts:不执行程序包安装脚本
--nopre: %pre:安装前脚本
--nopost %post:安装后脚本
--nopreun %preun:卸载前脚本
--nopostun %postun:卸载后脚本 -
卸载:rpm -e
-
升级:rpm -U | -F
upgrade:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则“安装”
freshen:安装有旧版程序包,则“升级”
如果不存在旧版程序包,则不执行升级操作
rpm -Uvh PACKAGE_FILE …
rpm -Fvh PACKAGE_FILE …
--oldpackage:降级
--force: 强制安装
升级注意:
(1)不要对内核做升级操作;Linux支持多内核版本并存,因此直接安装新版本内核
(2)如果原程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件不会直接覆盖老版本的配置文件,而把新版本文件重命名(FILENAME.rpmnew)后保留 -
查询:rpm -q
-a:所有包
-f:查看指定的文件由哪个程序包安装生成
-p rpmfile:针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个包所提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个包所依赖
rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件
--changelog:查询rpm包的changelog
-c:查询程序的配置文件
-d:查询程序的文档
-i:information
-l:查看指定的程序包安装后生成的所有文件
--scripts:程序包自带的脚本
--provides:列出指定程序包所提供的CAPABILITY
-R:查询指定的程序包所依赖的CAPABILITY -
校验:rpm -K | -V
1、rpm -V
S file Size differs
M Mode differs (includes permissions and file type)
5 digest (formerly MD5 sum) differs
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
2、rpm -K
导入所需要公钥
rpm -K|checksig rpmfile 检查包的完整性和签名
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*” -
rpm数据库(数据最重要)
1、数据库重建:
/var/lib/rpm
2、rpm {–initdb|–rebuilddb}–>一般没什么用
initdb: 初始化
如果事先不存在数据库,则新建之
否则,不执行任何操作
rebuilddb:重建已安装的包头的数据库索引目录
※※※※※
rpm -ivh | -e | -qi | -ql | -q --scripts | -qa | -qf /path/file | -q package | --force| -qc
yum
-
yum:Yellowdog Update Modifier,rpm的前端程序,可以解决依赖关系,可以在多个库之间定位软件包。
-
yum的工作原理:
-
yum客户端的配置文件
/etc/yum.conf:为所有仓库的指向提供配置
/etc/yum.repos.d/*.repo:为仓库指向提供配置
2、仓库指向的定义
[repo id]
name=repo name
baseurl=url:///path/to/repodata(此处为repodata目录所在路径)
enabled={1|0} (1 enable 0 disable)
gpgcheck={1|0}
gpgkey=URL
enablegroups={1|0}
failovermethod={roundrobin|priority}
roundrobin:意为随机挑选,默认值
priority:按顺序访问
cost= 默认为1000 -
yum 仓库
1、yum的repo中可以使用的变量
$releasever:当前OS发行版的主版本号
$arch:平台,x86_64,i386,i686
$basearch:基础平台
$YUM0—$YUM9:自定义变量 -
yum源
1、阿里云repo文件
http://mirrors.aliyun.com/repo/
2、CentOS系统的yum源
阿里云:https://mirrors.aliyun.com/centos/$releasever/os/x86_64/
清华大学:https://mirrors.tuna.tsinghua.edu.cn/centos/$releasever/os/x86_64/
3、EPEL的yum源
阿里云:https://mirrors.aliyun.com/epel/$releasever/x86_64
4、阿里巴巴开源软件
https://opsx.alibaba.com/ -
yum-config-manager
生成172.16.0.1_cobbler_ks_mirror_CentOS-X-x86_64_.repo
yum-config-manager --add-repo= http://172.16.0.1/cobbler/ks_mirror/7/
yum-config-manager --disable “仓库名" 禁用仓库
yum-config-manager --enable “仓库名” 启用仓库 -
yum命令
1、yum命令的用法:
yum [options] [command] [package …]
2、显示仓库列表:
yum repolist [all|enabled|disabled] 显示程序包:
yum list
yum list [all | glob_exp1] [glob_exp2] […]
yum list {available|installed|updates} [glob_exp1] […]
3、安装程序包:
yum install package1 [package2] […]
yum reinstall package1 [package2] […] (重新安装)
4、升级程序包:
yum update [package1] [package2] […]
yum downgrade package1 [package2] […] (降级) 检查可用升级:
yum check-update
5、卸载程序包:
yum remove | erase package1 [package2] […]
6、查看程序包information:
yum info […]
7、查看指定的特性(可以是某文件)是由哪个程序包所提供:
yum provides | whatprovides feature1 [feature2] […]
8、清理本地缓存:
清除/var/cache/yum/ b a s e a r c h / basearch/ basearch/releasever缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
9、构建缓存:
yum makecache
10、搜索:yum search string1 [string2] […]
以指定的关键字搜索程序包名及summary信息
11、查看指定包所依赖的capabilities:
yum deplist package1 [package2] […]
12、查看yum事务历史:
yum history [info|list|packages-list|packages-info|
summary|addon-info|redo|undo|
rollback|new|sync|stats]
yum history
yum history info 6
yum history undo 6
13、日志 :/var/log/yum.log
14、安装及升级本地程序包:
yum localinstall rpmfile1 [rpmfile2] …
yum localupdate rpmfile1 [rpmfile2] …
15、包组管理的相关命令:
yum groupinstall group1 [group2] […]
yum groupupdate group1 [group2] […]
yum grouplist [hidden] [groupwildcard] […]
yum groupremove group1 [group2] […]
yum groupinfo group1 […]
15、yum的命令行选项:
--nogpgcheck:禁止进行gpg check
-y: 自动回答为“yes”
-q:静默模式
--disablerepo=repoidglob:临时禁用此处指定的repo
--enablerepo=repoidglob:临时启用此处指定的repo
--noplugins:禁用所有插件
※※※※※
yum install | remove
yum list | repolist
yum clean all
yum history 观察yum安装日志,可以将此前yum安装的依赖的软件一起卸载
yum history undo # | redo # | info #
个人总结
- 使用yum remove 卸载包时,只卸载单个包,并不会卸载其依赖的安装包
- 系统默认配置的/etc/yum.repos.d/*.sh 文件服务器均比较远,一般不使用,企业内部一般局域网,应配置一台专门的yum server,供所有主机直接从yum server安装软件。
搭建yum server
①rpm 软件包
②repodata/目录中的数据(rpm包的元数据)
repodata(仓库元数据的创建)
createrepo [option] <dirctory>
没有仓库元数据,就无法使用yum安装 - 生产环境yum地址发生改变时,需要清理缓存,yum clean all
- 配置yum时出现问题查找源:
①yum client的配置文件格式写错,/etc/yum.repos.d/*.sh
②缓存问题 - yum 配置文件中baseurl的路径为repodata目录所在的路径即为yum源路径
- 生产环境需注意:生产环境一般都是rpm包单个安装,需要使用才会安装,因此生产环境中不会以包组的形式安装软件,单个安装rpm包可以使系统最精简,优化性能,提高安全性。
- 生产环境一般情况下也不会做升级操作,也不建议升级系统和软件包,升级会导致许多问题,除非软件包有重大漏洞,或者需要使用某些新功能,这样万不得已的情况下才会对软件进行升级,。系统一般不做升级处理,若要使用新功能,直接重装新系统。
yum实验:
1、启用/misc目录,/misc目录本不存在,/misc目录依赖于这个程序,启用此
程序,可启用/misc目录,此目录一访问/misc/cd目录,就会自动挂载光盘
~]#rpm -q autofs
autofs-5.0.5-139.el6.x86_64
~]# rpm -ql autofs | grep -E 'service'
/usr/lib/systemd/system/autofs.service
centos7软件存在/usr/lib/systemd/system/*.service时,可用system启动为一个服务
~]# systemctl start autofs 启动服务
~]# systemctl disable autofs 关闭开机自启动
~]# systemctl enable autofs 开启开机自启动
2、centos7关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
3、配置epel源,仓库路径为阿里云的epel源
[root@centos6 yum.repos.d]#cat epel.repo
[epel]
name=aliyun epel
baseurl=https://mirrors.aliyun.com/epel/$releasever/$basearch/
gpgcheck=0
enabled=1
[root@centos6 yum.repos.d]#yum clean all
[root@centos6 yum.repos.d]#yum repolist
4、仓库路径的多种表示方法
①baseurl=url
②baseurl=url1
url2
③mirrorlist=file
file中直接写url1,url2,url3...
其中URL支持:http,https,ftp,file(本地)
5、yum group list 与 yum group list后跟一个空格
显示的包组不一样