程序包管理与编译安装详解

(注:内容太多,容纳不下,编译安装apache单独成文)

一、程序包管理工具

不同的发行版采用的管理工具不尽相同:

              debian: 程序文件以deb结尾,包管理器为dpkg

              redhat:程序文件以rpm结尾,包管理器为rpm 

前端工具:自动解决依赖关系

              yum:rpm包管理器的前段工具

              apt-get:deb包管理器的前段工具      

1、程序包管理器的功能:

       将编译好的应用程序的各组成文件打包成一个或多个程序包文件,从而方便快捷地实现程序包的安装、卸载、查看、升级和校验等管理操作。

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

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

3、二进制文件包的命名方式:

       name-Version-release-arch.rpm

blob.png

如:zlib-1.2.3-29.el6.x86_64.rpm

              zlib:包名

              1.2.3:主版本号

              29:在主版本的基础上的打包数。由于修复bug等原因进行修改,每修改一次,增加一次打包数。

              el6:应用于哪个发行版。el6标识RHEL的发行版

              x86_64:基于哪个架构平台发行的

                     常见的架构平台

                            32位: i386 i486 i686

                            64位: x64  x86_64  amd 64

                            noarch:不局限于某架构平台的,通用

              rpm:软件包的扩展名 

4、二进制文件包的类型

       主包:name-Version-release.arch.rpm

       支宝:name-function-Version-release.arch.rpm

                      function:devel,utils,libs…

比如:yum的rpm就由yum主包和多个功能包组成

  

blob.png

    

5、包文件的组成

       (1)每个包都单独实现的:

              文件清单

              安装或卸载时运行的脚本

       (2)公共的数据库:

              程序包名称及版本

              依赖关系

              功能说明

              包安装后生成的各文件路径及校验码信息

      

6、获取程序包的途径:

       1、发行版的光盘或官方的文件服务器(或镜像站点)

              http://mirrors.aliyun | sohu | 163.com

       2、项目的官方站点

       3、第三方组织

              a、EPEL

              b、搜索引擎,包含但不限于下列搜索引擎:

                     http://pkgs.org

                     http://rpmfind.net

                     http://rpm.phone.net

使用非官方程序包的建议:在使用非官方的程序包时,应检查其合法性,以保障系统的安全。

合法性包括:

       来源合法性:即程序包是从开心来的途径获得。

       内容合法性:即程序包的内容没有发生改动。

 

二、rpm命令的使用

1、安装

       rpm –i|–install  [install-options]  Package_File1…

       常用选项:

              -v(verbose):显示安装过程详细信息

              -vv:更详细

              -h:hash marks输出进度条;每个#表示2%的进度

              –test:测试安装是否成功,并报告依赖关系及冲突消息等,并不真正地安装。

              –nosignature:不检查来源合法性,不检查包签名信息

              -nodigest:不检查包完整性

              –noscripts:不执行程序包脚本

                     rpm包可以自带脚本

                     脚本分为4类:

                            preinstall:安装过程开始之前运行的脚本,以%pre标识,–nopre(不执行该脚本片段)

       postinstall:安装过程完成之后运行的脚本,以%post标识,–nopost(不执行该脚本片段)

preuninstall:卸载过程开始前运行的脚本,以%preun标识,–nopreun(不执行该脚本片段)                     

postuninstall:卸载过程完成之后运行的脚本,以%postun表示,–nopostun(不执行该脚本片段)

             

              通常使用: rpm –ivh Package_File1…来进行安装

blob.png

–test检测依赖关系,当然也可直接安装,依赖关系不满足也会返回错误

blob.png

2、升级

       rpm {-U|–upgrade} [install-options] PACKAGE_FILE …

       rpm {-F|–freshen} [install-options] PACKAGE_FILE …

              rpm -Uvh:升级(若已安装)或安装(若未安装)

              rpm -Fvh:只升级

              常用选项:

                     –oldpackage:降级

                     –force:强制升级

              注意:(1)不要对内核做升级操作;内核支持多版本并存,若有需要,可另安装新版本内核

(2) 如果原程序包的配置文件在安装之后被修改,升级时,新版本程序提供的同意配置文件不会覆盖原有的配置文件,而是把新版本的配置文件重命名为(Filename.repnre)后提供。

例:安装zsh-4.3.10,之后升级至4.3.11

blob.png

3、卸载

       rpm {-e|–erase}  [–allmatches]  [–nodeps]  [–noscripts] [–test] PACKAGE_NAME …

–allmatches:卸载所有匹配指定名称的程序包的各版本

              –nodeps:忽略依赖关系

              –test:测试卸载,dry run模式

blob.png

4、查询

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

              [select-options]

                     Package_Name:查询指定的程序包是否已安装,及其版本信息

                     -a|–all:查询所有已安装过的包

                     -f File:查询指定的文件由哪个程序包安装生产

                     -p|–package Package_File:用于实现对未安装的程序包执行查询操作。

                     –whatprovides  CapAbility :查询指定的CapAbility由哪个程序包提供

                     –whatrequires   CapAbility:查询指定的CapAbility被哪个包所依赖

                                         

               [query-options]

                     –changelog:查询rpm包的changelog

                     -l|–list:程序安装生产的所有文件列表

                     -i|–info:程序包相关的信息,版本号、大小、所属的包组等

                     -c|–configfiles:查询指定的程序包提供的配置文件

                     -d|–docfiles:查询指定的程序包提供的文档

                     –provides:列出所指定的程序包提供的所有的CapAbility

                     -R|–requires:查询指定的程序包的依赖关系

                     –scripts:查询程序包自带的脚本片段

                                         

              用法:

                     -qi  Package :产看程序包的详细信息

                     -qf  file:查看指定的文件由哪个程序安装生成

                     -qc  Package:查看指定程序包安装生成的配置文件

                     -ql  Package:查看指定包安装产生的所有文件

                     -qd  Package:查看指定程序包提供的文档

                     -p选项为查看未安装程序包的信息,其余选项基本一致,不再解释

                     -qpi  Package

                     -qpl  Package

                     -qpc  file

例1:查看httpd安装包自带的脚本

blob.png

例2:查看httpd安装包提供的Capability

blob.png

例3:查看zsh安装包生成的配置文件

blob.png

例4:查看/etc/zshrc文件由哪个程序包安装生成

blob.png

例5:查看zsh安装生成的所有文档

blob.png

5、校验

       rpm  {-V|–verify}  [select-options]  [varify-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   mTime differs

       P   caPabilities differ

        

 包来源合法性验证和完整性验证:

       来源合法性验证:数字签名

       完整性验证:

             

       获取并导入信任的包制作者的密钥:

              rpm  –import  /etc/pki/rpm-apg/RPM-GPK-KEY-CentOS-7

                                  

       验证:

              (1)安装此组织签名的程序时,会自动执行验证

              (2)手动验证:rpm -K Package_File

  

blob.png

                         

数据库重建:

       rpm管理器数据库路径:/var/lib/rpm

       查询操作:通过此处的数据库进行

              rpm {–initdb|–rebuilddb}

                     initdb:初始化数据库,当前无任何数据库时创建一个新的;当前有时不执行任何操作

                     -rebuilddb:重新构建,通过读取当前系统上所有已安装过的程序包进行创建。

获取帮助:

       CentOS6:man rpm

       CentOS7:man rpmdb

                           

三、yum命令

       yum命令依赖于rpm命令,但是yum自动解决了包的依赖关系,在使用中较rpm更为方便。

 

yum repository(yum repo):yum 仓库,存储了众多rpm包,以及包相关的元数据文件,放置于特定目录下,此目录需包含软件包和repodata目录

      

1、  yum仓库提供的方式:

a、本地yum仓库:

本地yum仓库多使用光盘作为yum源,如何使用光盘当作本地yum仓库:

              (1)挂载光盘

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

              (2)创建配置文件:yum-config-manager –add-repo=file:///path/to/iso_file

              (3)修改配置文件:

                     设置gpgcheck=0|1;若设置为1;需指定

                     gpgkey= file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

blob.png

blob.png

blob.png

blob.png

       b、自建yum仓库

              当我们有多个零散的rpm包时,可以将这些包组合在一个目录中,配置成yum仓库,方便日常使用

              rpm包的获取方式有多种,下面只介绍在ftp服务器中获取rpm包:

              (1)登录ftp之后,可以使用!+command使用linux的命令,而不是执行ftp的命令

              (2)lcd切换本地目录,这样下载的rpm将包存放于该目录

              (3)get下载

      

如何自建yum 仓库

              (1)下载rpm包,

              (2)组合在一个目录中

              (3)创建repodata:  createrepo [options] <dirctory>

                            createrepo -d somedir

              (4)创建yum配置文件: yum-config-manager  –add-repo=file:///

              (5)修改配置文件:

c、远程yum仓库。

远程服务器要提供yum仓库服务,器本身需要提供以下几种服务中的一种:

              ftp://文件服务器

              http://

              nfs://

              file:///

             

2、yum客户端配置:

       配置文件:/etc/yum.conf:提供公共配置。通常不要做修改

                     etc/yum.repos.d/*.repo:为仓库的指向提供配置。我们使用的常用配置文件。

                     每个repo结尾的文件对应一个yum服务器,当然也可以将多个yum服务器配置写在同一个配置文件中。但写入不同的文件在管理时操作叫方便

             

3、仓库的定义:

       [repositoryID]      #仓库id

       name=                  #仓库名,指定与否皆可

       baseurl-url=path/to/repository          #指定仓库路径

       enabled={1|0}     #是否启用此仓库,默认为1,启用

       gpgcheck={1|0}   #是否检查此仓库中rpm包的合法性,默认为1,检查

       gpgkey=url       #若gpgcheck为1,则必须给密钥文件路径,否则报错。

                     file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6

       enablegroup={1|0}:是否支持组软件包管理,默认支持。可不做特别指定                          

yum命令的用法:

       显示仓库列表

              yum  repolist{all|enabled|disabled}

       显示程序包:

              yum list [all]

              yum list {available|installed|updates}

       安装程序包:

              yum install package1 [package2] …

       升级程序包

              yum update package1 [package2] …

       检查可用升级:

              yum check-update

       卸载程序包:

              yum remove|erase package1 [package2] …

       查看程序包information:

              yum info […]

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

              yum  provides | whatprovides feature1 [feature2]…

       清理本地缓存

              yum clean [all | packages | rpmdb…]

       构建缓存

              yum makecache

       搜索

              yum search string1 [string2]…

              以指定的关键字搜索程序包名及summary信息

       查看指定包所以来的capabilities

              yum deplist package1 [package2] …

       查看yum事务历史

              yum history [list | summary |stats…]

 

包组管理的相关命令,包组管理使用类似,在此不再做详细介绍:

       yum grouplist                      #查看包组

groupinstall                  #安装包组

              groupupdate                #升级

              groupremove               #删除

              groupinfo                     #查看指定包组的详细信息

 

注:低版本的系统可以指向搞版本的yum仓库,但高版本的系统不能指向低版本的yum源

              CentOS6.0的yum源可以指向6.1等更高的6系列的yum源,但反过来不支持

 

                           

yum的命令行选项:

       –nogpgcheck:禁止进行gpg check

       -y:自动回答为yes

       -q:静默模式

       –disablerepo=[repo]:临时禁用此repo

       –enablerepo=[repo]:临时启用此repo

      

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

       应用场景:为多台pc/server配置yum仓库时,不用为每台pc/server指定特别的仓库路径,而是通过变量获取当前系统的基本信息,从而到对应版本的仓库中获取yum源。

       $releasever:当前OS的发行版的主版本号

       $arch:平台

       $basearch:基础平台

       $YUM0-$YUM9

       http://mirrors.163.com/centos/$releasever/$basearch/os

      

      

四、程序包编译安装:

不同语言的编译工具:

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

              java:maven

             

              C代码编译安装三步骤:

                     1 ./configure:

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

                     (2)、检查依赖的外部环境

                     2 make:

                            根据makefile文件,构建应用程序。

                     3 make install

                    

       编译安装前建议:安装前先查看INSTALL、README,可以获取该程序的帮助信息

      

       开源程序源代码的获取:

              官方自建站点

              代码托管站点:

                     SourceForge

                     Github.com

                     code.google.com

                    

       c/c++:gcc(GNU C Complier)GNU C编译器

      

       如何编译安装C源代码程序

前提:准备好开发工具及开发环境。最好安装开发工具包组,当然,也可以单独安装需要的开发工具。

              CentOS6: “Development Tools”,“Server Platform Development”

CentOS7: “Development Tools”

开发工具:make、gcc

                     开发环境:开发库、头文件

                                   glibc:标准库

安装开发包组:yum groupinstall “Development Tools”

              第一步:执行configure脚本

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

                    

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

                            选项分类:

                            安装路径设定:

                                   –prefix=/path/to/some_dir:指定默认安装位置

                                   –sysconfdir=/path/to/somewhere:指定配置文件安装路径

                            System types:

                                   Optional Feature:可选特性

                                          –disable-FEATURE:禁用某特性

                                          –enable-FEATURE[=ARG]:启用某特性

                                         

                            Optional Packages:可选包

                                          –with-PACKAGE[=arg]

                                          –without-PACKAGE

              第二步:make

              第三步:make install

       安装后的配置:

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

                            编辑/etc/profile.d/NAME.sh (NAME为程序名)

                                   export PATH=/PATH/to/Binary:$PATH

blob.png

              (2)、导出库文件路径

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

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

                            ldcofig –v

blob.png

              (3)、导出头文件

                            基于链接的方式实现

                                   ln –sv

blob.png

              (4)、导出帮助手册

                            编辑/etc/man.config文件

                                   添加一个MANPATH

 

blob.png 

五、实战演练

1、输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序

#!/bin/bash
#
echo "please enter some random number: "
read -a arr

for ((i=0;i<${#arr[@]};i++))
do
for  ((j=0;j<${#arr[@]}-1;j++))
do
if [ ${arr[$j]} -gt ${arr[$j+1]} ]
then
tmp=${arr[$j]}
arr[$j]=${arr[$j+1]}
arr[$j+1]=$tmp
fi
done
done
echo "after sort:"
echo ${arr[@]}


for ((i=0;i<${#arr[@]};i++))
do
for  ((j=0;j<${#arr[@]}-1;j++))
do
if [ ${arr[$j]} -lt ${arr[$j+1]} ]
then
tmp=${arr[$j]}
arr[$j]=${arr[$j+1]}
arr[$j+1]=$tmp
fi
done
done
echo "anthoer method: "
echo ${arr[@]}

blob.png

  2、删除kernel包后,无法启动,并恢复之

    

1)、卸载内核

rpm –e kernel –nodeps

重启之后,无法登陆系统

 

blob.png

2)、进入救援模式

blob.png

blob.png

 

3)、重新安装内核至/mnt/sysimage;安装耗时较久

rpm -ivh /run/install/repo/Pakages/kernel-3.10.0-327-el7-x86_64.rpm –root=/mnt/sysimage

blob.png

4)、重启系统

发现内核已出现在选择面板

blob.png

登录系统成功

blob.png

(注:内容太多,容纳不下,编译安装apache单独成文)

原创文章,作者:M20-1钟明波,如若转载,请注明出处:http://www.178linux.com/39372

(0)
M20-1钟明波M20-1钟明波
上一篇 2016-08-24
下一篇 2016-08-24

相关推荐

  • linux网络属性管理

    Linux网络属性配置 计算机网络:TCP/IP:协议栈(使用)ISO,OSI:协议栈(学习) MAC:Media Access Control48bits:ICANN:24bits, 2^24地址块:2^24 网桥(bridge):MAC地址表静态指定:动态学习:根据原地址学习; 交换机(switch):多端口网桥; IP(Internet protoco…

    Linux干货 2017-10-14
  • heartbeat实现高可用集群(1)

    环境 node1 192.168.1.35 node2 192.168.1.36 fip 192.168.1.80 daemon httpd nfs 192.168.1.15 配置HA集群的前提 1.节点时间必须同步,使用ntp协议实现 2.节点间需要通过主机互相通信,必须解析主机名至IP地址 a.建议名称解析功能能使用hosts文件实现 b.通信中使用的名…

    Linux干货 2017-11-03
  • 文件权限

    浅谈文件权限 Linux系统中的每个文件和目录都有访问许可权限,用他来确定谁能通过何种方式对文件和目录进行访问和操作。  文件权限: 文件或目录的访问权限分为只读,只写和可执行三种。  文件的权限主要针对三类对象进行定义:          owne…

    Linux干货 2016-08-07
  • System作业

    1、求每班总成绩和平均成绩 [root@Centos7 bin]# awk '!/^name/{a[$2]++;b[$2]+=$3}END{for(i in a){print i,b[i],b[i]/a[i]}}' f1 4 100 50 5&nbs…

    Linux干货 2016-09-20
  • 第二周作业新

    一、Linux上的文件管理类命令都有哪些,其常用的使用方法及其相关示例演示。 pwd :显示当前所在路径   cd :切换目录   cd – :在上次目录与当前目录之间切换。   cd ~ :切换回自己的家目录   cd . :当前目录      cd .. :切换到…

    2017-02-18
  • 软件包管理rpm和yum基本使用

    RPM是RedHat Package Manager(RedHat软件包管理工具)类似Windows里面的“添加/删除程序”因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度。 rpm 执行安装包 二进制包(Binary)以及源代码包(Source)两种。二进制包可以直接安装在计算机中,…

    Linux干货 2016-08-29