技术笔记:Linux程序包管理

简介: 技术笔记:Linux程序包管理

前端工具YUM管理程序包:


rpm管理软件虽然方便,但是需要手工解决软件包的依赖关系;很多时候安装一个软件需要首先安装一个或多个(有时多达上百个)其它软件,手工解决很复杂;使用yum可以解决这个问题


注意:yum并不是rpm的取代者,只是rpm包管理器的前端工具,是依赖于rpm包管理器的,使用yum来解决安装问题


yum(Yellowdog Updater Modified)是一个RPM包的前端管理工具,主要目的是用来自动解决RPM安装的依赖关系。其特点:自动解决依赖关系、可以对RPM进行分组,并基于组进行安装操作(一次性安装一类软件)、引入仓库概念,支持多个仓库、配置简单。


yum引入了仓库(repository)概念,仓库用来存放所有现有的rpm软件包以及包的相关的元数据文件(元数据文件放置于特定目录repodata下),当使用yum安装一个rpm软件时候,如果存在依赖关系,会自动在仓库中查找依赖软件并安装;仓库可以是本地的,也可以通过http、ftp或nfs形式。


yum的工作原理:


yum的工作需要两部分来,一部分是yum服务器,还有就是client的yum工具。


yum服务器


所有要发行的rpm包都放在yum服务器上以提供别人来下载,rpm包根据kernel的版本号,cpu的版本号分别编译发布。yum服务器只要提供简单的下载就可以了,ftp或者http的形式都可以。yum服务器有一个最重要的环节就是整理出每个rpm包的基本信息,包括rpm包对应的版本号,conf文件,binary信息,以及很关键的依赖信息。在yum服务器上提供了createrepo工具,用于把rpm包的基本概要信息做成一张"清单",这张"清单"就是xml格式的文件,这些xml文件会存放在repodata目录下,服务器端的repository(仓库)就建立好了。注意repodata目录所在的位置,就是yum仓库的位置


yum 客户端


client每次调用yum //代码效果参考:http://hnjlyzjd.com/xl/wz_24777.html

install或者search的时候,都会去解析/etc/yum.repos.d下面所有以.repo结尾的配置文件,这些配置文件指定了yum服务器的地址。yum会定期去"更新"yum服务器上的rpm包"清单",然后把"清单"下载保存到yum自己的cache里面,根据/etc/yum.conf里配置(默认是在/var/cache/yum下面),每次调用yum装包的时候都会去这个cache目录下去找"清单",根据"清单"里的rpm包描述从而来确定安装包的名字,版本号,所需要的依赖包等,然后再去yum服务器下载rpm包安装。

yum配置文件:


为所有仓库提供公共配置和yum软件自身的配置:


  /etc/yum.conf


  【main】主配置文件


  cachedir=/var/cache/yum/$basearch/$releaseveryum下载后的缓存目录


  keepcache=0? 缓存是否保存


  debuglevel=2 调试级别


  logfile=/var/log/yum.log?yum安装日志文件


  exactarch=1?是否严格检查程序包对应硬件平台与当前硬件平台是否匹配,匹配才安装


  obsoletes=1?这是一个update的参数,具体请参阅yum(8),简单的说就是相当于upgrade,允许更新旧的RPM包


  gpgcheck=1? 默认是否检查软件包的来源合法性和完整性


  plugins=1是否支持插件功能


  installonly_limit=3?同时能安装几个包


仓库指向配置:


  /etc/yum.repos.d/.repo?


  【repositoryID】         仓库ID自己指定,不要与其它配置同名


  name=Some name for this repository?仓库名字自己指定


  mirrorlist= 指定获取镜像服务器地址列表的url(需要支持插件yum-fastestmirror)


  baseurl= 仓库的网络路径


  enabled={1|0}? 是否启用该配置(没配置enabled属性默认是开启的)


  gpgcheck={1|0}?是否检查软件包的来源合法性和完整性


  gpgkey=URL 指定检查来源合法性所需秘钥文件的网络路径


  enablegroups={1|0}?是否支持组批量管理程序包


  cost={1..1000} 该配置的访问优先级,较小的优先(默认为1000)


  failovermethod={roundrobin|priority}?如果配置了多个仓库地址,配置选用哪个地址的选择方式,默认为roundrobin(轮询)就是随机挑选一个地址;priority(优先级)从上到下顺序选择;


yum的repo配置文件中可用的变量:


  $releasever?当前OS的发行版的主版本号;如RedHat 6.5,则替换为6


  $arch 系统架构平台


  $basearch基础平台,如i686,i586等的基本架构为i386


  $YUM0-$YUM9?在系统中定义的环境变量,可以在yum中使用


yum命令使用:


显示仓库列表:all显示所有,enabled显示启用的,disabled显示停用的


  yum repolist 【all|enabled|disabled】


显示程序包:


  yum list 【all | glob_exp1】 【glob_exp2】 【...】显示所有程序包,可以使用通配符过滤


  yum list {available|installed|updates} 【glob_exp1】 【...】


安装程序包:


  yum install package1 【package2】 【...】


  yum reinstall package1 【package2】 【...】 (重新安装)


升级程序包:


  yum update 【package1】 【package2】 【...】升级程序


  yum downgrade package1 【package2】 【...】降级程序


检查可用升级:


  yum check-update


卸载程序包:


  yum remove | erase package1 【package2】 【...】


查看程序包描述信息:


  yum info 【package1】 【...】


 查看指定的特性(可以是某文件)是由哪个程序包所提供:


  yum provides | whatprovides feature1 【feature2】 【...】


清理本地缓存:


  yum clean 【 packages | metadata | expire-cache | rpmdb | plugins | all 】


构建缓存:


  yum makecache


搜索:以指定的关键字搜索程序包名及summary(摘要)信息


  yum search string1 【string2】 【...】


查看指定包所依赖的capabilities(功能):


  yum deplist package1 【package2】 【...】


查看yum事务历史:只有变化时才记录事物,如安装、卸载、更新数据包


  yum history 【info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats】


安装及升级本地程序包:本地下载了rpm包,通过yum安装该rpm包;这样的好处是可以解决安装该rpm包的依赖关系;不过新版本的yum工具通过install和update就可以直接安装升级rpm包


  yum localinstall rpmfile1 【rpmfile2】 【...】


   (maintained for legacy reasons only - use install)


  yum localupdate rpmfile1 【rpmfile2】 【...】


   (maintained for legacy reasons only - use update)


包组管理的相关命令:


  yum groupinstall group1 【group2】 【...】


  yum groupupdate group1 【group2】 【...】


  yum grouplist 【hidden】 【groupwildcard】 【...】


  yum groupremove group1 【group2】 【...】


  yum groupinfo group1 【...】


yum的命令行选项:在执行yum命令时,以命令指定的选项为准,忽略配置文件中的配置


  --nogpgcheck?禁止进行gpgcheck


  -y?分析完依赖关系,自动安装,不在提示用户是否安装


  -q?静默模式,不在输出详细信息


  --disablerepo=repoidglob?临时禁用此处指定的repo(如果某个repo在配置文件中为启用的,可以在这里临时禁用,不用改repo配置,通过repoid标识)


  --enablerepo=repoidglob  临时启用此处指定的repo(如果某个repo在配置文件中为禁用的,可以在这里临时启用该repo配置,通过repoid标识)


  --installroot=/path/to指定软件的安装路径


  --noplugins?禁用所有插件


演示:


显示库列表


【root@centos7 ~】# yum repolist all


已加载插件:fastestmirror, langpacks


Loading mirror speeds from cached hostfile


源标识 源名称 状态


CDROM CentOS 7 Release 7.2 启用: 9,007


bash Base Repo 启用: 9,363


epel Fedora-epel/7/x86_64 启用: 11,263


查看程序包摘要信息


【root@centos7 ~】# yum info httpd


已加载插件:fastestmirror, langpacks


Loading mirror speeds from cached hostfile


已安装的软件包


名称 :httpd


架构 :x86_64


版本 :2.4.6


发布 :40.el7.centos


大小 :9.4 M


源 :installed


来自源 :CDROM


简介 :Apache HTTP Server


网址 :


协议 :ASL 2.0


描述 :The Apache HTTP Server is a powerful, efficient, and extensible


: web server.


查看指定的特性(可以是某文件)是由哪个程序包所提供:


【root@centos7 ~】# yum provides httpd


已加载插件:fastestmirror, langpacks


Loading mirror speeds from cached hostfile


httpd-2.4.6-40.el7.centos.x86_64 : Apache HTTP Server


源 :CDROM


httpd-2.4.6-45.el7.centos.x86_64 : Apache HTTP Server


源 :bash


httpd-2.4.6-40.el7.centos.x86_64 : Apache HTTP Server


源 :@CDROM


查看指定包所依赖的capabilities(依赖关系分析):


【root@centos7 ~】# yum deplist httpd


已加载插件:fastestmirror, langpacks


Loading mirror speeds from cached hostfile


软件包:httpd.x86_64 2.4.6-45.el7.centos


依赖:/bin/sh


provider: bash.x86_64 4.2.46-20.el7_2


依赖:/etc/mime.types


provider: mailcap.noarch 2.1.41-2.el7


依赖:/usr/sbin/groupadd


provider: shadow-utils.x86_64 2:4.1.5.1-24.el7


依赖:/usr/sbin/useradd


provider: shadow-utils.x86_64 2:4.1.5.1-24.el7


依赖:httpd-tools = 2.4.6-45.el7.centos


provider: httpd-tools.x86_64 2.4.6-45.el7.centos


依赖:libapr-1.so.0()(64bit)


provider: apr.x86_64 1.4.8-3.el7


依赖:libaprutil-1.so.0()(64bit)


provider: apr-util.x86_64 1.5.2-6.el7


依赖:libc.so.6(GLIBC_2.14)(64bit)


provider: glibc.x86_64 2.17-157.el7


依赖:libcrypt.so.1()(64bit)


provider: glibc.x86_64 2.17-157.el7


依赖:libdb-5.3.so()(64bit)


provider: libdb.x86_64 5.3.21-19.el7


依赖:libdl.so.2()(64bit)


provider: glibc.x86_64 2.17-157.el7


依赖:libexpat.so.1()(64bit)


provider: expat.x86_64 2.1.0-8.el7


依赖:liblua-5.1.so()(64bit)


provider: lua.x86_64 5.1.4-15.el7


依赖:libm.so.6()(64bit)


provider: glibc.x86_64 2.17-157.el7


依赖:libpcre.so.1()(64bit)


provider: pcre.x86_64 8.32-15.el7_2.1


依赖:libpthread.so.0()(64bit)


provider: glibc.x86_64 2.17-157.el7


依赖:systemd-units


provider: systemd.x86_64 219-30.el7


查看yum事务历史:


【root@localhost ~】# yum history


Loaded plugins: product-id, security, subscription-manager


This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.


ID | Login user | Date and time | Action(s) | Altered


-------------------------------------------------------------------------------


2 | root | 2018-07-14 05:42 | Install | 1


1 | System | 2018-07-12 23:14 | Install | 636


history list


创建本地yum仓库:


如何使用光盘当作本地yum仓库:


1、挂载光盘至某目录,例如/media/cdrom


  mount -r -t iso9660 /dev/cdrom /media/cdrom


2、创建配置文件


  【CentOS7】


  name=Centos 7 source


  baseurl=


  gpgcheck=0


  enabled=1


创建yum仓库:


  createrepo 【options】


可以通过以下方式手工创建yum仓库


  1、将所有rpm文件拷贝到一个文件夹中


  2、通过rpm命令手工安装createrepo工具


  3、运行命令creatrepo -v /rpm-dirctory(在第一步拷贝的文件夹rpm-dirctory下创建索引信息文件rapodata文件)


  4、在/etc/ yum.repos.d/目录下面创建一个.repo结尾的yum仓库文件,文件示例如下:


   【king】


   name=this is my yumrepo


   baseurl= #rapodata目录所在的目录


   enabled=1


   gpgcheck=0


  5、如果有分组信息则在运行命令的时候使用-g参数指定分组文件


   creatrepo -g /tmp/comps.xml /rpm-directory


   CentOS/RHEL的分组信息保存在光盘repodata目录下,文件名以comps.xml结尾的xml文件


  创建好之后本机可以通过file方式直接使用,如果用作为对外的yum仓库服务器,可以通过http、ftp或nfs协议共享出去


程序包管理之编译安装:


因此,用户首先得获得程序源码包(SRPM, Source RPM)。RPM包的命名格式为:name-VERSION-release.arch.rpm,而程序源码包(SRPM)的命名格式为:name-VERSION-release.src.rpm。可以发现,SRPM与RPM相比,将arch替换为src,说明SRPM包去掉了arch这一平台类型限制,因此经过用户自己编译安装可以编译成适合自己平台的程序包。


我们知道,程序源代码一般为多文件组织格式,因此文件中的代码文件之间很有可能存在跨文件的依赖关系,这将给用户自行编译安装带来了极大麻烦,因为对先编译哪些文件、后编译哪些文件根本无从知晓,因此这就需要项目管理器(或者项目构建器)。


C/C++的项目管理器为make,make工具可以在编译过程中指定使用哪个预处理器进行预处理、使用哪个编译器进行编译以及先编译什么程序文件、后编译什么程序文件,甚至完成更为复杂的操作等,能帮助用户快速地编译安装。make工具的执行依赖于makefile配置文件,因此make执行的所有操作皆由makefile文件指定。而makefile文件是通过执行configure脚本生成,在执行configure脚本时,configure脚本会结合用户通过命令行指定的选项以及各个Makefile.in模板文件来生成makefile文件。编译完成之后即可使用make install命令将编译好的程序包复制到用户指定的各个目录下。


源代码—> 预处理—> 编译(gcc)—> 汇编—> 链接—> 执行


C、C++: make(configure + Makefile.in—>makefile)


java:maven


开发工具:autoconf生成configure脚本;automake生成Makefile.in文件


开源程序源代码的获取:


官方自建站点:


  apache.org (ASF)


  mariadb.org


代码托管站点:


  sourceforge.net


  github.com


  code.google.com


c/c++程序源代码编译器为gcc (GNU C Complier)


C源代码编译安装三步骤:


编译安装前:提供开发工具及开发环境


安装相关工具:make、gcc等


准备相关文件:开发库(glibc标准库)、头文件


通过安装"包组"提供开发组件


?CentOS 6安装:"Development Tools", "Server Platform Development"


CentOS 7安装:"Development Tools"


注意:各程序在编译安装过程中可能有所不同,安装前可以先查看INSTALL、README文件


第一步:执行configure脚本


  1、通过选项传递参数,指定启用特性、安装路径等;执行时会参考用户的指定选项以及Makefile.in文件生成makefile;


  2、检查依赖的外部环境(环境是否满足安装该程序,检查依赖的库文件、检查系统平台是否满足、检查头文件);


  选项:指定安装位置、指定启用的特性


    --help获取其支持使用的选项


    选项分类:


    安装路径设定:


    --prefix=/PATH/TO/SOMEWHERE 指定程序默认安装位置,默认为/usr/local/


    --sysconfdir=/PATH/TO/SOMEWHERE?配置文件安装位置


    System types?指定系统类型,可以进行交叉编译


    Optional Features  可选特性


    --disable-FEATURE  关闭指定特性,默认关闭时无须指定


    --enable-FEATURE【=ARG】?开启指定特性以及安装路径,默认开启时无须指定


    Optional Packages 可选包


    --with-PACKAGE【=ARG】?安装指定依赖包以及其安装路径


    --without-PACKAGE 不安装指定依赖包


第二步:make


  make会执行真正的编译操作,但make本身并不是编译器,它只是一个项目构建工具,make程序会根据执行configure脚本所生成的makefile文件,并调用所需要用到的编译器来构建应用程序


第三步:make install


  在前面的make程序执行之后,在当前目录下会创建出已编译完成的目标二进制格式的应用程序(包括二进制程序、库文件、配置文件及帮助文档等),而make install则会执行安装操作,实际上就是把当前目录下已编译好的程序包(二进制程序、库文件、配置文件及帮助文档等)复制到用户指定的各个目录当中去。


第四步:编译安装后的配置(如果在编译安装时指定了相关的安装路径)


  1、导出二进制程序目录到PATH环境变量中


    编辑文件/etc/profile.d/NAME.sh


    export PATH=/PATH/TO/BIN:$PATH


  2、导出库文件路径


    编辑/etc/ld.so.conf.d/NAME.conf


    添加新的库文件所在目录至此文件中;


    让系统重新生成库缓存:执行ldconfig 【-v】命令


  3、导出头文件


    有些程序安装后会生成对自己拥有库文件调用接口相关的头文件,系统查找头文件的路径为/usr/include,导出独立安装应用程序的头文件方法:创建链接至/usr/include下即可


    例如:/usr/local/nginx/include


    # ln -sv /usr/local/nginx/include/* /usr/include/


    # ln -sv /usr/local/nginx/include /usr/include/nginx


  4、导出帮助手册


    在CentOS 6上:编辑/etc/man.config文件,添加一个MANPATH


    # MANPATH /PATH/TO/MAN


    这里'/PATH/TO/MAN'为目标程序的安装路径下的帮助手册目录


    在CentOS 7上:编辑/etc/man_db.conf文件,添加一个MANPATH_MAP


    # MANPATH_MAP /PATH/TO/BIN /PATH/TO/MAN


    这里/PATH/TO/BIN是目标二进制程序所在目录,/PATH/TO/MAN则是该程序的帮助手册所在目录。


案例:编译安装apache 2.2源码包,并启动此服务


1、首先获取源代码,下载到当前主机,并展开归档压缩文件。


【root@CentOS6 Downloads】# ls


httpd-2.2.29.tar.bz2


# 展开归档压缩文件,并进入展开的目录中,可以看到目录中的文件


【root@CentOS6 Downloads】# tar xf httpd-2.2.29.tar.bz2


【root@CentOS6 Downloads】# ls


httpd-2.2.29 httpd-2.2.29.tar.bz2


【root@CentOS6 Downloads】# cd httpd-2.2.29


【root@CentOS6 httpd-2.2.29】# ls


ABOUT_APACHE BuildAll.dsp config.layout emacs-style httpd.spec LAYOUT LICENSE NOTICE README.platforms srclib


acinclude.m4 BuildBin.dsp configure httpd.dep include libhttpd.dep Makefile.in NWGNUmakefile README-win32.txt support


Apache.dsw buildconf configure.in httpd.dsp INSTALL libhttpd.dsp Makefile.win os ROADMAP test


build CHANGES docs httpd.mak InstallBin.dsp libhttpd.mak modules README server VERSIONING


2、进到目录当中,可以看到有configure脚本,是可执行的,但不要着急执行,先看一下安装的说明,及步骤,INSTALL,README和configure脚本帮助文档;


# 查看 INSTALL 文档


【root@CentOS6 httpd-2.2.29】# less INSTALL


APACHE INSTALLATION OVERVIEW


Quick Start - Unix


------------------


For complete installation documentation, see 【ht】docs/manual/install.html or


$ ./configure --prefix=PREFIX


$ make


$ make install


$ PREFIX/bin/apachectl start


# 查看 configure 的帮助文档


【root@CentOS6 httpd-2.2.29】# ./configure --help


`configure' configures this package to adapt to many kinds of systems.


Usage: ./configure 【OPTION】... 【VAR=VALUE】...


To assign environment variables (e.g., CC, CFLAGS...), specify them as


VAR=VALUE. See below for descriptions of some of the useful variables.


Defaults for the options are specified in brackets.


Configuration:


-h, --help display this help and exit


相关文章
|
2月前
|
Ubuntu Linux Python
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
在Linux系统中,使用Tkinter库时可能会遇到中文显示乱码的问题,这通常是由于字体支持问题导致的,可以通过更换支持中文的字体来解决。
161 0
Tkinter错误笔记(一):tkinter.Button在linux下出现乱码
|
3月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
213 6
|
4月前
|
网络协议 Linux
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
Linux查看端口监听情况,以及Linux查看某个端口对应的进程号和程序
708 2
|
4月前
|
Linux Python
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
linux上根据运行程序的进程号,查看程序所在的绝对路径。linux查看进程启动的时间
74 2
|
2月前
|
Linux API 开发工具
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
ijkplayer是由B站研发的移动端播放器,基于FFmpeg 3.4,支持Android和iOS。其源码托管于GitHub,截至2024年9月15日,获得了3.24万星标和0.81万分支,尽管已停止更新6年。本文档介绍了如何在Linux环境下编译ijkplayer的so库,以便在较新的开发环境中使用。首先需安装编译工具并调整/tmp分区大小,接着下载并安装Android SDK和NDK,最后下载ijkplayer源码并编译。详细步骤包括环境准备、工具安装及库编译等。更多FFmpeg开发知识可参考相关书籍。
110 0
FFmpeg开发笔记(五十九)Linux编译ijkplayer的Android平台so库
|
2月前
|
运维 Java Linux
【运维基础知识】Linux服务器下手写启停Java程序脚本start.sh stop.sh及详细说明
### 启动Java程序脚本 `start.sh` 此脚本用于启动一个Java程序,设置JVM字符集为GBK,最大堆内存为3000M,并将程序的日志输出到`output.log`文件中,同时在后台运行。 ### 停止Java程序脚本 `stop.sh` 此脚本用于停止指定名称的服务(如`QuoteServer`),通过查找并终止该服务的Java进程,输出操作结果以确认是否成功。
66 1
|
2月前
|
Linux 虚拟化
Vmware 傻瓜式安装(不可不知道的Linux基础知识和技术 01)
本文介绍了VMware虚拟机的下载与安装步骤。首先,通过提供的网盘链接下载VMware安装包。接着,详细描述了安装流程,包括接受协议、选择安装路径(建议避免系统C盘)、取消更新选项等。最后,输入许可证密钥完成安装,并展示了打开虚拟机后的主界面。整个过程简单易懂,适合新手操作。
159 1
|
3月前
|
消息中间件 分布式计算 Java
Linux环境下 java程序提交spark任务到Yarn报错
Linux环境下 java程序提交spark任务到Yarn报错
50 5
|
3月前
|
安全 Linux Android开发
Linux CFI (Control-flow integrity)技术相关资料汇总
Linux CFI (Control-flow integrity)技术相关资料汇总
|
4月前
|
Linux Windows Python
最新 Windows\Linux 后台运行程序注解
本文介绍了在Windows和Linux系统后台运行程序的方法,包括Linux系统中使用nohup命令和ps命令查看进程,以及Windows系统中通过编写bat文件和使用PowerShell启动隐藏窗口的程序,确保即使退出命令行界面程序也继续在后台运行。
下一篇
DataWorks