程序包管理

软件包管理

1、c语言程序的构建过程

1.程序源代码 --> 预处理 --> 编译 --> 汇编 --> 连接--> 可执行程序php

  • 开放源码:就是程序码,文本格式的源代码,写给人类看的程序语言,但机器并不认识,因此没法执行;
  • 编译器:将程序码转译成为机器看的懂得语言,就相似翻译者的角色,生成二进制文件;
  • 连接:在Linux上使用ld工具,将o文件和所需的库文件连接起来组成一个可正常工做的可执行程序。连接了库文件以后就能够发起一些系统调用。
    • 静态编译:.a
      • 把程序对应的依赖库复制一份到包
      • libxxx.a
      • 嵌入程序包
      • 升级难,需从新编译
      • 占用较多空间,迁移容易
    • 动态编译:.so
      • 只把依赖加作一个动态连接
      • libxxx.so
      • “链接指向”
      • 占用较少空间,升级方便
      • 指针指向,软连接
  • 可执行文件:通过编译器变成二进制程序后,机器看的懂因此能够执行的文件。

2.二进制程序的组成部分:二进制文件、库文件、配置文件、帮助文件
查看二进制程序所依赖的库文件:
ldd /PATH/TO/BINARY_FILEhtml

3.包命名规则:前端

源代码:name-VERSION.tar.gz | bz2 | xz;
VERSION: major.minor.release

rpm包:name-VERSION-release.arch.rpm
例:bash-4.2.46-19.el7.x86_64.rpm
VERSION: major.minor.release
release:release.OS

常见的arch:
x86: i386, i486, i586, i686
x86_64: x64, x86_64, amd64 
powerpc: ppc
跟平台无关:noarch

通常,源码都是打包压缩过的文件,其一般以“.gz”、“.bz2”、“.xz”结尾,源码包中包含了源码,还包含了一些有助于制做二进制rpm的文件;rpm包通常以“rpm”结尾,都是已经编译完成的,安装rpm包的过程实际上就是将包中的文件复制到Linux上,有可能还会在复制文件的先后执行一些命令,如建立一个必要的用户,删除非必要文件等。node

4.包管理器:shell

  • debian:deb文件, dpkg包管理器
  • redhat: rpm文件, rpm包管理器
  • rpm: Redhat Package Manager
    • RPM Package Manager

5.包的分类与拆包
Application-VERSION-ARCH.rpm: 主包
Application-devel-VERSION-ARCH.rpm 开发子包
Application-utils-VERSION-ARHC.rpm 其它子包
Application-libs-VERSION-ARHC.rpm 其它子包数据库

注意:包之间可能存在依赖关系,甚至循环关系;vim

解决依赖包管理工具:
yum:rpm包管理器的前端工具
apt-get:deb包管理器前端工具
zypper: suse上的rpm前端管理工具
dnf: Fedora 18+ rpm包管理器前端管理工具centos

6.获取程序包的途径:浏览器

(1) 系统发版的光盘或官方的服务器;
CentOS镜像:
https://www.centos.org/download/
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirrors.163.com缓存

(2) 项目官方站点

(3) 第三方组织:
Fedora-EPEL:
Extra Packages for Enterprise Linux
Rpmforge:RHEL推荐,包很全
搜索引擎:
http://pkgs.org
http://rpmfind.net
http://rpm.pbone.net
https://sourceforge.net/

注意:第三方包要检查其合法性、完整性!!

7.库文件
一些查看命令:

ldd  /PATH/TO/BINARY_FILE    # 查看二进制程序所依赖的库文件
ldconfig -p   # 显示本机已经缓存的全部可用库文件名及文件路径映射关系

8.程序的配置文件和缓存文件:
配置文件:
/etc/ld.so.conf 所有放到一个文件中,或
/etc/ld.so.conf.d/*.conf 此文件目录下.cong结尾的文件,方便一个程序写一个配置文件

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

2、rpm管理器

1.程序包管理器:

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

包文件组成 (每一个包独有)
RPM包内的文件
RPM的元数据,如名称,版本,依赖性,描述等
安装或卸载时运行的脚本

数据库(公共):/var/lib/rpm
程序包名称及版本
依赖关系
功能说明
包安装后生成的各文件路径及校验码信息

ll  /var/lib/rpm/
total 75612   
-rw-r--r--. 1 root root  5521408 Oct 23 18:48 Basenames
-rw-r--r--. 1 root root    12288 Oct 23 18:47 Conflictname
-rw-r--r--. 1 root root    73728 Dec  4 11:57 __db.001
-rw-r--r--. 1 root root   229376 Dec  4 11:57 __db.002
-rw-r--r--. 1 root root  1318912 Dec  4 11:57 __db.003
-rw-r--r--. 1 root root   753664 Dec  4 11:57 __db.004
# 这个rpm包数据库文件夹中包含着现有已经安装的包的各类信息,包括安装版本,安装时间、升级时间、卸载时间等等很是重要,最好备份

2.rpm命令的使用

CentOS系统上使用rpm命令管理程序包:
安装、卸载、升级、查询、校验、数据库维护。

2.1 安装

rpm {-i|--install} [install-options] PACKAGE_FILE…
# option
    -v: verbose
    -vv:
    -h: 以#显示程序包管理执行进度
rpm -ivh  PACKAGE_FILE ...   # 安装某程序包

[install-options]
    --test: 测试安装,但不真正执行安装,即dry run模式
    --nodeps:忽略依赖关系
    --replacepkgs | replacefiles  # 对于已经安装过的包,若是不通过卸载,只是删除其一些文件,就会致使这个程序没法使用,咱们再从新安装这个程序包时,会显示此包已经安装,是由于在/var/lib/rpm这个文件中有该程序的安装记录。因此这种状况下要想从新安装这个程序包就须要rpm -ivh --replacepkgs 这个选项!
    --nosignature: 不检查来源合法性
    --nodigest:不检查包完整性
    --noscripts:不执行程序包脚本
    %pre: 安装前脚本; --nopre
    %post: 安装后脚本; --nopost
    %preun: 卸载前脚本; --nopreun
    %postun: 卸载后脚本; --nopostun

注意:

咱们在rpm安装时截图中红框位置显示nokey是由于咱们没有导入RPM-GPG-KEY-CentOS-7这个检查工具来检查其合法性,导入后便可显示
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-6 (centos6))导入公钥便可检查,这样在安装来源合法的程序包时就不在显示nokey。

2.2 升级

rpm {-U|--upgrade}  [install-options]  PACKAGE_FILE...
upgrade  # 安装有旧版程序包,则“升级”;若是不存在旧版程序包,则“安装”
rpm {-F|--freshen}  [install-options]  PACKAGE_FILE...
freshen  # 安装有旧版程序包,则“升级”;若是不存在旧版程序包,则不执行升级操做
rpm -Uvh PACKAGE_FILE ...
rpm -Fvh PACKAGE_FILE ...

--oldpackage:降级
--force: 强制安装

注意:

(1) 不要对内核作升级操做;Linux支持多内核版本并存,所以,对直接安装新版本内核;

(2) 若是原程序包的配置文件安装后曾被修改,升级时,新版本的提供的同一个配置文件并不会直接覆盖老版本的配置文件,而把新版本的文件重命名(FILENAME.rpmnew)后保留。

2.3查询

rpm {-q|--query} [select-options] [query-options]
[select-options]
    -a: 全部包
    -f: 查看指定的文件由哪一个程序包安装生成
    -p rpmfile:针对还没有安装的程序包文件作查询操做
    --whatprovides CAPABILITY:查询指定的CAPABILITY由哪一个包所提供
    --whatrequires CAPABILITY:查询指定的CAPABILITY被哪一个包所依赖

[query-options]
    --changelog:查询rpm包的changelog
    -c: 查询程序的配置文件
    -d: 查询程序的文档
    -i: information
    -l: 查看指定的程序包安装后生成的全部文件
    --scripts:程序包自带的脚本
    --provides: 列出指定程序包所提供的CAPABILITY
    -R: 查询指定的程序包所依赖的CAPABILITY

rpm2cpio 包文件|cpio –itv 预览包内文件
rpm2cpio 包文件|cpio –id “*.conf” 释放包内文件

2.4 卸载

rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...

注意:因为咱们在安装程序包是会同时安装许多依赖文件,而这种卸载方法只是卸载程序自己,并不一样时将依赖文件卸载,因此要想完整卸载的话须要用yum

yum history  # 查看历史记录,找到是第几部的操做
yum  history undo #    # 表示对历史操做中的第#想进行反操做

2.5 包校验

rpm {-V|--verify} [select-options] [verify-options]
# option
    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 -K|checksig rpmfile 检查包的完整性和签名
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
CentOS 7发行版光盘提供:RPM-GPG-KEY-CentOS-7
rpm -qa “gpg-pubkey*”

3、yum

yum工具经过仓库的方式简化rpm包的管理。它从仓库中搜索相关的软件包,并自动下载和解决软件包的依赖性,很是方便。yum底层依赖rpm,若是把rpm卸载,那么yum也不能用了。

老王说:
利用yum的主要问题:
(1)配置文件格式语法错误;
(2)缓存问题

yum客户端配置文件:

/etc/yum.conf  # 为全部仓库提供公共配置
/etc/yum.repos.d/*.repo  # 为仓库的指向提供配置

[root@CentOS7 ~]#cat /etc/yum.conf 
[main]  
cachedir=/var/cache/yum/$basearch/$releasever  # 缓存文件夹路径
    $$basearch   # cpu架构,X86_64等
    $releasever  # 系统版本
keepcache=0   # 0表明不缓存rpm包,下载安装后默认删除;1为缓存rpm安装包
debuglevel=2  #
logfile=/var/log/yum.log   # yum安装的日志文件
exactarch=1   # 
obsoletes=1
gpgcheck=1    # 默认1表明安装包的完整性合法性为nokey是直接拒绝安装
plugins=1
installonly_limit=5
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=23&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release


# PUT YOUR REPOS HERE OR IN separate files named file.repo
# in /etc/yum.repos.d

本身搭建一个yum配置文件

vim /etc/yum.repo.d/base.repo    # 两个必须:1必须在/etc/yum.repo.d/这个文件夹下;2.文件名必须以.repo结尾;通常习惯将光盘建的yum库命名为base

[base]  # 不容许有空格
name=cdrom
baseurl=file:///mnt/cdrom/ # 通常是repodata的父目录,文件路径不容许有空格,支持http://  https:// ftp://  file://
    # 此地址能够添加多个地址,在多个地址的状况下,能够将所有地址保存在一个文本文件中,而此处的baseuer换成 mirrorlist=file:// 文件路径
    
gpgcheck=0  # 0默认为不进行gpgcheck检查完整性
以上这些是必须项,
-----------------------------------------------------
还能够添加:
gpgkey=file:///mnt/cdrom/RPM-GPG-KEY-CentOS-7  # 直接将光盘中的公钥导入,也能够换成
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7   # 直接导入配置文件中的公钥;此项不加的话,gpgcheck=0;

enabled=0 # 默认为1,0为临时禁用该仓库

failovermethod={roundrobin|priority}  # 这个是在baseurl包含多个地址的状况下使用
    roundrobin # 意为随机挑选,默认值
    priority  # 按顺序访问

cost=1000  # 存在多个仓库的状况下,越少优先值越高

也能够经过命令直接生成该配置文件:

yum-config-manager  --add-repo=BASEURL   # 即自动生成该网址的repo配置文件 
yum-config-manager --disable “仓库名"  # 禁用仓库
yum-config-manager --enable “仓库名”  # 启用仓库

搭建完yum配置文件便可使用yum安装了。

[aliyunepel]
name=aliyun-epel
baseurl=https://mirrors.aliyun.com/epel/7/x86_64/
gpgcheck=0
# 这样就又搭建了一个阿里云的epel的yum库

yum的其余一些命令

yum install  PACKAGES    # yum安装程序包
yum reinstall package1 [package2] [...]  # 从新安装
yum remove  PACKAGES   # yum卸载程序包
yum remove | erase package1 [package2] [...]

yum repolist  # 可查看搭建的yum库有多少个安装包。
yum repolist all  # 显示全部的仓库状况
yum clean  # 清除yum缓存
cat  /var/log/yum.log  # 查看yum安装报的日志文件,包括安装、卸载、更新等
yum list  # 显示全部库中全部的包,前带@说明已经安装
yum list *ftp*  # 支持文件名通配符,列出包含ftp的程序包
yum list [all | glob_exp1] [glob_exp2] [...]  # 列出包,支持文件名通配符
yum list {available|installed|updates} [glob_exp1] # 列出可用的、可安装的、能升级的

yum update [package1] [package2] [...]  # 升级,通常不建议升级
yum downgrade package1 [package2] [...]  # 降级

yum check-update  # 检查可用升级

yum info [...]  # 查询包信息

yum provides | whatprovides feature1 [feature2] # 查看指定的特性(能够是某文件)是由哪一个程序包所提供

yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]  # 清除/var/cache/yum/$basearch/$releasever缓存,清楚类型指定,all为全部

yum makecache  # 构建缓存

yum search string1 [string2] [...]    # 以指定的关键字搜索程序包名及summary信息

yum deplist package1 [package2] [...]   # 查看指定包所依赖的capabilities

Alt text
如图所示,两个yum库分别有多少个包均有显示

注意:yum不容许同时在多个终端同时安装

yum的repo配置文件中可用的变量:
$releasever: 当前OS的发行版的主版本号
$arch: 平台,i386,i486,i586,x86_64等
$basearch:基础平台;i386, x86_64
$YUM0-$YUM9:自定义变量

好比:
实例:(针对不一样版本的系统)
http://server/centos/$releasever/$basearch/
http://server/centos/7/x86_64
http://server/centos/6/i384

对于repo文件咱们也能够参考阿里云,
http://mirrors.aliyun.com/repo/
将其的配置格式直接做为咱们本身的配置。
可经过:
wget url....下载配置文件至当前目录

查看yum历史事务:

yum  history  [info|list| packages-list| packages-info| summary | addon-info | redo | undo | rollback | new|sync| stats]

yum history   # 查看历史记录
yum history info 6  # 查看yum历史记录第六条的详细信息  
yum history undo 6  # 反向操做yum历史记录第六条的操做

利用yum安装rpg包:

yum install  rpmfile1  [rpmfile2] [...]  # 
yum update rpmfile1 [rpmfile2] [...]

利用yum安装包组

yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]

yum grouplist  # 查看包组列表

yum的一些命令选项:

yum的命令行选项:
    --nogpgcheck:禁止进行gpg check
    -y: 自动回答为“yes”
    -q:静默模式
        yum -y -q :须要分开写
    --disablerepo=repoidglob:临时禁用此处指定的repo,repo配置文件中[]中的名字
    --enablerepo=repoidglob:临时启用此处指定的repo
    --noplugins:禁用全部插件

补充:

systemctl  stop  firewalld   # 关闭防火墙
systemctl disable firewalld   # 关闭开机自动启动防火墙

4、实验

实验1:

当知道是哪一个库文件被删除(以删除/lib64/libc.so.6这个库文件为例),致使没法使用命令或系统不能使用时,这么修复:(以CentOS 7为例)
第一步:重启,从光盘开机,有的系统是开机f2修改,有的是f12,还有的是Esc键;
第二步:进入此界面,选择第三项Troubleshooting进入

再选择第二项rescure centos system ,进入救援模式;

再选择第一项continue进入bash shell界面。

经过df命令能够看到,根目录已经变成/mnt/sysimage;因此,咱们在cp丢失的文件时要使用相对路径。

!!注意:libc.so.6 这个文件是个软连接,也就是说咱们实验时cp到data目录下的库文件是个软连接,并非真正的库文件,因此这样的话咱们再从新建立个软连接便可。

ln -s libc-2.17.so libc.so.6
(注意,此处要切换至/mnt/sysimage/lib64下,使用相对路径进行建立软连接)

重启,正常!(注意,将从光盘启动改回从硬盘启动)

实验2:

像centos6那样,能够直接依靠/misc/cd 打开光盘文件
第一步:yum install autufs这个包
第二步:systemctl start autofs 打开autofs服务
(注意:centos特有的,能够经过rpm -ql autofs 查看到其有个服务文件,因此须要命令打开它)

第三步:再经过systemctl enable autofs命令让其开机自动启动服务
此时,centos7 也能够经过 cd /misc/cd 切换至光盘

实验3:

用centos7的安装光盘为centos6的客户机搭建一个yum库
第一步:安装并开启httpd

yum install httpd      # 安装httpd
systemctl  stop  firewalld   # 关闭防火墙
systemctl disable  filewalld   # 关闭自动启动防火墙

打开浏览器,在地址栏输入ip地址,看是否能够链接,如图所示已经链接成功

第二步:

cd   /var/www/html/  # 切换至该文件夹
mkdir  -p  epel/{6,7}/x86_64/       # 模仿阿里云的epel网址格式分别建立6和7两个文件夹

第三步:挂载光盘

mount   /dev/sr0   /var/www/html/epel/7/x86_64/     # 挂载硬盘至指定目录,若是是想在centos7上使用这个库就用7的文件夹
mount   /dev/sr0   /var/www/html/epel/6/x86_64/     # 若是是想在centos6上使用这个库就用6的文件夹

如图所示,已经能够在浏览器中查看到咱们挂载的光盘的内容

第四步:后面的就修改 /etc/yum.con.d/ 下的配置文件按正常操做便可。

相关文章
相关标签/搜索