一、软件包概述
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...
[[email protected] ~]# 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可以使用选项这里都可以使用
注意这里说的尚未安装是需要有安装包存在才可以查询
[[email protected] ~]# 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 能力
[[email protected] ~]# rpm -V bash #没有信息返回,说明没有被改变 [[email protected] ~]# [[email protected] 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:不检查完整性
[[email protected] 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
yum repositories
文件服务器(共享rpm包):通过yum所支持的文件共享机制将各rpm包通过文件服务器共享
repository:仓库
1、各rpm包
2、依赖关系、程序包安装后所能生成的文件列表等元数据文件
ftp,http,nfs,file
yum客户端工作机制:
1、配置文件:指定各可用的yum仓库
2、缓存元数据:yum会到各可用yum仓库获取元数据,并缓存至本地
3、分析元数据:根据具体操作请求完成元数据分析:可能包括检查依赖关系,文件列表等信息
4、执行具体操作
2、yum配置
要使用yum管理应用程序,首先得配置其可用的yum仓库,保存在配置文件中
yum的配置文件:
/etc/yum.conf 全局配置,一般默认即可不用更改
/etc/yum.repos.d/*.repo
配置文件格式:由两段组成,类似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
3、yum的使用
yum repolist [all|enabled|disabled] 默认列出所有可用repo 启用,禁用
yum clean [all|package|metadata|expire-cache|rpmdb|plugins] 清除所有缓存
yum 缓存路径/var/cache/yum
yum makecache 生成缓存
yum list [all|installed|available] 默认列出所有仓库的rpm包 已安装,可安装
yum grouplist
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 x-4.4.12-1el7.x86_64.rpm
升级:yum update
降级:downgrade pack_name
查询某文件由哪个rpm包安装后生成的:provides /path/to/somefile
查看yum的命名历史:yum history
yum配置文件中可用的宏
$releasever:程序的版本,对Yum而言指的是redhat-relrase版本。只替换为主版本号,如Redhat6.5 则替换为6
$arch:系统架构
$basharch:系统基本架构,如i686,i586等的基本架构为i386
$YUM0-9:在系统定义的环境变量,可以在yum中使用
使用yum下载rpm包而不执行安装
1. 安装yum-downloadonly或 yum-plugin-downloadonly 软件包。
yum install yum-plugin-downloadonly #其实是升级yum,升级到3.2.29-69就包括了这个插件
yum install xxx --downloadonly --downloaddir=/xxx -y
[[email protected] puppet-3.7]# rpm -qa|grep yum
yum-plugin-fastestmirror-1.1.30-14.el6.noarch
yum-3.2.29-40.el6.centos.noarch
yum-metadata-parser-1.1.2-16.el6.x86_64
[[email protected] puppet-3.7]# yum install yum
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.pubyun.com
* epel: mirrors.yun-idc.com
* extras: centos.ustc.edu.cn
* rpmforge: ftp.kddilabs.jp
* updates: centos.ustc.edu.cn
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package yum.noarch 0:3.2.29-40.el6.centos will be updated
---> Package yum.noarch 0:3.2.29-69.el6.centos will be an update
--> Finished Dependency Resolution
Dependencies Resolved
===================================================================================
Package Arch Version Repository Size
===================================================================================
Updating:
yum noarch 3.2.29-69.el6.centos base 1.0 M
4、自己设置本地repo源
1、准备文件服务器ftp,http,nfs;使用httpd为例,请事先确保以安装httpd程序包
2、在/var/www/html目录。使用一个目录来保存准备制作称为yum仓库的所有rpm包
3、创建yum仓库
createrepo /var/www/html/openstack 事先安装好createrepo程序,创建好的repo源因为没有生成comps.xl文件,不能使用groupinstall,待后续学习
4.启动http服务
5.配置实用自建的yum仓库
7.测试使用
五、编译安装
源码:c,c++
perl
python
编译安装的步骤:
1、拿到源代码并解压
2、进入源码目录中
3、执行configure脚本 # ./configure
4、编译 # make
5、安装 # make install
这些都是典型的使用GNU的AUTOCONF和AUTOMAKE产生的程序的安装步骤:
./configure:是用来
make:是用来编译的,它从Makefile中读取指令,然后编译。
make install:是用来安装的,它也从Makefile中读取指令,安装到指定的位置。
1、configure,这一步一般用来生成 Makefile,为下一步的编译做准备,会检测你的安装平台的目标特征,自动设定源程序以符合各种不同平台上系统的特性,并且根据系统叁数及环境产生合适的Makefile文件或是C的头文件(header file),让源程序可以很方便地在这些不同的平台上被编译连接。比如它会检测你是不是有CC或GCC,并不是需要CC或GCC,它是个shell脚本。
你可以通过在 configure 后加上参数来对安装进行控制,
比如代码:./configure –prefix=/usr 意思是将该软件安装在 /usr 下面,执行文件就会安装在 /usr/bin (而不是默认的 /usr/local/bin),资源文件就会安装在 /usr/share(而不是默认的/usr/local/share)。同时一些软件的配置文件你可以通过指定 –sys-config= 参数进行设定。有一些软件还可以加上 –with、–enable、–without、–disable 等等参数对编译加以控制,你可以通过允许 ./configure –help 察看详细的说明帮助。
2、make,这一步就是编译,大多数的源代码包都经过这一步进行编译(当然有些perl或python编写的软件需要调用perl或python来进行编译)。如果 在 make 过程中出现 error ,你就要记下错误代码(注意不仅仅是最后一行),然后你可以向开发者提交 bugreport(一般在 INSTALL 里有提交地址),或者你的系统少了一些依赖库等,这些需要自己仔细研究错误代码。
3、make insatll,这条命令来进行安装(当然有些软件需要先运行 make check 或 make test 来进行一些测试),这一步一般需要你有 root 权限(因为要向系统写入文件)。
到此时,就可以运行make进行编译,在运行make install进行安装了,最后运行make clean删除临时文件。
$ make
$ make install (注:运行这个要有足够的权限)
$ make clean
利用configure所产生的Makefile文件有几个预设的目标可供使用,其中几个重要的简述如下:
make all:产生我们设定的目标,即此范例中的可执行文件。只打make也可以,此时会开始编译原始码,然后连结,并且产生可执行文件。
make clean:清除编译产生的可执行文件及目标文件(object file,*.o)。
make distclean:除了清除可执行文件和目标文件外,把configure所产生的Makefile也清除掉。
make install:将程序安装至系统中。如果原始码编译无误,且执行结果正确,便可以把程序安装至系统预设的可执行文件存放路径。如果用bin_PROGRAMS宏的话,程序会被安装至/usr/local/bin这个目录。
make dist:将程序和相关的档案包装成一个压缩文件以供发布。执行完在目录下会产生一个以PACKAGE-VERSION.tar.gz为名称的文件。 PACKAGE和VERSION这两个变数是根据configure.in文件中AM_INIT_AUTOMAKE(PACKAGE,VERSION)的定义。在此范例中会产生test-1.0.tar.gz的档案。
make distcheck:和make dist类似,但是加入检查包装后的压缩文件是否正常。这个目标除了把程序和相关文件包装成tar.gz文件外,还会自动把这个压缩文件解开,执行 configure,并且进行make all 的动作,确认编译无误后,会显示这个tar.gz文件可供发布了。这个检查非常有用,检查过关的包,基本上可以给任何一个具备GNU开发环境-的人去重新编译。
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
二进制程序的访问方法
/etc/profile.d/apache.sh
PATH=/usr/local/apache/bin:/usr/local/apache/sbin:$PATH
expore PATH
source /etc/profile.d/apache.sh
头文件输出给系统
ln -sv /usr/local/apache/include /usr/include/httpd
让系统重新生成库文件路径缓存
vim /etc/ld.so.conf.d/httpd.conf
/usr/local/apache/lib
ldconfig
导出man文件
/etc/man.conf
添加 MANPATH /usr/local/apache/man
或者直接使用命令:man -M /usr/local/apache/man apache
总结:源码编译安装
前提:准备好开发环境
编译过程:
./configure
make
make install
输出
头文件
库文件
二进制程序
man文档