程序语言开发的程序:系统调用:库,动态库(开发时指向的库)
程序:只要Windows上开的程序所指向的库遵循POSIX规范将源码拿到linux上编译时没问题的,运行应该也没有问题,能否运行还要看依赖的库文件是否存在;因为linux、Windows的ABI不同,Windows上编译好的程序无法在linux上正常运行,即使程序源码遵循POSIX规范。
API:POSIX(可移植os规范)
ABI:应用二进制接口
linux发行商:32bit:i386,预先编译好以后提供给用户二进制程序
64bit:x86_64,可兼容运行32bit程序,反之不行。
Debian:dpt(软件包管理器)-àapt-get(apt库中有成千上万个包或者库,dpt就是个打包工具,将每个包的依赖关系提取出来,放在一个文件中,自动检测当前系统已安装的包/库,并根据当前系统已安装的包/库,及apt库中包/库,以及被安装软件包的依赖关系,自动解决依赖关系,自动安装用户指定的包)
Redhat:rpm----yum
*rpm是仿照dpt的,yum是仿照apt-get的,因此真正牛的os是debian!!!
二进制程序放置目录:/bin,/sbin,/usr/sbin,/usr/local/sbin,/usr/local/bin
库文件放置目录:可能是一个程序特有的(也可供其他程序调用),也可能是共享库;/lib[64],/usr/lib[64],/usr/local/lib[64]
Linux上库文件分为2种:1)静态库,以.a后缀名结尾(2)动态库,以.so(sharedobject)后缀名结尾。
库文件也是可执行程序,但不能独立运行,因为它没有执行入口(例如c的main函数,shell的sha_bang等等),库文件在面向过程的语言中被称为函数,程序执行入口为主函数main(),库文件在程序运行时会被载入内存,可被多个程序共享使用,因此库文件也被称为共享库。
配置文件:一般在/etc/下,格式为纯文本或者xml
帮助文件:通常有2类:(1)man手册:/usr/share/man,/usr/local/share/man(man命令配置文件/etc/man.config中用MANPATH来定义man文件的搜索路径)(2)/usr/share/doc/程序名-版本号/下一般有README\INSTALL等帮助文件。
软件包管理工具(数据库)提供的主要功能如下:
提供文件清单
提供文件放置路径
提供程序依赖关系
程序功能说明,介绍
它有一个数据库,其中存放了(1,已安装的每一个程序;2,每个程序展开的文件以及路径;3,每个文件在安装时的md5校验值,已确定在安装后此文件是否被修改过)
软件包安装事务:防止安装冲突、卸载冲突,包升级时检测是否会有冲突(依赖关系等,如果包原来的库文件被另一个程序所依赖,升级后库文件更新后,那个程序可能无法正常运行)
软件包管理器提供的功能:打包(***对于我们来说:定制编译rpm包,完成上千台server软件的自动部署、管理是必备的能力,要能够写脚本完成rpm包自动安装,指定可以运行rpm安装的用户)、安装、查询、升级、卸载、校验、数据库管理(重建)。
软件包依赖关系:x-àyàz,
YellowDog(是红帽的2次发行版,YUM:YellowdogUpdate Manager,后来红帽将yum机制引入红帽)
Rpm(软件包管理器)--àyum是rpm的前端工具,是基于rpm的***前不久YUM的作者挂了,车祸
编译安装的特点:可以自定义安装软件的哪些功能,但只能手动安装卸载,为了卸载方便,将其安装在特定的路径下(卸载的时候一并删除即可),为了使用方便,修改(1)命令搜索路径PATH (2)库文件搜索路径,(除标准库文件以外其他库文件的搜索路径定义在:如下位置)修改配置文件/etc/ld.so.conf或/etc/ld.so.conf.d/*.conf(可以自己新建一个配置文件,填入搜索路径) (3)帮助手册搜索路径:修改配置文件 /etc/man.config加入程序帮助文件所在的路径或 man -M /path/to/manfile/ 程序名(指定程序的man页所在的目录)
(4)头文件:linux下默认路径为/usr/include/,自己编译的话,头文件不一定放在/usr/include下,可以通过导出、链接的方式来引用头文件。--à头文件功能:定义库函数的调用方式,以及接受的参数格式等等。
Linux下软件安装方式总结:
1) 通用二进制格式:直接打开即可使用。
2) 软件包管理器,例如rpm,dpt
3) 软件包管理器前端工具,例如yum,apt-get
4) 源代码编译:在x86_64上编译,不能在PowerPC上运行,x86_64可以运行32位程序,反之不行;一样的:64bitOS上可以运行32bit程序,反之不行。要点:1)底层cpu架构(2)OS版本(3)os是32位或64位的(4)选择与之匹配的程序包来运行。
概念:例如java,python程序在多平台上都可以编译运行,因为java程序通过jvm来运行,而jvm是有对应cpu架构、os版本的特定版本的,python也有自己的虚拟机,这种情况下运行的程序,运行速度比较慢(中间隔了一个解释器来解释自己的语言,不像2进制程序直接就可以通过cpu芯片的汇编语言来运行)。
源代码程序包(tarball)的命名方式(name-version.tar.{gz|bz2|xz})
版本号一般为格式(major.minor.release(版本的主要改动看changelog))
Rpm包命名:name-version-release.arch.rpm
Release号:rpm包作者第几次制作的编号;arch为适合安装的cpu平台架构;可能还包含所适用的操作系统例如:el6_2
Arch:主机平台,i386,i686,x86_64,amd64;***注:在红帽系统上显示为x86_64,在debian上可能显示为amd64。*noarch包:不依赖于平台的rpm包
Rpm分包:将某些功能独立封装成包,需要则安装,否则就不装(例:有时只需装服务器或客户端2者之一)。例如:主包为:核心包 bind ;;;;分包:支包bind-devel;bind-chroot
Rpm分包特点:分支包一般会依赖于主包(核心包)。
Epel:为rhel平台提供的扩展rpm包,此项目目前有fedora来维护,Google“Fedora epel”
http://mirrors.163.com/,可以找一下国内镜像站,比较快
因此我们以后如果要安装除安装盘中包含的其他rpm包时找Google“Fedora epel”,centos也是一样。要找与我们os平台,硬件平台所匹配的,不要使用来路不明的包(1)首先光盘上的包(2)EPEL包
搜索rpm包的网站(如果光盘以及epel中都没有这个rpm包):http://rpmfind.net
http://rpm.pbone.net
或者直接google
Rpm包的验证机制:验证rpm包来源的合法性,软件包的完整性。
验证机制原理讲解如下:
用GPG非对称加密算法实现,GPG是PGP技术规范的一种实现。
非对称加密:用加密算法生出一对公钥和私钥;使用公钥加密的数据只能用与之配对的私钥解密,反之亦然。由于其加密速度太慢,一般用于做数字签名,我们要了解的是,这个rpm包的确是我们认为的作者制作的。
*加密过程--à数字签名:用单向加密算法计算出rpm包特性码,然后用rpm包作者的私钥加密这个特性码,并将得到的加密数据附加到此rpm包后面。
*验证过程---à用公钥解密rpm包附带的加密数据,如果可以就说明的确是作者本人加密的,因为只有作者有私钥(完成验证rpm包合法性)。 这样就得到了解密后的特性码,然后,使用同样的加密算法单向计算出rpm包的特性码,然后比较2个特性码是否相同,如果相同,就说明rpm包的完整性没有问题。(验证rpm包完整性完成)
原理部分:记忆起来太麻烦了,运维工程师没必要知道的这么详细,这次记住了这些原理,以后也会忘记,主要学习怎么验证软件包就可以了。个人看法
验证过程:
1) 从网上下载软件包
2) 通过ssl访问软件包项目官网找到公钥,解密数据(rpm附带的),解密成功后得到特性码。
3) 用同样的算法单向加密自己下载的rpm包,得出特性码,对比两个特性码是否为一致。
Redhat系列OS官方公钥:/etc/pki/rpm-gpg/R….
验证光盘上的包(1)#rpm --import /etc/pki/rpm-gpg/R…
(2)#rpm �CK zsh..rpm
验证选项语法#rpm (-K或--checksig)另外(--nodigest不检测完整性―nosignature不检测合法性,马哥建议:最好都检查,用-K来查) rpm包名
**官方公钥一般安装光盘上也有。
Rpm包的安装(语法格式如下):
Rpm -I /path/to/rpmfile
-i|--install (安装)
-v|-vv|-vvv (详细模式,v越多,显示的信息越详细)
-h (以#显示安装进度,一个#代表2%的进度)
常用的安装组合选项 -ivh
*)如果安装时遇到报错:“error:Faileddependencies”可以几个包一起安装,
--nodeps 忽略依赖关系
--test 测试安装
--replacepkgs 重新安装
Rpm包的卸载
Rpm -e rpm包名(如果因为依赖关系无法卸载,可以几个包一起卸载)
--nodeps 忽略依赖关系
--test 测试卸载
*)warning:/…/…/XXX saved as /…./…./xxx.rpmsave (保存相关配置文件为xxx.rpmsave,安装卸载时都有可能出现这种警告)
Rpm包的查询
Rpm -q rpm包名(这个包名不包含这些内容-version-release.arch.rpm)
查询所有已安装的包:rpm -qa 包名 或者 rpm -qa |grep 包名
查询rpm包的摘要信息:rpm �Cqi 包名(这些信息由rpm包的制作者提供)
查询rpm包生成的文件:rpm �Cql 包名
查询rpm包生成的配置文件:rpm �Cqc 包名
查询rpm包生成的帮助文件:rpm �Cqd 包名
查看软件包安装卸载时执行的脚本:rpm -q --scripts 包名(*脚本格式有4段:preinstall:安装前脚本;Postinstall:安装后脚本;preuninstall:卸载前脚本;postuninstall:卸载后脚本)
查询尚未安装的软件包的信息:
Rpm -qpi /path/to/rpmfile(查询摘要信息)
Rpm -qpl /path/to/rpmfile(查询安装后生成的文件列表)
Rpm -qpd /path/to/rpmfile(查询安装后生成的帮助文件列表)
Rpm -qpc /path/to/rpmfile(查询安装后生成的配置文件列表)
rpm --scripts 包名(查看软件包安装卸载时会执行的脚本)
查询某文件是由哪个rpm包生成的:
Rpm -qf /path/to/somefile 扩展选项 �Cqfi |-qfl
例如:Rpm -qf /etc/passwd; Rpm -qf /etc/inittab
Rpm包的升级:
-U:升级或安装(已安装则升级,未安装则安装)
-Uvh
-F:只升级,如果未安装老版本的包则不会升级。
-Fvh
--force:如果有依赖性冲突(例如X程序需要老版软件的库文件),则强行升级。
--nodeps:不关心依赖关系,升级。
***内核不应该被升级,应尽可能安装,内核应该允许多版本并存,如果升级后与现有环境不兼容无法退回老内核版本!!!
Rpm包校验(检验是否rpm包安装时生成的文件在安装后有没有被改动):
Rpm -V 包名(没有任何输出说明没有被改动过,尝试修改一下软件包生成的文件再校验一下,S表示大小变了,T表示时间戳变了,5表示md5校验和变了,U属组变了,G属主变了,有需要的话可以man rpm查一下具体的显示值对应的具体的含义)
Rpm包的数据库(redhat下的大多数程序的数据库都在/var/lib/下)文件,如果数据库损坏,rpm查询将无法进行,需要重建rpm数据库。 #ls -lh /var/lib/rpm
*)重建rpm数据库(2中方式,其中第一种方式用的比较多): (1) #rpm --rebuilddb (会覆盖原有数据库内容,遍历当前系统安装的每个rpm包,抽出其信息,生成数据库,时间较长)
(2)#rpm --initdb (不会覆盖原有数据库内容)
***1)rpm可依次安装多个包(2)在生产环境安装需要校验rpm包的来源合法性以及完整性,导入公钥后,在安装时可自动完成校验。
源码格式的rpm包介绍(后缀名.src.rpm)
打包:rpm包的制作过程是根据spec文件来完成的,在镜像站上这种包所放置的的目录一般是/SRPMS/。
目的:可以在用户自己的特定平台上编译安装,可以提高安装后程序的执行性能,以及可以跨平台安装。