软件运行环境
API:Application Programming Interface POSIX:Portable OS 程序源代码--> 预处理--> 编译--> 汇编--> 链接 静态编译: 共享编译:.so ABI:Application Binary Interface Windows与Linux不兼容 ELF(Executable and Linkable Format) PE(Portable Executable) 库级别的虚拟化: Linux: WINE Windows: Cywin
linux 软件的组成
二进制程序 共享库--给别应用程序用的 共享库,把程序的某些功能做成库。 配置文件 帮助文件 /etc /bin /lib /usr/share/man /usr/local/ /usr/ 也有类似的层级结构
包管理器:
二进制应用程序的组成部分: 二进制文件、库文件、配置文件、帮助文件 程序包管理器: debian:deb文件, dpkg包管理器 redhat: rpm文件, rpm包管理器 rpm: RedhatPackage Manager RPM Package Manager
包命名
源代码:name-VERSION.tar.gz|bz2|xz VERSION: major.minor.release rpm包命名方式: name-VERSION-release.arch.rpm 例:bash-4.2.46-19.el7.x86_64.rpm VERSION: major.minor.release release:release.OS 常见的arch: x86: i386, i486, i586, i686 x86_64: x64, x86_64, amd64powerpc: ppc 跟平台无关:noarch
包命名和工具
包:分类和拆包 Application-VERSION-ARCH.rpm: 主包 Application-devel-VERSION-ARCH.rpm开发子包 Application-utils-VERSION-ARHC.rpm其它子包 Application-libs-VERSION-ARHC.rpm其它子包 包名+版本号+发行号+平台 注安装过程中不要装错rpm包。一般情况都是需要装主包的,其他包看需要。 包之间:可能存在依赖关系,甚至循环依赖 安装软件的时候会有提示依赖关系,但是仅提示该软件的依赖关系,可能所依赖的软件包还有依赖关系。 解决依赖包管理工具: yum:rpm包管理器的前端工具 apt-get:deb包管理器前端工具 zypper: suse上的rpm前端管理工具 dnf: Fedora 18+ rpm包管理器前端管理工具,未来的包管理工具。
库文件
查看二进制程序所依赖的库文件: ldd /PATH/TO/BINARY_FILE [root@localhost ~]# ldd /bin/cat linux-vdso.so.1 => (0x00007ffc0f7e8000) libc.so.6 => /lib64/libc.so.6 (0x00007f2fbfc85000) /lib64/ld-linux-x86-64.so.2 (0x00007f2fc005b000) 管理及查看本机装载的库文件: ldconfig /sbin/ldconfig -p: 显示本机已经缓存的所有可用库文件名及文件路径映射关系 配置文件:有时候需要编写配置文件,使系统识别第三方软件带的库文件。 /etc/ld.so.conf #主配置文件,不用管 /etc/ld.so.conf.d/*.conf #如果自己安装的软件,自己带库文件。需要用户自定编写库配置文件。让操作系统识别。 自己创建一个.conf结尾的文件。只需要把放库文件的路径(目录)写进去,再执行 ldconfig 使系统重新读取配置文件。 ldconfig -p 查看系统识别到的库文件。 缓存文件:/etc/ld.so.cache
程序包管理器:
功能:将编译好的应用程序的各组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验、数据库的重建等管理操作 1、包文件组成(每个包独有) RPM包内的文件 RPM的元数据,如名称,版本,依赖性,描述等 安装或卸载时运行的脚本 2、数据库(公共)--系统生成的 /var/lib/rpm 程序包名称及版本 依赖关系 功能说明 包安装后生成的各文件路径及校验码信息 rpm --intdb | --rebuiddb 初始化或重建数据库 该数据库非常重要需要备份,如损坏的话即使重建也是空的。
程序包的来源
管理程序包的方式: 使用包管理器:rpm 使用前端工具:yum, dnf 获取程序包的途径: (1) 系统发版的光盘或官方的服务器; CentOS镜像: https://www.centos.org/download/ http://mirrors.aliyun.com http://mirrors.sohu.com http://mirrors.163.com (2) 项目官方站点 http://httpd.apache.org/ (3) 第三方组织: Fedora-EPEL: Extra Packages for Enterprise Linux 以上方式推荐使用。除非都找不到,而且非关键性业务的可以使用如下方式 Rpmforge:RHEL推荐,包很全 搜索引擎:rpm包搜索引擎,不是百度也不谷歌。 http://pkgs.org http://rpmfind.net http://rpm.pbone.net https://sourceforge.net/ (4) 自己制作 注意:检查其合法性:来源合法性,程序包的完整性 软件使用一定不要用盗版,包括管理软件
CentOS系统上使用rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护 安装: rpm {-i|--install} [install-options] PACKAGE_FILE… -v: verbose -vv: 更详细的信息 -h: 以#显示程序包管理执行进度 rpm -ivh PACKAGE_FILE ... [install-options] --test: 测试安装,但不真正执行安装;dry run模式 --nodeps:忽略依赖关系 --replacepkgs 覆盖安装(重新安装包名,版本号都一样的) 原来的配置文件 会改名。不会覆盖。 --replacefiles 安装程序生成的文件可能和的软件的文件冲突,安装的位置和名称都一样,rpm会有提示,不能进行安装,这事需要使用replacefiles --nosignature: 不检查来源合法性 --nodigest:不检查包完整性 --noscipts:不执行程序包脚本片断 %pre: 安装前脚本;--nopre %post: 安装后脚本;--nopost %preun: 卸载前脚本;--nopreun %postun: 卸载后脚本;--nopostun
升级:意味着老版本删除,只留一个版本的该程序。
rpm {-U|--upgrade} [install-options] PACKAGE_FILE... rpm {-F|--freshen} [install-options] PACKAGE_FILE... upgrade:安装有旧版程序包,则“升级” 如果不存在旧版程序包,则“安装” freshen:安装有旧版程序包,则“升级” 如果不存在旧版程序包,则不执行升级操作 rpm -Uvh PACKAGE_FILE ... rpm -Fvh PACKAGE_FILE ... --oldpackage:降级 与i配合使用。 rpm -ivh --oldpackgage PACKAGE-FILE --force: 可与 安装 -i 或 升级 -U -F配合使用。 升级注意项 注意: (1) 不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核 (2) 如果原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留
包查询 -q
rpm {-q|--query} [select-options] [query-options] [select-options] -a: 所有包 -f: 查看指定的文件由哪个程序包安装生成 系统上已经安装生成的文件,是由那个软件安装包生成的 -p rpmfile:针对尚未安装的程序包文件做查询操作; --whatprovidesCAPABILITY:查询指定的CAPABILITY由哪个包所提供 --whatrequiresCAPABILITY:查询指定的CAPABILITY被哪个包所依赖 rpm2cpio 包文件|cpio –itv预览包内文件 [root@localhost Packages]# rpm2cpio tree-1.6.0-10.el7.x86_64.rpm |cpio -itv -rwxr-xr-x 1 root root 62768 Jun 10 2014 ./usr/bin/tree drwxr-xr-x 2 root root 0 Jun 10 2014 ./usr/share/doc/tree-1.6.0 -rw-r--r-- 1 root root 18009 Aug 13 2004 ./usr/share/doc/tree-1.6.0/LICENSE -rw-r--r-- 1 root root 4628 Jun 24 2011 ./usr/share/doc/tree-1.6.0/README -rw-r--r-- 1 root root 4100 Jun 24 2011 ./usr/share/man/man1/tree.1.gz 177 blocks rpm2cpio 包文件 | cpio –id “*.conf”释放包内文件 [root@localhost ~]# rpm2cpio tree-1.6.0-10.el7.x86_64.rpm |cpio -id ./usr/bin/tree 177 blocks [root@localhost ~]# tree /root /root ├── anaconda-ks.cfg ├── fenge.sh ├── old ├── tree-1.6.0-10.el7.x86_64.rpm └── usr └── bin └── tree 可能会出现的一个问题是权限属主或属组的问题。可能需要修改。
3 directories, 4 files
[query-options] --changelog:查询rpm包的changelog -c: 查询程序的配置文件 -d: 查询程序的文档 -i: information -l: 查看指定的程序包安装后生成的所有文件;列表 --scripts:程序包自带的脚本片断 -R: 查询指定的程序包所依赖的CAPABILITY; ##查询软件都依赖那些文件或程序 --provides: 列出指定程序包所提供的CAPABILITY;##列出该软件都能提供哪些能力。
查询用法:
-qi PACKAGE, -qfFILE, -qc PACKAGE, -qlPACKAGE, -qdPACKAGE -qpi PACKAGE_FILE, -qpl PACKAGE_FILE, ... -qa
卸载:
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ... --allmatches 安装了多个版本的同名软件,全部卸载 --notriggers 触发器,多是脚本 --test 测试不真实卸载 ##卸载时,如有该程序为其他程序所依赖,不能卸载,忽略依赖关系强行卸载,可以。但是会影响到其他软件的运行。
安装过的软件–校验
rpm {-V|--verify} [select-options] [verify-options] 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 mTimediffers P capabilities differ rpm -V PACKAGEFILE ##安装过的软件的包名不带版本号例如 tree rpm -Va 检查系统所有软件的完整性。比较耗时间和系统资源。
包来源合法性验正及完整性验正:
完整性验正:SHA256 来源合法性验正:RSA 公钥加密: 对称加密:加密、解密使用同一密钥; 非对称加密:密钥是成对儿的 public key: 公钥,公开所有人 secret key: 私钥, 不能公开 导入所需要公钥: rpm -K|checksigrpmfile检查包的完整性和签名 rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7 CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7 rpm -qa gpg-pubkey* 查询安装的key
常用选项
rpm数据库
数据库重建: /var/lib/rpm rpm {--initdb|--rebuilddb} initdb: 初始化 如果事先不存在数据库,则新建之 否则,不执行任何操作 rebuilddb:重建 无论当前存在与否,直接重新创建数据库
rpm常用用法:
安装 [root@yangyouwei ~]# rpm -ivh /media/CentOS6.8Final/Packages/tree-1.5.3-3.el6.x8664.rpm warning: /media/CentOS6.8Final/Packages/tree-1.5.3-3.el6.x8664.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing… ########################################### [100%] 1:tree ########################################### [100%] 升级
rpm -uvh FILEPACKAGE... rpm -fvh FILEPACKAGE...
卸载
[root@yangyouwei ~]# rpm -e tree
查询 查询已经安装的软件包。后面跟的是包名 [root@localhost ~]# rpm -q tree #必须是准确的包名 tree-1.6.0-10.el7.x86_64 #已经安装的软件的版本
使用正则表达式查询已经安装的软件 [root@localhost ~]# rpm -qa | grep "^tr" #配合grep使用正则表达式查询 trousers-0.3.13-1.el7.x86_64 traceroute-2.0.19-5.el7.x86_64 tree-1.6.0-10.el7.x86_64 查询文件系统上的文件是由那个rpm包生成的 [root@yangyouwei ~]# rpm -qf /etc/ssh/ssh_config openssh-clients-5.3p1-117.el6.x86_64 查询已经安装的软件包是由哪些文件构成的。一个列表。后面跟的是包名 [root@yangyouwei ~]# rpm -ql tree /usr/bin/tree /usr/share/doc/tree-1.5.3 /usr/share/doc/tree-1.5.3/LICENSE /usr/share/doc/tree-1.5.3/README /usr/share/man/man1/tree.1.gz 查询rpm包内都有哪些文件 [root@yangyouwei ~]# rpm -qpl /media/CentOS_6.8_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm /usr/bin/tree /usr/share/doc/tree-1.5.3 /usr/share/doc/tree-1.5.3/LICENSE /usr/share/doc/tree-1.5.3/README /usr/share/man/man1/tree.1.gz
校验 导入公钥 rpm –import /media/CentOS6.8Final/RPM-GPG-KEY-CentOS-6 查询安装的公钥,用于来源和完整性校验
rpm包校验 [root@yangyouwei ~]# rpm -K /media/CentOS_6.8_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm /media/CentOS_6.8_Final/Packages/tree-1.5.3-3.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK 查询已经安装导入的key [root@yangyouwei ~]# rpm -qa gpg-pubkey* gpg-pubkey-c105b9de-4e0fd3a3
原创文章,作者:yyw,如若转载,请注明出处:http://www.178linux.com/37893