一、软件包概述
1、相关概念
源码安装操作系统方式:通过宿主机安装
GPL:公布源码(c,c++)
POSIX规范:Portable Operatin System (原代码)移植性
API:应用编程接口,兼容,意味开发库兼容,因此源代码可夸平台
ABI:应用二进制接口,兼容,编译后的程序可夸平台
库:就是函数\功能,可执行程序,本身不能作为程序执行的入口,但可以被调用
编译好的二进制格式
glibc:linux标准的C库
程序开发完成后要使用得经过的步骤:
预编译,编译,汇编,链接(把库文件链接到软件可以找到的路径)
编译分为两种:
静态编译:程序包含依赖库,程序体积变大
动态编译:dll(windows),so(shared object) 调用系统共享库
注意:应用程序(编译好的)的可移植要求
1)OS平台:应用程序必须为特定平台所支持的版本,库
2)硬件平台:应用程序必须为特定的cpu所支持,指令集不一样,内核也不一样
2、程序包组成部分
二进制程序:
系统二进制程序默认存放路径:
/bin,/sbin,/usr/bin,/usr/sbin,/usr/local/bin,/usr/local/sbin
程序包提供的二进制程序路径:
/usr/local/apache/bin,/usr/local/apache/sbin
库文件:程序自身提供自身各组件依赖的共享库,和对该程序进行二次开发就要调用程序的共享库
(对程序库的使用格式头文件的包含,库的头文件,linux上头文件都保存在/usr/include目录下)
系统二进制程序默认存放路径:
/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64
系统头文件(文本格式)存放路径:
/usr/include
指定系统查找库文件的路径的配置文件:/etc/ld.so.conf和/etc/ld.so.conf.d/*.conf
也可以使用ldd命令查看程序所依赖的共享库:
ldd [options] FILE...
1
2
3
4
|
[root@Node3 ~]
# ldd /bin/cat
linux-vdso.so.1 => (0x00007fff357ff000)
#调用动态库的入口
libc.so.6 =>
/lib64/libc
.so.6 (0x00007fdebbd52000)
#库名=>库文件地址
/lib64/ld-linux-x86-64
.so.2 (0x00007fdebc0f6000)
#直接写了库文件地址
|
配置文件:/etc
帮助文档:/usr/share/man/,/usr/share/info
man COMMAND 是到某路径下查找与命令同名的通常以.gz结尾的压缩文件
man命令查找路径可以在/etc/man.conf中配置,也可以用选项直接指定:
man -M /usr/local/nginx/man.nginx
二、包管理器
1、程序包管理器
功能:
维护数据库
包含软件名和版本
安装生成的各文件路径、名称、效验码
软件之间依赖关系
提供功能性说明
提供程序组成格式
文件清单
安装卸载时运行的脚本
Debian:.deb,dpkg
Redhat:.rpm,rpm(RedHat Package Manage,RPM is Package Manager) #包管理器的标准
包管理器的基本功能:
制作程序包,安装,查询,升级,卸载,效验,数据库管理
依赖关系:循环依赖,版本依赖
3、前端管理器
能自动解决依赖关系
apt-get:Debian系
yum: redhat系
4、应用程序的安装方式
源代码编译:
简单打包的二进制格式,就是通用二进制包,
使用包管理器:便捷,易用
包管理器的前端工具
.src.rpm 源码格式的rpm包,可以在不同平台上自行在开发环境下自行编译,安装
三、rpm包的使用
1、包命名格式
源程序:
name-version.tar.gz
version:major.minor.release
name-major.minor.release.tar.gz #这里release是指原程序的发行号
rpm包:
name-version-release.ARCH.rpm
#这里的release:是用过程序源码制作成rpm包的发行号,还包含使用的OS
#ARCH:x86_64,x86,i386,i586,i686,noarch
例: bash-4.2.4-1.el6.x86.rpm #el6:redhat enterprise linux 6
nginx-1.4.16-5.rpm #没指明硬件平台,就是平台通用
分包:把一个大的程序打包制作成多个rpm包
主包:bash-4.2.4-1.el7.x86.rpm
支包:bash-devel-4.2.4-1.el7.x86.rpm
2、如何获取程序包
1)发行商提供的程序包
2)Fedora-EPEL
3)项目的官方站点
4)搜索引擎
http://rpmfind.net
http://rpm.phome.net
http://pkgs.org
程序包合法性验证:
验证包完整性:
通过md5或sha1效验码验证
验证来源合法
公钥
四、基于rpm命令实现程序包管理
1、安装
使用包全名
格式:
rpm -i /PATH/TO/RPM_PACKAGE ...
-i,--install:安装
-v:显示详细信息;-vv:更详细
-h,--hash: 以#的个数显示安装进度
--test:仅测试,不真正安装,可以看到该包的依赖关系
--nodeps:忽略依赖关系
重装:rpm -ivh --replacepkgs RPM_PACKAGE
降级:rpm -ivh --oldpackage RPM_PACKAGE
如果存在依赖关系:
解决依赖关系
忽略依赖关系:--nodeps #虽然能安装上这个包,但觉大多数不能用
注意:
重装或升级时,原来的配置文件不会被覆盖,新安装的配置文件将会重命名为以.rpmnew为后缀的文件
2、升级
格式:
rpm -Uvh package_name 如果有旧版程序包,则升级,如果没有,则安装
-Fvh:如果有旧版程序包,则升级,如果没有,则无操作
--force:强制升级
--nodeps:忽略依赖关系
注意:不要对内核执行升级操作,多版本内核可并存,因此,建议执行安装操作
3、卸载
指定包名即可
格式:
rpm -e package_name
-evh
如果卸载被其它程序所依赖的包:
1、把依赖者一同卸载
2、忽略依赖关系
3、不再卸载
4、查询
格式:
rpm -q package_name(包名) 查询该rpm包是否安装
-qa 查询系统所有已经安装的rpm包
-qi 查询rpm包的描述信息
-ql 查询rpm包安装之后在当前系统生成的文件列表
-qc 查询rpm包安装之后在当前系统中生成的配置文件
-qd 查询rpm包安装之后在当前系统中生成的帮助文件
-qf 查询文件是所有哪个rpm包安装生成的
-q --scripts 查询rpm包相关的脚本
脚本有四类:
preinstall:安装前脚本
postinstall:安装后脚本
preuninstall:卸载前脚本
postuninstall:卸载后脚本
rpm -qp 包全名 查询当前系统中尚未安装的rpm包文件的相关信息
-qpl 查询安装后生成的文件列表
-qpi,-qpc,-qpd #上面-q可以使用选项这里都可以使用
注意这里说的尚未安装是需要有安装包存在才可以查询
1
2
|
[root@Node3 ~]
# rpm -qpl zsh-4.3.10.-7.el6.x86_64.rpm
error:
open
of zsh-4.3.10.-7.el6.x86_64.rpm failed: 没有那个文件或目录
|
5、效验
检查包安装后生成的文件是否被修改过
rpm -V 包名
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 能力
1
2
3
4
|
[root@Node3 ~]
# rpm -V bash #没有信息返回,说明没有被改变
[root@Node3 ~]
#
[root@xxj Packages]
# rpm -V wget #改变了的显示对应信息,没改变的是.
S.5....T.
/usr/share/locale/zh_TW/LC_MESSAGES/wget
.mo
|
6、rpm包校验
检验来源合法性和软件包完整性
验证包完整性:通过单向加密(md5|sha1)效验码
验证来源合法:通过公钥加密(RSA)
验证命令:gpg #是pgp(加密规范)的实现
但不手动使用gpg命令,使用的是:rpm -K 包全名
导入制作者的公钥:CentOS发行商的公钥在ISO文件 “RPM-GPG-KEY-CentOS-6”
rpm --import 公钥 #导入公钥
rpm -K /PATH/TO/PACKAGE_FILE #验证包完整来源合法性
rpm --checksig /PATH/TO/PACK_FILE #--checksig相当于-K
--nosignature:不检查来源合法性
--nodigest:不检查完整性
1
2
|
[root@xxj Packages]
# rpm -K zsh-4.3.11-4.el6.centos.x86_64.rpm
zsh-4.3.11-4.el6.centos.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
|
7、rpm包数据库重建
rpm包数据库路径: /var/lib/rpm
重建:
rpm --initdb 初始化
如果事先不存在一个数据库,则新建之
rpm --rebuilddb 重建
直接重建数据库,会覆盖原有的库
五、YUM管理
1、yum简介
YUM: Yellowdog Updater Modified
能自动解决依赖关系
文件服务器(repository:仓库) #共享rpm包,ftp,http,nfs,file都可以作文件服务器
通过yum所支持的文件共享机制将各rpm包通过文件服务器共享
repository包含:
1)各rpm包
2)依赖关系、程序包安装后所能生成的文件列表等元数据文件
yum客户端工作机制:
1、配置文件:指定各可用的yum仓库
2、缓存元数据:yum会到各可用yum仓库获取元数据,并缓存至本地
3、分析元数据:根据具体操作请求完成元数据分析:可能包括检查依赖关系,文件列表等信息
4、执行具体操作
2、yum配置
要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中
yum的配置文件:
/etc/yum.conf #全局配置,一般默认即可不用更改
/etc/yum.repos.d/*.repo
配置文件格式/etc/yum.conf:由两段组成,类似windows的ini配置文件
[main]:主配置段 #全局配置,对所有仓库有效
[repo]:仓库配置段 #只对指定的仓库有效
配置repo:
[repo_ID]
name=NAME
baseurl=仓库的访问路径
enabled=[1|0] 1表示启用,0表示不启用,如果不存在该配置,则默认启用
gpgcheck=[1|0] 是否检查包来源合法性和完整性,默认不启用
gpgkey=公钥文件 (可以在本地,也可以是远程服务器端路径)
cost=定义此仓库的开销,默认为1000 #数值小的优先使用
yum程序的配置文件指定对应服务器访问方式:
ftp ftp://server/path/to/repo
http http://server/path/to/repo
nfs nfs://server/nfs_path
file file:///path/to/repo
六、yum的使用
1、yum命令的使用
yum repolist [all|enabled|disabled] 默认列出所有启用的repo 启用,禁用
yum的缓存路径/var/cache/yum
yum clean [all|package|metadata|expire-cache|rpmdb|plugins] 清除所有缓存
yum makecache 生成缓存
yum list [all|installed|available] 默认列出所有仓库的rpm包 已安装,可安装
yum grouplist 默认列出所有仓库的rpm组包
yum info 包名 可以是当前系统中未安装的程序
yum groupinfo “包组名” 包组名称可能有空格,此时一定得用引用
三个跟开发相关的包组: #建议安装系统时要安装,后面经常需要用到
Desktop Platform Development:
Server Platform Development
Development Tools
安装:yum install,yum groupinstal
重装:yum reinstall
卸载:yum [remove|erase],yum greoupremove
检查可升级的包:yum check-update
升级:yum update
要升级到指定版本:yum update x-4.4.12-1el7.x86_64.rpm #升级默认是升级到最新版
降级:downgrade pack_name
查询某文件由哪个rpm包安装后生成的:yum provides /path/to/somefile
查看yum的命名历史:yum history
yum search 在软件包详细信息中搜索指定字符串
yum 不仅安装repo中的软件,也可以安装本地的软件包,yum安装本地包时会检查包的来源和完整性,检查不通过则安装不了,此时可以手动禁止检查来源及完整性:
yum install /PATH/TO/包全名 --nogpgcheck
2、yum配置文件中可用的宏
$releasever:程序的版本,对Yum而言指的是redhat-relrase版本。只替换为主版本号,如Redhat6.5 则替换为6,(就是操作系统的主版本号)
$arch:系统架构,如ia32,这里不是指x86或x86_64,$basearch才是指x86或x86_64
$basearch:系统基本架构,如:i686,i586等的基本架构为i386,或者x86
$YUM0-9:在系统定义的环境变量,可以在yum中使用
3、使用yum下载rpm包而不执行安装
安装yum-downloadonly或 yum-plugin-downloadonly软件包:
yum install yum-plugin-downloadonly #其实是升级yum,升级到3.2.29-69就包括了这个插件
yum install yum 或 yum update yum
使用方法:
yum install 包名 --downloadonly --downloaddir=/存放路径 -y
七、自己设置本地repo源
1、准备文件服务器ftp,http,nfs;使用httpd为例,请事先确保以安装httpd程序包
2、在/var/www/html目录,使用一个目录来保存准备制作称为yum仓库的所有rpm包
3、创建yum仓库
createrepo /var/www/html/openstack
#事先安装好createrepo程序,会生成repodata目录,里面保存了所有rpm包的元数据和依赖关系,创建好的repo源因为没有生成comps.xl文件,不能使用groupinstall,待后续学习
4、启动http服务
5、配置使用自建的yum仓库
7、测试使用
八、编译安装
源码:c,c++
1、编译安装的步骤
1)拿到源代码并解压
2)进入源码目录中
3)执行configure脚本 # ./configure
4)编译 # make
5)安装 # make install
这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤:
./configure:
是用来检查编译环境是否满足编译需求,并定义当前程序编译时启用哪个特性或功能,以及安装路径的定义等等,会根据Makefile.ini文件生成makefile文件
make:是用来编译的,它从Makefile中读取指令,然后编译。
make install:是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
2、configure脚本的通用功能
我们需要定义的配置:
1)指定安装路径
--prefix=/usr/local/package_name
--sysconfigdir=/etc/package_name
2)指定启用或禁用的特性
--enable-FEATURE 例如:--enable-fpm
--disable-FEATURE
3)指定所依赖功能,程序或文件
启用某功能:--with-FUNCTION=该程序的安装路径
禁用某功能:--without-FUNCTION
不同的程序,其configure脚本功能不同,要获取帮助:./configure --help
3、编译安装完成后续操作
1)二进制程序的访问方法
vim /etc/profile.d/apache.sh
PATH=/usr/local/apache/bin:/usr/local/apache/sbin:$PATH #将这行写进上面的文件
expore PATH
source /etc/profile.d/apache.sh
2)头文件输出给系统
ln -sv /usr/local/apache/include /usr/include/httpd
3)让系统重新生成库文件路径缓存
vim /etc/ld.so.conf.d/httpd.conf
/usr/local/apache/lib #将这行写进上面的文件
ldconfig -v(显示详细信息) #重新生成系统查找库文件路径的缓存/etc/ld.so.cache
linux下的共享库机制采用了类似于高速缓存的机制,将库信息保存在/etc/ld.so.cache里边,程序连接的时候首先从这个文件里边查找,然后再到ld.so.conf的路径里边去详细找,这就是为什么修改了ld.so.conf要重新运行一下ldconfig的原因.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
[root@Node3 ~]
# ldconfig -v|grep '^[^[:space:]]'
/usr/local/lib
:
/usr/lib64/mysql
:
/usr/lib64/qt-3
.3
/lib
:
/usr/lib/vmware-tools/lib32/libvmGuestLib
.so:
/usr/lib/vmware-tools/lib64/libvmGuestLib
.so:
/usr/lib/vmware-tools/lib32/libvmGuestLibJava
.so:
/usr/lib/vmware-tools/lib64/libvmGuestLibJava
.so:
/usr/lib/vmware-tools/lib32/libDeployPkg
.so:
/usr/lib/vmware-tools/lib64/libDeployPkg
.so:
/usr/lib64/xulrunner
:
/lib
:
/lib64
:
/usr/lib
:
/usr/lib64
:
/lib64/tls
: (hwcap: 0x8000000000000000)
/usr/lib64/sse2
: (hwcap: 0x0000000004000000)
/usr/lib64/tls
: (hwcap: 0x8000000000000000)
|
4)导出man文件
vim /etc/man.conf
MANPATH /usr/local/apache/man #添加这行
或者直接使用命令:man -M /usr/local/apache/man apache
总结:
源码编译安装
前提:准备好开发环境
编译过程:
./configure
make
make install
输出:
二进制程序
头文件
库文件
man文档