12-linux基础-软件包的安装 本文共有10435个字,关键词: linux程序包管理 API:application programing Interface 应用编程接口 程序源代码-->预处理-->编译-->汇编 ABI:Application binary Interface 应用二进制接口,这导致了不同平台程序不兼容 •wine 库级别的虚拟化,让win程序跑在linux上 •java是在API上进行统一,java程序是跑在虚拟出来的环境上(JDK),JAVA内部还包含运行环境JVM,只需要JDK的版本一致就能够将程序运行在各种平台上,为应用级开发 •系统级开发:c、c++、go •应用级开发:java、python、php •二进制程序的组成部分:二进制文件、库文件、配置文件、帮助文件 源码包: 一般由编译型语言编写而成,无法直接运行 需要先编译成二进制,源码包一般为压缩包 特性: 需要编译,非技术人员无法安装(需要人为解决依赖关系) 所有的软件包都是源码包,再有封装包(二进制) 自定义性强,可自由调整软件功能(需要技术达到一定水平) •一些源码包有安装脚本,简化安装操作 rpm包管理(安装、卸载、升级、查询) 二进制软件包的特点 专门的工具进行管理 安装简洁、速度快 经过封装,无法自定义 无法直接获取源代码 各平台的程序包管理器: Debian:deb格式软件包,使用dpt包管理器 RHEL:rpm格式软件包,使用rpm包管理器 •SUSE使用rpm包但是包 管理的形式不一样 源码包命名方式: name-version-tar.gz(为文本格式) VERSION:major-minor-relese 主版本号-次版本号-末版本号 rpm包命名的方式: name-version-arch.rpm(二进制格式) •version与源码包相同 arch:release.arch release:release.os.arch arch:表示与硬件平台无关 PPC(power PC)平台 •rpm包在制作的时候,将常用的功能和不常用的功能拆开(拆包),因此,rpm包由主包和子包组成,不常用的功能可选择性安装,但是子包依赖于主包,一般属于一个应用程序,为了适用于不同的场景。 •linux特性:一个程序只干一件事,这样就使得包与包之间存在依赖关系。 rpm包是编译好的封装包,也就是已经编译好的二进制文件打包后封装成rpm包 rpm包解压缩后是cpio类型的文件,cpio包有一个特点:从绝对路径恢复包内的文件,因此不论在上面地方安装,rpm工具都能够正确的安装。 •软件包依赖的是其他软件所提供的功能,这些功能被封装成函数的形式向外提供 •~]#ldd /COMMAND #显示指定二进制程序的所依赖的库,X0为内存中的16进制编址方式 •~]#ldconfig -p #查看已加载并缓存在内存中的库文件名称及其指向库文件路径的映射关系 ` /etc/ldso.conf中定义了库文件的位置 /etc/ld.so.conf虽然可以定义,但是一般放在/etc/ld.so.conf.d/*.conf 缓存文件:/etc/ld.so.cache ` 程序包管理: 功能:将编译好的应用程序各组成文件打包成一个或几个程序包文件,从而方便地实现程序包的安装、卸载、查询、升级、校验等管理操作 程序的组成清单(每个包独有,可通过接口查看) 文件清单、安装或卸载时运行的脚本 数据库(公共) 记录程序包名及版本、依赖关系、功能说明 安装生成的个文件路径及校验信息 CentOS程序包管理的方式: 使用包管理器:rpm rpm安装:不能自动查询软件包位置,不能自动解决依赖关系 使用前段共聚:yum、dnf yum前端工具 丰富了rpm的功能,解决了rpm包之间的依赖关系 apt-get 是deb包管理器的前端工具 zypper 是SUSE上的rpm包管理工具 dnf fedora设计的rpm包前端管理工具,在CentOS上可以实现,需要Fedora的EPEL源 yum RHEL系列的rpm包前端管理工具 获取程序包的路径: 1. 系统发行版的光盘或官方服务器CentS镜像 2. 项目的官方站点 3. 第三方组织 唯一一个靠谱的第三方源:Fedora-EPEL rpmfind.net rpm.pbone.net pkgs.org 4. 自己制作rpm包 •通过互联网下载的包要检查其合法性 来源的合法性 程序包的完整性 安装包的依赖关系 树形依赖: 1. 安装A依赖B,安装B依赖C.. 2. 安装A同时依赖多个软件 3. 安装A依赖C,但是安装B软件已经解决了依赖 环形依赖: 安装A依赖B,安装B依赖C,安装C依赖A 解决办法是软件包一起安装 •软件包依赖的是函数库文件,函数库文件是软件安装时,一并安装的,是为软件提供某些功能的,函数文件不能作为单独的程序运行,只能被别人调用。 •如果我们安装了32位的软件到64位的操作系统上,32位的软件会到/lib下查找函数库文件,但是在64位操作系统上,大多数的函数库文件放在/lib64下,因此我们需要将32位软件依赖的函数文件软链接到/lib下 ~]#ldd /path/to/COMMAND #查看指定软件依赖的函数文件 将对应的函数文件从/lib64软链接到/lib目录下即可 •静态函数:*.a 只为某一个应用程序提供服务,但会使软件的体积变大 •动态函数(公共函数):*.so 为多个应用程序提供服务,减少额外的空间占用 当安装程序时提示依赖,其函数库不存在时,可通过findrpm.net反查询哪一个包能够提供此函数。 二进制软件包的安装位置: /etc 配置文件 /usr/bin 命令存放目录(可能是其他目录) /usr/lib 函数库目录 /usr/share/doc 手册保存目录 /usr/share/man 帮助文档保存目录 安装: ~]#rpm [option] #软件的安装 -i 安装 -v 显示详细信息 -h 以hash"#"的格式来显示程序包管理的执行进度,每一个"#"代表2%的进度 --test 测试安装,并不是真正的安装,dry run模式 --nodeps 忽略依赖关系,当出现循环依赖时可以忽略,也可以同时安装 --replacepkgs 重新安装,这可能会导致新的配置文件不能使用,也可能覆盖掉配置文件 --ignoreos 忽略系统的版本,即内核的版本 --nosignature 不检查来源的合法性 --nodegest 不检查包的完整性 --noscripts 安装程序但是不执行包中的脚本 •安装前脚本 %pre --nopre •安装后脚本 %post --nopost •卸载前脚本 %preun --nopreun •卸载后脚本 %postun --nopostun --oldpackage 降级安装,使用旧版本替换掉新版本 升级: ~]#rpm -Uvh Package #安装有旧版本程序包则升级,不存在旧版本则安装 ~]#rpm -Fvh Package #如果安装有旧版本程序包则升级,如果不存在旧版本程序包则不执行升级操作 --force 强制安装(旧版本的库提示不兼容,可用次选项) •Tips: 不要对内核的版本做升级操作,linux支持多内核版本并存,因此可以直接安装新版本内核。 如果源程序包中的配置文件安装后曾被修改,升级时新版本的配置文件并不会直接覆盖老版本的配置文件,新版本的配置文件重命名为filename.rpmnew后保存 查询: ~]#rpm -qa #查询所有已安装的软件包 -q 包名 #查询包是否已安装 -f filename #查询指定文件由哪个程序包生成 --whatprovides capability(能力) #查询指定的功能由哪个包提供 --whatrequires capability #查询指定的能力被哪个包所依赖 --changelog #查看rpm包的change日志 -c 查询程序包的配置文件 -d 查询程序包生成的文档 -i 查询程序包的详细信息 -qR 查询指定程序包依赖的capability -ql 查询指定程序包安装后生成的所有文件 --scripts 显示rpm包自带的脚本片段 --provides 列出制定程序包所提供的capability ~]#rpm -qf filename #查询指定文件是由哪个软件包产生的 当误操作文件(修改)以后,反查询后进行强制安装 ~]#rpm --force -ivh 包全名 #强制安装指定的软件包 •对于未安装包的查询 ~]#rpm -qpi 包全名 #查询指定未安装包的详细信息 -p --package -qpc 查询未安装包的配置文件 -qpd 查看未安装包生成的文档 -qpl 查询未安装包安装后生成的所有文件 -qpR 查询未安装包所依赖的capability 卸载:针对的是已经安装的包 ~]#rpm -e 包名 #卸载指定的程序 --erase 卸载 --nodeps 忽略依赖 校验:检查软件包的完整性 ~]#rpm -V 包名 #查看指定服务(软件)的文件是否被修改过,一个服务对应多个文件 c 配置文件 d 普通文件 g 鬼文件ghost ~]#rpm -Vf filename #查看指定的文件是否被修改 s 文件大小改变 M 文件权限改变 5 文件的MD5校验和改变(即文件内容) D 主从设备编号改变 L 路径改变 U 属主改变 G 属组改变 T mtime改变 P capabilities(能力)改变 •软件包来源的合法性验证以及完整性验证 计算软件包的特征码并附在软件包后,使用非对称加密算法将特征码加密,公布公钥,保证软件包不被修改 对称加密:加密解密使用同一密钥 非对称加密,密码成对出现,使用其中一个加密,只能由另一个密钥解密(RSA) 公钥:public key 私钥:secret key •公钥由第三方机构来保证,或者去官方找(CentOS安装光盘自带) •完成性验证:SHA256 •来源合法性验证:RSA ~]#uname -r #查看内核的版本 证书的安装:导入公钥 ~]#rpm --import /etc/pki/rpm-gpg/RPM-GPG-.... #CentOS证书安装 ~]#rpm -qa |grep "gpg-pubkey" #查看证书是否成功安装 •rpm数据库位置:/var/lib/rpm,存放的是程序依赖的文件数据 •rpm数据库重建 ~]#rpm --initdb #初始化数据库,不存在则创建,存在则不创建 --rebuilddb 重建rpm数据库 前端工具:yum 也可以使用dnf(Fedora的EPEL源) yum为C/S架构,是由RedHat三次发行版yellow dog研发 yum支持很多插件但是依旧不完善 yum仓库:repository(yum repository) 仓库中存储了众多的rpm包,以及包相关的元数据文件(放置于特定目录repodata) 仓库的路径应当指向repodata目录 仓库一般是文件服务器提供服务 URL:统一资源定位 ftp://.... http://... nfs://... file://... yum客户端 配置文件:遵循将大配置文件分割成多段的管理风格 /etc/yum.conf #主配置文件,通常只提供个yum指向的公共配置 /etc/yum.repos.d/*.repo #用于配置一个或多个仓库指向,统一仓库可以存在多个,但是使用时只使用一个,不同类的仓库可以存在多个,可以同时使用 •基于yum配置文件解决了rpm不能查询软件的位置、不能自动解决依赖关系 •yum通过配置文件实现了软件的定位功能,需要人为 配置yum仓库 •yum能够通过列出的依赖关系,反向查询所有依赖软件的软件包位置 /etc/yum.repos.d/CentOS-Base.repo 网络yum源(所有软件包的存放地址,连接) /etc/yum.repos.d/CentOS-Media.repo 本地yum源(人为将挂载点填写到指定位置) •所有的源使用时只能使用一个 仓库的定义:搭建yum源 修改不启用的文件后缀,否则多个仓库不能正常使用 ~]#cd /etc/yum.repos.d ~]#mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak ~]#vim CentOS-Media.repo #编辑配置文件(名称可自定义,识别.repo结尾的文件) [repository-ID] #定义yum源的名称,中间不能有空格 name=CentOS-$release #描述信息可自定义,此处为调用版本信息 baseurl=URL #仓库的访问路径,可使用`mirrorlist=http://...指向一个文件,该文件中保存了baseurl,需要插件支持,默认开启` gpgcheck=[0|1] #是否检查rpm的合法性,开启后会强制检查 enabled=[0|1] #本仓库是否开启 gpgkey=URL #指定密钥文件的位置 failovermethod=[roundrobin|priority] #当默认仓库不能使用的处理方式 •默认为roundrobin(轮询),实际上是随机挑选一个 •priority 按照优先级由上而下 cost=1000 #默认开销为1000,当不同源的程序包版本相同时,开销最小的生效 •首次使用yum源的时候,会到服务器上去下载元数据文件(primary_db) 搭建本地双光盘yum源: 首先确认已经挂载双光盘 ~]#rm -rf /etc/yum.repos.d/* #删除所有yum源 ~]#vim /etc/yum.repos.d/CentOS-Media.repo #手动编辑配置文件 [CentOS-6] name=This is CentOS-6 packages baseurl=file///mnt/cdrom1 file:///mnt/cdrom2 #此行如注释,必须于绝对行首注释,否则不生效 enabled=1 gpgcheck=1 gpgkey=/etc/pki/rpm-geg/..... yum命令的使用方法: ~]#yum [option] [command] [Packages] -y 自动回答yes -p 静默模式 --nogpgcheck 临时禁止密钥校对 --disablerepo=repoID_glob 临时禁止已启用的仓库,可使用通配 --enablerepo=repoID_glob 临时开启已禁用的仓库,可使用通配 --noplugins 禁用所有插件 help 获取帮助信息 repolist [all|enabled|disabled] #显示仓库列表 list 显示所有的程序包,@表示已安装 list available 显示仓库中有但是没有安装的包 list update 显示可以升级的包 list installed 显示已经安装的包 install Package_name 安装指定的软件,也可指定下载的本地包,自动解决依赖关系 update Package_name 升级指定的软件 check-update 检测升级 remove Package_name 删除指定的软件 erase Package_name 删除指定的软件 info Package_name 查看包的简要信息 provides package_name/filename 查看指定的特性由哪个程序包提供 search KeyWord 按指定的关键字搜索(包名或summary摘要) reinstall package_name 重新安装,覆盖 downgrade package_name 降级安装 deplist package_name 显示指定包的依赖关系 history 查看操作历史(安装、升级、卸载等事务) ~]#yum clean all #清理本地缓存 ~]#yum makecache #构建缓存,执行其它操作时会自动重建 包组管理: ~]#yum groupinstall Group_Package #安装指定的包组 grouplist 显示能安装的包组 groupdate 升级包组 groupinfo Group_Name 查看包组信息 groupremove Group_Name 删除指定包组 •yum不能并行安装,只能一个结束后开始另一个安装 yum配置文件中可用的变量(*.repo) $releasever 当前OS发行版的主版本号 $arch 平台 $basearch 基础平台,如i386被i586,i686等兼容 创建yum仓库的方法: 需要安装createrepo软件包,能帮助我们创建、组织并管理rpm包相关repodate目录相关的文件 ~]#createrepo DIR #对指定rpm存放目录创建关系文件 createrepo工具会根据DIR目录下的rpm包信息,在DIR目录下创建repodata目录,并创建相关文件,写入软件包之间的依赖 createrepo工具能够读取rpm包本身的信息 rpm包的封装原理: cpio包的特点:如果是按照绝对路径进行压缩,那么解压时按照绝对路径进行解压缩。 •主要用来建立或者还原备份的工具 备份:压缩 ~]#cpio -ovcB >/path/to/filename #cpio的压缩 -o 进入copy-out模式(压缩) -v 显示过程 -c 使用Protable format存储方法 -B 设定输入输出为512bytes eg:~]#find /etc/*.sh -print |cpio -ovcB >/tmp/conf.bak 使用find命令列出所有目标的绝对路径,传递给cpio命令 !!此处需要注意:find查询时一定要使用绝对路径的方式进行查询 -print可以省略 还原:解压缩 ~]#cpio -idvcu < *.cpio #解压缩指定的cpio压缩包 -i copy-in模式(解压缩) -d 恢复到指定位置(视压缩方式恢复) -v 显示过程 -c 使用Protable format存储方法 -u 替换所有文件,无提示 从rpm包中提取cpio包 ~]#rpm2cpio Package_name |cpio -idv ./path/to/dir #按包中的绝对路径提取文件 !!给出的路径必须在cpio包中存在 源码包的编译安装: 源码包的特点:最新,可定制 源码包的组成格式:多文件,文件中的代码很可能存在跨文件的依赖关系 源码包需要依赖编译器进行编译,常见的编译器有c、c++。 •make 项目管理器,依靠makefile文件完成工作,makefile文件事先不存在,根据用户的需要生成。c/c++编写的程序常常使用make项目管理器 •maven java的项目管理器 源代码-->预处理-->编译-->汇编-->链接-->执行 •编译三步骤: ``` 安装前先查看install文件或README ①./configure --prefix=软件的安装位置 --sysconfigdir=配置文件位置 通过选项传递参数,指定启用的特性,安装路径等,执行时会按照用户指定以及makefile.in文件生成makefile文件 检查编译环境,以及依赖到的其他安装包 --help 获取帮助 ~]#echo $? #查看上一步骤是否出错 ②make #根据生成的makefile文件构建应用程序 ~]#echo $? #查看上一步是否出错 ③make install #j将 文件复制到指定目录下 ~]#echo $? #查看上一步是否出错 安装后的配置: 1. 导出二进制程序目录至PATH环境变量中 ~]#vim /etc/profile.d/NAME.sh #编辑环境变量配置文件 export PATH=/path/to/bin:$PATH #将新安装软件的命令路径加入环境变量中 2. 导出文件路径 ~]#vim /etc/ld.so.conf.d/NAME.conf #编辑函数库路径文件 添加新的函数库文件目录至文件中 •让系统重建缓存 ~]#ldconfig [-v] #通知内核重新加载函数配置文件 3. 导出头文件,基于符号链接方式实现 将每个文件或目录连接到/usr/include下即可 4. 导出帮助手册 ~]#vim /etc/man.config #编辑man配置文件 向其中添加MANPATH路径即可支持man的方式获取帮助 ``` 网络yum源的搭建: 必须要能够上网 wget下载指定版本的repo文件 网易:http://mirrors.163.com #只能下载最新版,所有镜像站点不允许下载老版本 CentOS官网:valut.centos.org 找到对应版本的使用帮助,按照求下载指定版本的repo文件至/etc/yum.repos.d •网络yum源的优先级最高,本地yum源会失效,只有将网络yum源文件删除或重命名才能使本地yum源生效 yum局域网络源: 服务器软件升级时应当按批次升级,避免同时升级出现故障停止服务 yum局域网络源原理: 将其中的一台进行更新,并下载所需要的软件,将保存下来的软件通过共享的方式共享给其他主机,其他主机指定yum源的时候制定该共享主机即可。 sftp的操作: >lcd 修改本地 下载路径 >get 下载 >put 上传 >!COMMAND 执行当前shell命令 打补丁原理: 补丁文件生成: ~]#diff -Nauf 旧文件绝对路径 新文件绝对路径 >/tmp/*.path #生成补丁文件 -N 当比较目录时,若某个文件只存在一个目录中,则另一个目录视为空文件 -a 将任何文档当做文本文档处理 -u 使用统一的输出格式 -r 当比较目录时递归比较子目录 -b 忽略空格造成的问题 -B 忽略空白行造成的不同 *.path补丁文件中的格式: 带加号的是新文件中有的旧文件中没有的 带减号的是旧文件中有,新文件中没有的 没有符号则为新旧文件中都有的 打补丁: ~]#patch -p# <*.patch #打补丁 -p 设置要剥离的目录层数,从根开始算起,代表补丁文件中记录的,old文件所在目录的层数,用于更新old文件时匹配正确的路径。 「一键投喂 软糖/蛋糕/布丁/牛奶/冰阔乐!」 赞赏 × 几人行 (๑>ڡ<)☆谢谢老板~ 2元 5元 10元 50元 100元 任意金额 2元 使用微信扫描二维码完成支付 版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。 基础笔记综合整理 2018-10-07 评论 1995 次浏览