程序简介:
POSIX(Portable Openratin System)跨平台系统:不同操作系统平台的标准C库(glibc)都是遵循POSIX规范的,这样基于标准库开发程序的源代码可以夸平台编译(API兼容),源代码可以在Linux编译也可以在windows下编译;因为标准库都基于POSIX规范,提供的调用接口一致
API兼容:开发库兼容,因此源代码可跨平台
ABI兼容:编译后的程序可以跨平台运行
同一个源代码程序同时在Windows与Linux上编译完成后,各自可以在对应系统运行,但程序不能夸平台运行,这就是ABI不兼容;现在有一种方法可以达到兼容,就是库级别的虚拟化技术Linux(WINE)、Windows(Cywin)
库:库为函数(function)是可执行程序,本身不能作为程序执行入口,但可以被调用;是编译好的二进制格式
编译程序的过程:预编译、编译、汇编、链接
预编译:预编译又称为预处理,头文件的包含、宏定义的扩展、条件编译的选择等
编译:把源代码翻译成中间代码,即汇编代码
汇编:把作为中间结果的汇编代码翻译成机器代码,即目标代码
连接:链接是处理可重定位文件,把它们的各种符号引用和符号定义转换为可执行文件中的合适信息(一般是虚拟内存地址)的过程
静态链接:将库包含在程序中;程序开发阶段程序员用ld(gcc实际上在后台调用了ld)静态链接器手动链接的过程
动态链接:程序运行期间系统调用动态链接器(ld-linux.so)自动链接的过程;windows下为dll(dynamic link library)、linux下为so(shared object)
查看二进制程序所依赖的库文件:
ldd /PATH/TO/BINARY_FILE
管理及查看本机装载的库文件:
ldconfig -p 显示本机已经缓存的所有可用库文件名及文件路径映射关系;
ldconfig默认搜寻/lilb、/lib64、/usr/lib64、/usr/lib以及配置文件/etc/ld.so.conf、 /etc/ld.so.conf.d/*.conf内所定义目录下的库文件,搜索出可共享的动态链接库,库文件的格式为:lib***.so.**,进而创建出动态装入程序(ld.so)所需的连接和缓存文件。缓存文件默认为/etc/ld.so.cache,该文件保存已排好序的动态链接库名字列表。
ldconfig通常在系统启动时运行,而当用户安装了一个新的动态链接库时,就需要手工运行这个命令刷新缓存。
软件包的组成部分:
二进制程序:/bin,/sbin,/usr/sbin,/usr/local.bin,/usr/local/sbin
库文件:/lib,/lib64,/usr/lib,/usr/lib64,/usr/local/lib,/usr/local/lib64(开发时调用API,运行时调用ABI)
配置文件:/etc或者无须额外配置就没有配置文件
帮助文件:man文件、info文件、README、INSTALL、ChangeLog(/usr/share/{man|doc})
程序包管理:是将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级、校验、数据库管理等管理操作;
程序包管理器对程序进行管理所需要信息:
数据库:程序包名称及版本、安装生成的各文件路径及校验码信息、依赖关系、功能说明(各软件包公共)
程序组成清单:文件清单、安装卸载时运行的脚本(各软件包独有)
程序包管理方式:
使用包管理器:
RedHat:rpm(包格式.rpm)
Debian:dpkg(包格式.deb)
SUSE:rpm(与RedHat不同,二者rpm包不通用)
使用前端工具:
RedHat:yum
Fedora22+:dnf
SUSE:zypper
Debian:apt-get
RPM包命名方式:
一个程序有多个RPM包的原因:例如一个源码程序有10个功能;大多数用户只用其6个功能,余下的4个呢?把一个大的程序打包制作成多个包,6个功能作为主包,其它4个功能可以做成分包
name-version-release.rpm
name-version-releaseNumber.OS.arch.rpm
ftp-0.17-54.el6.x86_64.rpm
软件包命名格式:软件名-软件版本-发行信息
name:软件包的名字(如果有分段表示主程序的分包)
version:软件的版本号,版本号的格式通常为"主版本号.次版本号.修正号"(如:2.2.3)
release:rpm包的发行信息又包括发布版本号、OS平台、硬件平台
releaseNumber:发布版本号,表示这个RPM包是第几次编译生成的
OS:el6:redhat enterprise linux 6
arch:X86_64、i386,i586,i686、ppc(Power PC)、noarch(与平台无关)
注意:软件版本号指的是软件自身版本号,发布版本号是指发行商在将软件制作为RPM包发布时的发布版本号
包来源合法性验证:
源码程序:通过md5或sha1校验码验证;
rpm包:发行商提供的包是否合法可信的
验证包完整性:校验码
验证来源合法:公钥加密算法
获取RPM包的途径:
1、发行商的光盘或站点服务器
CentOS镜像:
http://mirrors.163.com
http://mirrors.aliyun.com
2、第三方组织:
Fedora-EPEL
https://fedoraproject.org/wiki/EPEL/zh-cn
http://repoforge.org
搜索引擎站点:
http://rpmfind.net
http://rpm.pbone.net
http://pkgs.org
https://sourceforge.net
3、项目的官方站点
4、自己制作
CentOS系统上RPM命令管理程序包:
安装:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
-i 安装程序
-v 显示安装详细过程
-vv 显示更详细的调试信息
-h 以#显示程序包管理执行进度,每个#表示2%的进度
rpm -ivh PACKAGE_FILE ...
[install-options]
--test 测试安装,但不真正执行安装过程;dry run模式
--prefix 指定安装路径
--nodeps 忽略依赖关系
--replacefiles 安装程序要创建的文件已存在直接覆盖
--replacepkgs 某个包已安装直接重新安装
--nosignature 不检查来源合法性
--nodigest 不检查包完整性
--noscipts 不执行程序包脚本片断
--nopre 不执行安装前脚本
--nopost 不执行安装后脚本
--nopreun 不执行卸载前脚本
--nopostun 不执行卸载后脚本
--force 强行安装
升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
upgrade 安装有旧版程序包则"升级";如果没有安装旧版程序包则"安装"
freeshen 安装有旧版程序包则"升级";如果没有安装旧版程序包则不执行升级操作
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...
[install-options]
--oldpackage 降级
--force 强行升级
注意:
1、不要对内核做升级操作;Linux支持多内核版本可以并存,直接安装新版本内核
2、如果原程序包的配置文件安装后被修改过,升级新版本后提供的配置文件并不会直接覆盖老版本的配置文件,新版本配置文件重命名(FileName.rpmnew)后保留
查询:
rpm {-q|--query} [select-options] [query-options] PACKAGE_Name
[select-options]选择查询的包
-q 仅查询后面接的软件名称是否有安装
-a 所有系统当中所有安装包
-f 查询指定的文件由哪个程序包安装生成
-p /PATH/TO/PACKAGE_FILE 针对尚未安装的程序包文件做查询操作
--whatprovides CAPABILITY 查询指定的CAPABILITY(文件或功能)由哪个包所提供
--whatrequires CAPABILITY 查询指定的CAPABILITY(文件或功能)被哪个包所依赖
[query-options]选择查询那些信息
--changelog 查询rpm包的修改日志(不是程序包的修改日志)
-c 查询程序的配置文件
-d 查询程序的文档(与man有关的文件)
-i 查询程序包的信息(information)
-l 查看指定的程序包安装后生成的所有文件
--scripts 查询程序包自带的脚本片断
-R 查询指定的程序包所依赖的CAPABILITY;
--provides 列出指定程序包所提供的CAPABILITY;
用法:
rpm -qi PACKAGE_Name 查询已安装程序包描述信息
rpm -qc PACKAGE_Name 查询已安装程序包的配置文件
rpm -ql PACKAGE_Name 查询已安装程序包生成的所有文件
rpm -qd PACKAGE_Name 查询已安装程序包的文档
rpm -qf FILE_Name 查询指定的文件由哪个程序包安装生成
rpm -qpi PACKAGE_FILE 查询未安装的程序包描述信息
rpm -qpl PACKAGE_FILE 查询未安装的程序包在被安装后会生成的文件
rpm -qa 查询当前系统安装的所有RPM包
演示:
[root@centos7 ~]# rpm -q tree
tree-1.6.0-10.el7.x86_64
[root@centos7 ~]# rpm -ql tree
/usr/bin/tree
/usr/share/doc/tree-1.6.0
/usr/share/doc/tree-1.6.0/LICENSE
/usr/share/doc/tree-1.6.0/README
/usr/share/man/man1/tree.1.gz
[root@centos7 ~]# rpm -qf /etc/fstab
setup-2.8.71-6.el7.noarch
[root@centos7 ~]# rpm -qc bash
/etc/skel/.bash_logout
/etc/skel/.bash_profile
/etc/skel/.bashrc
[root@centos7 ~]# rpm -qi bash
Name : bash
Version : 4.2.46
Release : 19.el7
Architecture: x86_64
Install Date: 2016年11月06日 星期日 18时31分30秒
Group : System Environment/Shells
Size : 3663618
License : GPLv3+
Signature : RSA/SHA256, 2015年11月25日 星期三 22时14分53秒, Key ID 24c6a8a7f4a80eb5
Source RPM : bash-4.2.46-19.el7.src.rpm
Build Date : 2015年11月20日 星期五 13时04分53秒
Build Host : 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 Bourne Again shell (Bash) is a shell or command language
interpreter that is compatible with the Bourne shell (sh). Bash
incorporates useful features from the Korn shell (ksh) and the C shell
(csh). Most sh scripts can be run by bash without modification.
[root@centos7 ~]# rpm -qc httpd
/etc/httpd/conf.d/autoindex.conf
/etc/httpd/conf.d/userdir.conf
/etc/httpd/conf.d/welcome.conf
/etc/httpd/conf.modules.d/00-base.conf
/etc/httpd/conf.modules.d/00-dav.conf
/etc/httpd/conf.modules.d/00-lua.conf
/etc/httpd/conf.modules.d/00-mpm.conf
/etc/httpd/conf.modules.d/00-proxy.conf
/etc/httpd/conf.modules.d/00-systemd.conf
/etc/httpd/conf.modules.d/01-cgi.conf
/etc/httpd/conf/httpd.conf
/etc/httpd/conf/magic
/etc/logrotate.d/httpd
/etc/sysconfig/htcacheclean
/etc/sysconfig/httpd
[root@centos7 ~]# rpm -qd httpd
/usr/share/doc/httpd-2.4.6/ABOUT_APACHE
/usr/share/doc/httpd-2.4.6/CHANGES
/usr/share/doc/httpd-2.4.6/LICENSE
/usr/share/doc/httpd-2.4.6/NOTICE
/usr/share/doc/httpd-2.4.6/README
/usr/share/doc/httpd-2.4.6/VERSIONING
/usr/share/doc/httpd-2.4.6/httpd-dav.conf
/usr/share/doc/httpd-2.4.6/httpd-default.conf
/usr/share/doc/httpd-2.4.6/httpd-info.conf
/usr/share/doc/httpd-2.4.6/httpd-languages.conf
/usr/share/doc/httpd-2.4.6/httpd-manual.conf
/usr/share/doc/httpd-2.4.6/httpd-mpm.conf
/usr/share/doc/httpd-2.4.6/httpd-multilang-errordoc.conf
/usr/share/doc/httpd-2.4.6/httpd-vhosts.conf
/usr/share/doc/httpd-2.4.6/proxy-html.conf
/usr/share/man/man8/apachectl.8.gz
/usr/share/man/man8/fcgistarter.8.gz
/usr/share/man/man8/htcacheclean.8.gz
/usr/share/man/man8/httpd.8.gz
/usr/share/man/man8/rotatelogs.8.gz
/usr/share/man/man8/suexec.8.gz
卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME
rpm -evh PACKAGE_NAME
选项:
--allmatches 卸载所有匹配名称的程序包各版本
--nodeps 忽略依赖关系
--test 测试卸载,dry run 模式
注意:卸载和查询是包的名,因为包已经存在了;而安装和升级,包是不存在的,所以是包的文件路径
校验:检查程序包安装后生成的文件是否被修改过
rpm {-V|--verify} [select-options] [verify-options] PACKAGE_Name
rpm -V PACKAGE_Name
-Va 列出目前系统上面所有可能被修改的文件
-Vp 后面跟RPM包文件名,列出该软件内可能被修改过的文件
-Vf 列出某个文件是否被修改过
检查出来的结果对应标志位解释(标志位存在就表示相关信息已经发生改变)
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 功能是否改变
获取的RPM包来源合法性验证及完整性验证:
GNU计划的GPG(GNU Privacy Guard),防止软件被修改
公钥文件一般放在/etc/pki/rpm-gpg/目录下面,不同发行版可能路径有所不同;发布版本的光盘中也用对应的公钥文件
完整性验证:SHA256(包提供方会提供相应的校验码)
来源合法性验证:RSA
对称加密:加密、解密使用同一密钥;
非对称加密:密钥是成对儿的,
public key:公钥,公开所有人
secret key:私钥, 不能公开
制作RPM包者完成后,通过SHA256算法得出校验码附加在RPM包中,在通过私钥加密整个RPM包,发布程序包时提供对应的公钥文件;获得RPM包和公钥后解密RPM包得到相应SHA256的校验码,并验证校验码是否一致;这样既验证了来源合法信和完整性
导入所需要公钥:系统发布都有一个密钥(公钥)
rpm --import /PATH/FROM/GPG-PUBKEY-FILE
检查RPM安装包的完成性和来源合法性
rpm -K PACKAGE_FILE
CentOS 7发行版光盘提供的密钥文件:RPM-GPG-KEY-CentOS-7
删除导入的公钥(导入公钥类似于安装了个RPM包,通过-e卸载就可以)
rpm -q gpg-pubkey 查询当前系统导入的所有秘钥
rpm -e --allmatches gpg-pubkey-16ca1a56-4a100959
数据库重建:
RPM的查询就是去读取相关数据库信息
/var/lib/rpm/ 存储RPM管理工具相关状态信息数据库文件夹
rpm {--initdb|--rebuilddb}
--initdb 初始化数据库(如果不存在数据库则新建,否则不执行任何操作)
--rebuilddb 重建数据库(无论当前数据库是否存在,直接重新创建数据库)
获取帮助
CentOS6 man rpm
CentOS7 man rpmdb