Linux软件包管理

  在我们的运维工作,总是避免不了安装某些软件,或者编译安装某些软件,我们知道操作系统当中的程序都是有程序员通过开发工具开发的来,程序员直接编写的纯文本的文档我们称之为源代码,但我们的计算机只能识别二进制程序,那么必须要将源代码变成计算机能识别的二进制程序,这里需要通过编译器来进行编译,将源码转换成二进制程序,再通过安装即可。

还有一类程序就是二进制程序,系统是由某些厂商来做的,在厂商的系统上编译出来的程序,自然就在系统上运行了,这里是由厂商直接编译好程序然后释放出来给用户,如此一来,由于我们本来就使用厂商的发行版,系统是一样的,那么使用厂商的提供编译过的程序就没问题。首先来介绍下软件运行的环境

 

软件运行环境

API:Application Programming Interface

       POSIX: Portable OS

程序源代码à预处理à编译—-à汇编—-à链接

静态编译:编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so.lib)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。

共享编译:将库提取出来,与可执行文件链接到一起,实现共享编译

ABI:Application Binary Interface

Windowslinux不兼容

         ELFExecutable and Linkable Format

         PE

库级别的虚拟化

         linuxWINE

         windowsCywin

 

※包管理器

二进制应用程序的组成部分:

       二进制文件、库文件、配置文件、帮助文件、头文件

程序包管理器

将编译好的应用程序组成文件打包一个或几个程序包文件,从而方便快捷地实现程序包的安装、卸载、查询、升级和校验等操作目前在Linux系统之上软件的安装方式最常见的有一下两种方式:

dpkg

这个机制最早是有Debian Linux社区所开发出来的,通过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时还能提供安装后的软件资讯,实在非常不错。基于Debian衍生版系统,如B2DUbantu等都是用dpkg来管理软件的。

 

RPM

  这个机制最早是由redhat公司开发出来,后来大家觉得这个管理器非常好用,因此很多发行版就使用这个机器来作为软件包的管理器如SuSe,Fedora,CentOS

  但是如上的两种包管理器的机制或多或少都会有软件属性的相依的问题,其实在安装时,每个文件文件都提供依赖性的检查,那么如果我们将依赖性的数据做成列表、等到安装时,如果有依赖关系,通过依赖性的数据列表,管理机制就会同时安装被依赖的软件。

 

 

软件包命令规则

源代码:

name-version.tar.gz|bz2|xz

versionmajor(主版本号).minor(次版本号).release(释放号)

比如:httpd-2.4.6.tar.bz2包的名字叫httpd主版本号是2次版本号是4释放号是6(也是修改过6次的意思)后面是以打包压缩的方式存储

 

rpm包命名方式

      name-version-release.arch.rpm

  例如:bash-4.2.46-19.el7.x86_64.rpm

  包名称叫做bash主版本号是4,次版本号是2,修整号是46,适合的硬件平台是el7.x86

  主版本号:当新功能推出时,更新主版本号,或者某些功能有较大的变化时,就需要更新了

  次版本号:与主版本号相同,次版本号更新只是局部的,但仍然有较为重要的改进和增强,这是需要变动版本号了

  修订号:局部的变量,一般只是修复bug,或者简单的功能扩展

  因此,主版本号最为稳定,变化的周期长,修改号更新快,变化周期短

 

常见的arch

x86i386i486,i586,i686

x86_64x64x86_64,amd64

powerpc:ppc

跟平台无关:noarch

 

包分类和拆包

Application-version-arch.rpm:主包

Application-devel-version-arch.rpm开发子包

Application-utils-version-arch.rpm其他子包

Application-libs-version-arch.rpm其他子包

 

解决依赖包管理工具

    yumrpm包管理器的前端工具

    apt-getdeb包管理器前端工具

    zippersuse上的rpm前端管理工具

    dnfFedora 18版本以上的rpm包管理器前端工具

 

库文件:

查看二进制程序所依赖的库文件

         ldd  /path/to/binary_file

比如:ldd  /bin/ls

 

管理及查看本机装载的库文件

         ldconfig

         /sbin/ldconfig –p:显示本机已经缓存的所有可用库文件名及文件路径映射关系

         配置文件:/etc/ld.so.conf, /etc/ld.so.conf.d*.conf

         缓存文件:/etc/ld.so.cache

 

程序包来源

1.         系统光盘

2.         项目官方站点

3.         第三方组织如Fedora EPELExtra Packages for Enterprise Linux

4.         自己制作

 

 

※RPM

 

优点

1.         rpm内含已经编译过的程序与配置文件等数据,可以让使用者免除重新编译的困扰。

2.         rpm在被安装之前,会检查系统的硬盘容量、操作系统版本、可避免文件被错误安装

3.         rpm文件本身提供软件版本咨询,依赖性软件名称,软件用途说明、软件含义便于了解软件



rpm的管理分为安装、卸载、升级、查询、检验、数据库维护

 

安装

    rpm {i|install} [install-option]  PACKAGES_FILE…

     -hhash,#表示安装进度,每个#表示%2

     -v|–verbose:显示详细过程

     -vv:显示更详细的过程

     [install-option]

    rpm –ivh –test:测试安装;但不真正执行安装;在dry run模式下进行

    rpm –ivh –  –nodeps:忽略依赖关系

    rpm –ivh –  –replacepkgs:重新安装,替换原有安装

    rpm –ivh –  –nosignature:不检查来源合法性

    rpm –ivh –  –nodigest:不检查包完整性

    rpm –ivh –  –force:强行安装,可以实行重装或降级

    rpm –ivh –  –scripts:不执行程序包脚本片段

   

   

 

查询:

    rpm {q|–query}  [select-options] [query-options]

    rpm -q packages_name 查询指定的包是否已安装

    rpm -qa:查询所有已安装的包

    rpm -qi packages_name:查询指定包的说明信息

    rpm -ql packages_name:查询指定安装包生成的文件

    rpm –qc packages_name:查询指定安装包生成的配置文件

    rpm –qd packages_name:查询指定安装包生成的帮助文件

    rpm –qf files_name:查询指定的文件是由那个包安装生成的

    rpm –qp files_name:查询指定未安装的程序包文件做查询操作

    –whatprovides capability:查询指定的capability被那个包所提供

    –whatrequires capability:查询指定的capability被那个包所依赖

    rpm –q –scripts packages_name:查看指定的包中包含的脚本

    rpm –q –changelog packages_name:查询rpm包改变日志

    rpm –R packages_name:查询指定的程序包所以来的capabilty

    rpm2cpio 包文件|cpio –itv 预览包里的文件

    rpm2cpio 包文件|cpio –id *.conf”释放包内文件

 

    2.jpg

 

升级

    rpm {-U|–upgrade}[install-options] PACKAGES_FILE…:如果有老版本的,则升级,否则,则安装

    rpm {-F|–freshen}[install-options] PACKAGES_FILE…:如果有老版本的,则升级,否则,则退出安装

    –oldpackages:降级

注意

不要对内核做升级操作;Linux支持多内核版本并存,因此,对直接安装新版本内核

如果源程序包的配置文件安装后曾被修改,升级时,新版本提供的同一个配置文件并不会覆盖老版本的配置文件,而把新版的文件命令为以.rpmnew的文件保留

 

 

卸载:

 

    rpm {-e|–erase}  [–allmatches] [–nodeps][–test] PACKAGES_NAME

    简单用法:rpm –e packages_name

    –nodeps:忽略依赖关系

    –test:测试卸载;dry-run模式

    –allmatches:如果一个程序包同时安装多个版本时,则此选项一次全部卸载,但程序包配置文件安装后曾被修改,卸载时,此文 件通常不会被删除,而是被重名为以.rpmsave的文件保留

 

 

校验:

  查询包安装之后生成的文件是否发生了改变

    rpm {-V|–verify} [select-options][verify-options]

 常用用法:rpm –V packages_name

 当没有输出结果时表示软件包完整ok,当有相应的结果输出表明对应的内容有修改,具体如下:

    S file Size differs  文件的容量大小发生改变

    5MD5 sum differsMD5这一种指纹码的内容发生改变

    M Mode differs   文件的类型或文件的属性发生改变

    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 –import  /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

  验证 rpm –K  packages_name

    3.jpg

 

 

重建数据库

  当我们把数据库的文件删除之后,我们查询软件包的信息都是查询不到的,因为rpm –q是依据数据库里的数据来进行查询,这时就需要重建数据库了

  数据库位置

     /var/lib/rpm

     rpm {–initdb|–rebuilddb}

     rpm –initab:初始化,如果事先不存在数据库,则新建,否则,不执行任何操作

     rebuilddb:重建,无论事先是否存在,直接重新创建数据库

 

 

 

 

※yum

 

       yumYellowdag Update Modifier,yum是通过分析rpm的标头文件数据后,根据各软件的依赖关系制作出有依赖关系时的解决方案,然后可以自动处理软件的依赖性问题,以解决软件安装或移除与升级的问题。因此我们想使用yum 必须先要找到适合的yum server才行,而每个yum server可能都会提供许多不同的软件功能,yum server会根据功能进行分类,这里的分类就是所谓的仓库,yum repository 存储了众多rpm包,以及报相关的元数据文件放置在特定目录repodate

    yum仓库中的元数据文件

    primary.xml.gz:所有的rpm包的列表,依赖关系,以及每个rpm安装生成的文件列表

    filelists.xml.gz:当前仓库中所有rpm包的所有文件列表

    other.xml.gz:额外信息,rpm包的修改日志

    repomd.xml:记录的事上面三个文件的时间戳和检验和

    coms*.xml.rpm分组信息

 

yum客户端配置文件

    /etc/yum.conf:为所有仓库提供公共配置

    /etc/yum.repos.d/*.repo:为仓库的指向提供配置

仓库的定义:

    [reposirtoryID]repository用来表示此repository执行,并且唯一

    name= description对仓库的描述信息

    baseurl=url://path/to/repository 指定仓库的访问路径,通常为一个文件服务器上输出的repository,要跟repodata这个目录在同一个目录下的路径

    http://10.1.0.1/cobbler/ks_mirror/7/

    ftp://10.1.0.1/iso/7

    file:///mnt/

    enabled={1|0}是否启用仓库1表示启动,0表示禁用

    gpgcheck={1|0}是否对程序包做校验,1表示校验,0表示不校验

    gpgkey=file://etc/pki/rpm-gpg/RPM-GPG-CentOS-6指明gpgkey文件路径

    cost=#  #表示数字,指明当前仓库的访问开销,默认为1000,数值越小优先级越高

   

    4.jpg

yum-config-manager

    yun-config-manager –disable “repository_name” 禁用此仓库

    yun-config-manager –enable  “repository_name” 启用此仓库

 

yum命令介绍

显示仓库列表

    yum repolist [all|enabled|disabled]

all:列出已经配置的所有的可用仓库

disable:列出禁用的仓库

enabled:列出启动的仓库

 

显示程序包

    yum list[all|glob_expr1][glob_expr2 ]   列出所有包

    yum reinstall [packeages]                            重新安装指定包

    yum grouplist group1 group2 […]              查看指定包组,不指定组查看所有组

 

安装程序包

    yum install packages [packages2][…]    安装某程序包

    yum groupinstall packages [packages2][…] 安装包组

在安装某些软件时,有时需要依赖某些安装包,这时yum会自动解决依赖关系

 

升级程序包

    yum update [packages1] [packages2][…]   升级

    yum downgrade packages1 [packages2][…] 降级

 

检查可用性

    yum check-update

    5.jpg

卸载程序包

    yum remove|erase packages1[packages2][…]     删除包

    yum groupremove|erase packages1[packages2][…] 删除包组

 

查看程序包信息

    yum  info   显示所有包的信息    此功能跟rpm –qi类似

    yum  info packages  显示指定包的信息

    yum groupinfo gropu1 显示指定包组的信息

 

清理本地缓存

    yum clean 清理缓存

    yum clean [packages]metadata|expire-cache|rpmdb|pkugins|all]

 

构建缓存

    yum makecache

 

查看yum事物历史

    yum history [info|list|packages-list|packages-info|summary|addon-info|redo|undo]

    yum history:显示所有历史事物

    yum history info 6 显示指定历史事物信息

    yum history undo 6:如果第六步是安装这里则是卸载,反之则是安装

   

     6.jpg

 

 

如何创建本地yum仓库

    1、挂载本地光盘,如/mnt

    #mount /dev/cdrom /mnt/

 2、创建仓库

    vim /etc/yum.repos.d/base.repo

    [cdrom]

    name=123

    baseurl=file:///mnt

    enabled=1

    gpgcheck=0

 到这里本地yum仓库就配置好了

 

yum的命令行选项

     –nogpgcheck:禁止进行gpg check

     -y:自动回答为yes

     -q:静默模式

     –disablerepo=repoidglob:临时禁用此处指定的repo

     –enabledrepo=repoidglob:临时启动此处指定repo

     –noplugins:禁用所有插件

 

 

编译安装

    1c代码编译安装三步骤

通过选项传递参数,指定启用特性,安装路径,执行时会参考用户的指定以及makefile.in文件生成的makefile,检查一来到的外部环境

    2make:根据makefile文件,构建应用程序

    3makeinstall 复制文件到相应路径

 

开发工具:

    autoconf:生成configure脚本

    automake:生成makefile.in文件

 

编译Cyuandaima

  前提:提供开发工具及开发环境

  开发工具:makegcc

  开发环境:开发库,头文件,glibc标准库

  通过安装包组提供开发珠江

     yum groupinstall Development Tools

     yum groupinstall “Server Platform Development

 

 

编译安装

  第一步:configure脚本

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

    –help:获取其支持使用的选项

 

安装路径设定

    –prefix=/Path:指定默认安装位置,默认为/usr/loca

    –sysconfdir=/path:配置文件安装位置

 

    optional Features:可选特性

    –disable-feature

    –enable-feature

    optional packages:可选包

    –with-packages[=arg]依赖包

    –without-package禁用依赖关系

 

  第二步: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) 导入头文件

   基于链接的方式实现:

         ln –sv

导入帮助手册

   编辑/etc/man.config|man_db.conf文件

   添加一个MANPATH

1、  yum的配置和使用;包括yum repository的创建

   我将一些rpm包下载至/root/repo目录下,此时目录下没有repodate的数据目录,构建仓库就会报错,这时就需要createrepo,系统中默认createrepo这个命令是没有安装的,所以需要安装

    createrepo [options] <directory>

    create  /root/repo

创建了repo数据文件之后,这时候就需要配置yum仓库了,在/etc/repos.d/目录下创建一个以repo结尾的文件即可,内容如下

    [xen]          #仓库名称

    name=1  #仓库描述

    baseurl=file:///root/repo  #仓库的路径

    enabled=1         #是否启用仓库1表示启用,0表示禁用

    gpgcheck=0   #是否检查来源合法性

    cost=100   #仓库优先级默认值为1000,值越小,优先级越高

 

 2、编译安装apache 2.2,并启动此服务

  第一步:下载源码包wget: ftp://10.1.0.1/pub/Sources/sources/httpd/ httpd-2.2.29.tar.bz2

  下载完成之后就需要解压缩,随后进入到该目录,里面有个configure的脚本

      ./configure –prefix=/usr/local/apache  –sysconfdir=/etc/httpd2  prefix指定安装路径,sysconfdir指定配置文件路径)

 

第二步: make 生成文件

第三步: make install  make生成的文件拷贝至指定安装目录下

第四步:导出头文件、库文件、帮助文档、二进制程序

1、  ln  -sv /usr/local/apache/include  /usr/include/httpd 导出头文件

2、  导出帮助文件

vim  /etc/man.config

MANPATH=/usr/loca/apache/man       centos6

vim  /etc/man_db.conf

MANDATORY_MANPATH      /usr/loca/apache/man  centos7

3、  导出库文件

vim /etc/ld.so.conf.d/httpd2.conf

/usr/local/apache/lib   在文件中加入此行即可

4、  二进制程序

vim  /etc/profile.d/httpd.conf

export  PATH=$PATH:/usr/local/apache/bin

5、  服务脚本

cp /etc/rc.d/init.d/httpd    /etc/rc.d/init.d/httpd24

chmod  +x /etc/rc.d/init.d/httpd

加入以下几行:

apachectl=/usr/local/apache/bin/apachectl

httpd=/usr/local/apache/bin/httpd

prog=httpd

pidfile=${PIDFILE=/var/run/httpd24.pid}

lockfile=${LOCKFILE-/var/lock/subsys/httpd24}

RETVAL=0

STOP_TIMEOUT=${STOP_TIMEOUT-10}

 

vim /etc/httpd24/httpd.conf

增加一行

PidFile=/var/run/httpd24.pid

 

service  httpd24  start  启动服务即可

ss  -tan 查看有没有80端口监听

使用crul   httpdserver测试页面是否正常显示,如果端口起来了,还是看不到内容可能是防火墙开了,这是需要iptables –F临时的清理以下防火墙的策略

原创文章,作者:fszxxxks,如若转载,请注明出处:http://www.178linux.com/39131

(0)
上一篇 2016-08-24 10:13
下一篇 2016-08-24 10:25

相关推荐

  • 马哥教育网络班22期+第8周课程练习 忍者乱太郎喻成

    第八周 1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 一个好的链接,主要的参考http://www.cnblogs.com/imapla/archive/2013/03/12/2955931.html简单的总结和自己的理解桥接器(network bridge),又称网桥,一种网络设备,负责网络桥接(network …

    Linux干货 2016-12-26
  • 马哥教育网络班21期+第1周课程练习

    1.描述计算机的组成及其功能。   计算机主要由运算器,控制器,存储器,输入设备,输出设备组成   运算器用来做计算,用来做二进制运算(加法运算)和逻辑运算   控制器用来控制计算机各部件之间的协调,例如运算器想做运算从哪里读入加数和被加数,寄存在哪里   存储器分为内存储器和外存储器,用来存放数据 内存储器用于存放计…

    Linux干货 2016-07-12
  • Linux ansible 服务

                      Linux ansible 服务 Ansible:    运维工具的分类: agent:基于专用的agent程序完成管理功能,puppet, func, zabbix, … agentless:基于ss…

    系统运维 2016-11-19
  • History,Help——Linux基本命令(6)

    1.     history   当你在玩Linux的时候,如果你经常使用命令行来控制你的Linux系统,那么有效地使用命令历史机制将会使效率获得极大提升。 history是shell的内置命令,其内容在系统默认的shell的man手册中。 一些用法: history[-c] [-d offset] [n] …

    2017-07-15
  • Linux网络管理&脚本编程之执行流程、循环

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。 网桥(Bridge):是早期的两端口二层网络设备,用来连接不同网段。网桥的两个端口分别有一条独立的交换信道,不是共享一条背板总线,可隔离冲突域。网桥比集线器(Hub)性能更好,集线器上各端口都是共享同一条背板总线的。后来,网桥被具有更多端口、同时也可隔离冲突域的交换机(Switc…

    Linux干货 2016-11-14
  • Bash脚本写法及变量如何使用

    Bash是什么? bash脚本是作为linux执行与内核交互的一个方便快捷的脚本语言工具。它可以帮助我们快速的解决问题。 Bash写法: 需要创建一个文件,以.sh结尾。这样就生成一个脚本文件 我们文件内容开头要以#!/bin/bash 开头,这是脚本规定的格式,目的是告诉编译器我们这个脚本是bash类型的脚本。 当上述工作都做好以后,我们就可以正式开始脚本…

    Linux干货 2017-04-10