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

(注:内容太多,容纳不下,编译安装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)
上一篇 2016-08-24 10:12
下一篇 2016-08-24 10:12

相关推荐

  • 初识linux:计算机的组成及功能

    一、描述计算机的组成及功能。 由冯诺伊曼提出计算机体系结构(5大部件)控制器(Controller):是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。运算器(Datapath):运算器的功能是对数据进行各种算术运算和逻辑运算,即对数据进行加工处理。 (cpu由控…

    2017-12-03
  • Linux 用户、用户组及权限管理

    一、Linux用户及用户组的基本概念 用户:用户是实现能够将有限的资源在多个使用者之间进行分配;、 用户组:用户组是指多个用户的集合,方便对一类需要同样权限的用户授权 Linux是多用户、多任务的操作系统。     多用户指:多人同时使用系统资源;多任务:同时运行多个进程 二、用户及用户组类别 1、用户:名称解析库 /…

    Linux干货 2016-03-20
  • linux下的打包与压缩

    linux压缩或解压缩工具有很多,除了已经很少有人使用的compress外,现在常用的还有tar,bzip2,xz 和gzip等,我们来说说它们的用法。 先来说bzip2。bunzip2和bzcat可以由bzip2指定选项来执行同样的结果,这里只介绍bzip2的用法。使用bzip2这个工具创建的文件以.bz2,.bz,.tbz,.tar.bz2或者…

    Linux干货 2017-04-16
  • python 常用记录

    all() >>> a = [11,22,33] >>> all(a) >>> ture 对序列进行判断,如果全为真,则返回Ture >>> a = [11,22,0] >>> a…

    Linux干货 2016-09-19
  • Linux发展史

    Linux发展史 本篇文章主要介绍Linux是什么,Linux是怎么来的,Linux能干些什么等 Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它之所以如此受到人们的欢迎,是因为它开源,是因为它简洁,更因为它稳定。作为一个普通用户,或许你没接触过电脑的Linux系统,但…

    Linux干货 2016-10-14
  • 马哥linux0803课堂笔记

    课堂笔记   重定向的几种方式 标准输入 0 (stdin) 标准输出 1 (stdout) 标准错误 2 (stderr)   标准输入的重定向方法 cat < file cat << string (多行重定向) xxx aaa string结束 cat file | cat   标准输出的重定向 ls e…

    Linux干货 2016-08-08