CentOS包管理

包安装、管理的一般方法,介绍rpm、yum、源码编译的常见选项方法

包的分类

centos中包可以分为源码和二进制包以及rpm安装包。

源码一般为tar.gz格式,需要对其进行重新编译链接,比如httpd之类,使用源码编译可以指定模块。

二进制包则是已经编译之后的包,由二进制文档、库文档、配置文档、帮助文档组成。解压之后配置以下就可以使用,省略了编译的过程,比如mariadb一般使用二进制包比较方便

rpm包则直接使用rpm工具安装即可,但是需要解决安装过程中的依赖关系。

包命名

源代码命名方式

命名组成:name-version.tar.gz

版本version组成: major.minor.release

rpm包命名方式

rpm包名:name-VERSION-release-arch.rpm

Example:

zsh-5.0.2-28.el7.x86_64.rpm
包名-版本号-软件发布次数(28).el7(rhel7).arch.rpm
VERSION:主版本号.次版本号

包的分类和拆包

1
2
3
4
5
6
7
8
9
10




# devel 头文档包
[[email protected] ~]$ ls /mnt/Packages/ | grep "^httpd"
httpd-2.4.6-67.el7.centos.x86_64.rpm
httpd-devel-2.4.6-67.el7.centos.x86_64.rpm
httpd-manual-2.4.6-67.el7.centos.noarch.rpm
httpd-tools-2.4.6-67.el7.centos.x86_64.rpm

RPM包管理器

功能

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

组成

RPM包内的文档

RPM包的元数据:名称,版本,依赖,描述
安装或者卸载时运行的脚本,某些包中存在

元数据数据库为/var/lib/rpm,安装完成之后会将以下数据存放在该数据库中,建议经常备份,破坏之后难以恢复

  • 进程包名称及版本
  • 依赖关系
  • 功能说明
  • 包安装后生成的各文档路径及校验码信息

进程包的来源

管理进程包的方式

包管理器 rpm
前端工具 yum dnf

获取进程包的途径

  • redhat官方网站
  • 该进程官网
  • 第三方组织
    • fedora-epel 额外扩展
    • rpmforge
  • 搜索引擎
  • 自己制作

rpm包管理

安装、卸载、升级、查询、校验、数据库维护

安装

OPTION:

-i PATH(路径名):安装
-v 显示详细信息
-h 以#显示进程包管理执行进度

--test 测试安装
--nodeps 忽略依赖关系安装,先安装再解决依赖关系
--replacepkgs|replacefiles 删除某些文档之后导致无法重新安装该进程,使用此选项可以重新安装|覆盖文档,两个包有相同的文档,导致另一个包无法安装,加上这个选项使得新文档覆盖前一个文档
--nosignature:不检查包签名,包签名和包完整性不是一种东西,在包最后追加空行仅会破坏其完整性,并不一定会破坏签名
--nodigest 不检查包完整性
--noscripts 不执行进程包脚本
    %pre:安装前脚本
    %post:安装后脚本
    %preun:卸载前脚本
    %postun:卸载后脚本

脚本中直接只用-i即可,不用配合显示其他信息

卸载

-e 包名:卸载
    --allmatches 卸载所有版本
    --nodeps 不管依赖
    --noscripts 不执行卸载脚本
    --notriggers 不执行触发器
    --test 测试卸载

升级

OPTION

upgrade,-U 有旧版就升级 没旧版本就安装
freshen,-F 有旧版就升级,没旧版本不操作
--oldpackage 安装旧版本
--force 强制安装

升级会导致原有软件旧版本被覆盖,所以升级内核不要使用这两个命令,用ivh重新安装比较好,因为内核可以并存,启动时选择内核版本,而一般软件有的无法并存

rpm -Uvh PACKAGE
rpm -Fvh PACKAGE

查询

OPTION

-q 查询包名,不是文档名,包名必须准确无误,如rpm -q tree
-qa 查看所有包
-qf 查询某文档由哪个包生成的
-qp 后面跟文档名,不是包名
--whatprovides CAPABLITY查询指定CAPABLITY由哪个包所提供
--whatrequires CAPABLITY 查询指定的CAPABLITY被哪个包所依赖,某个包是其他的包的依赖
rpm2cpio rpm转成cpio格式 | cpio -itv预览包内文档
                        cpio -idv 解包
                        这种恢复方式可能造成权属性错误,所有者和所属组有问题造成无法运行
--changelog 更新了哪些版本
-qc 查询进程的配置文档
-qd 查询进程的文档
-qi information包的说明信息
-ql 查看指定的进程包安装后生成的所有文档
--scripts,进程包自带的脚本
--provides 列出CAPABLITY
-qR 查询指定进程包所依赖的CAPABLITY

校验

首先必须导入KEY,在光盘的根目录下,** RPM-GPG-KEY-CentOS-6**,使用命令rpm --import RPM-GPG-KEY-CentOS-6进行导入

-V 安装后查看是否变化,如`touch /bin/bash`后T代表mtime变化
-a 查询所有已安装的包是否有问题
-K 安装前检查是否被修改
要先导入RPM-GPG-KEY-Centos-7

S 文档大小
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.lib/rpm

--initdb 初始化,没有数据就新建,有就不做操作
--rebuilddb 重建已安装的包头的数据库索引目录

yum

yum解决了包的依赖性问题(yellowdog update modifier)

工作原理基于C(ustom)S(erver)结构,包都放在yum服务器上,服务器上存放rpm包和包的元数据,客户安装前需要配置一个文档,文档中写清楚了配置,然后S端将服务器metadata传递给C端,C端请求rpm包及其依赖下载到自己的电脑,安装之后默认将其删除

如果有多个镜像站点,本地会缓存多份元数据

文档服务器可以使用http://https://ftp://file://

yum客户端配置文档

全局配置

/etc/yum.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
[[email protected] ~]$ cat /etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever #缓存路径
keepcache=0 #1代表下载下来的rpm包会缓存,不会删除
debuglevel=2 # 调试
logfile=/var/log/yum.log #yum安装日志文档
exactarch=1
obsoletes=1
gpgcheck=1 #校验不通过禁止安装,0代表不通过也可以安装
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

个人配置

个人包配置放在/etc/yum.repos.d下,命名为file.repo,后缀必须为repo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[14:18:48 [email protected] cd]$ vim base.repo
[base] #repoid 仓库名字,不重要,一般使用单词,不要有空格
name=base #再次定义仓库名字
baseurl=file:///mnt/cdrom #支持http https ftp以及file://本机路径,后面的斜线代表根目录
gpgcheck=0 #是否检查

enabled=0 #可选 0表示禁用仓库
gpgcheck=0 #可选,0表示不检查
gpgkey=URL #可选,URL为公钥地址
enablegroups=0 #可选,0为
failovermethod={roundrobin|priority} #一个仓库可以允许多个路径baseurl
roundrobin:意为随机挑选,默认值
priority:按顺序访问
cost=1000 #默认为1000,越小优先级越高
#如果baseurl为mirrorlist,则mirrotlist值为文档,文档中每一行为一个仓库地址
#设置之后要清除缓存yum clean all清除所有缓存

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

$releasever: 当前OS的发行版的主版本号
$arch: 平台,i386,i486,i586,x86_64等
$basearch:基础平台;i386, x86_64
$YUM0-$YUM9:自定义变量
http://server/centos/$releasever/$basearch/

yum命令

Usage:yum [options] [command] [package ...]

yum repolist [all|enabled|disabled]显示仓库列表[全部|启用的仓库|禁用的仓库]
yum list 列出所有的包
yum list [all | glob_exp1] [glob_exp2] [...] 后面可以跟glob
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] [...]

查看进程包information:
    yum info [...]

查看指定的特性(可以是某文档)是由哪个进程包所提供:
    yum provides | whatprovides feature1 [feature2] [...]

清理本地缓存:清除/var/cache/yum/$basearch/$releasever缓存
yum clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

构建缓存:
    yum makecache

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

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

查看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 history undo 6

日志 :/var/log/yum.log

安装及升级本地进程包:
yum localinstall rpmfile1 [rpmfile2] [...]
(用install替代)
yum localupdate rpmfile1 [rpmfile2] [...]
(用update替代)

包组管理的相关命令:
yum groupinstall group1 [group2] [...]
yum groupupdate group1 [group2] [...]
yum grouplist [hidden] [groupwildcard] [...]
yum groupremove group1 [group2] [...]
yum groupinfo group1 [...]

yum的命令行选项:
    --nogpgcheck:禁止进行gpg check
    -y: 自动回答为“yes”
    -q:静默模式
    --disablerepo=repoidglob:临时禁用此处指定的repo
    --enablerepo=repoidglob:临时启用此处指定的repo
    --noplugins:禁用所有插件

yum-config-manager

--add-repo=PATH 直接添加源
--disable “仓库名" 禁用仓库
--enable “仓库名” 启用仓库

源码编译安装

编译安装流程:源代码–>预处理–>编译–>汇编–>链接–>执行

源代码组织格式:

  • 多文档:文档和代码之间存在跨文档依赖关系
  • C或者C++语言:make项目管理器 configure脚本(配置安装路径,装在哪,启用哪些功能)–>makefile.in–>makefile(文档)
  • java:maven工具

编译安装

  1. ./configure
    1. 通过选项传递参数,指定启用特性,安装路径等,执行时参考用户指定以及makefile.in文档生成Makefile文档
    2. 检查依赖的外部环境,构建依赖的软件包。如果某些没安装就使用rpm或者yum进行安装
    3. 进入解压缩的文档夹
    4. 查看帮助手册README
    5. 使用–help获取支持的选项,如–prefix=/PATH配置安装路径,–sysconfdir=/PATH指定配置文档安装位置
    6. 运行./configure –OPTIONFEATURES
  2. make 根据makefile文档,构建应用进程
    1. make -j 4 && echo -e “a” && sleep 1 && echo -e “a” 使用多核编译,完成之后响铃
  3. make install 复制文档到相应路径
  4. 二进制进程目录导入PATH环境变量,编辑文档/etc/profile.d/NAME.sh 并追加文档路径到$PATH前
  5. 导入库文档路径,编辑/etc/ld.so.conf.d/NAME.conf添加新的库所在目录到此文档夹,并重新生成缓存ldconfig
  6. 导入头文档,使用你软链接实现
  7. 导入帮助手册,编辑/etc/man.config|man_db.conf文档添加MANPATH

开发工具

如果没有configure脚本或者automake脚本

autoconf 生成configure脚本
automake 生成Makefile.in