rpm,yum,编译安装应用详解 (Blog 5)

rpm, yum, 编译安装全解

概述

硬件发展历史:电子管、晶体管、集成电路、大规模集成电路

电子管时代
ENIARC, 上个世纪30-40年代, 遵循冯 诺伊曼体系;
计算机五大部件:控制器、运算器、存储器、输入设备、输出设备
CPU的核心:控制器、运算器;其指令的集合”指令集”
存储器:内存;主储;手机上叫”运行内存”
输入设备:输入指令;提供数据;
输出设备:输出数据加工后的结果;

4

面临的问题:
1、硬件提供的接口:过于底层,后来硬件厂商出厂时在CPU上附加了微码编程语言;用字符代表机器二进制指令;
2、面向硬件写程序;除了程序自身的代码额外需要提供驱动硬件的的代码;
3、写程序面向汇编语言过于底层:需要一个更接近人类,更易懂的语言;

操作系统历史:
早期”单任务系统”:穿孔纸带–>磁带;问题:1、人工输入,并记录输出结果;2、CPU比内存快浪费CPU性能;
多任务系统:
监控系统:虚拟CPU时间;虚拟内存空间;以提供一个良好的创业环境;保证每一个程序稳定的运行;
GE, MIT, Bell成立Multics项目:可以最大压榨CPU性能,让某时刻硬件上可运行多个程序
unix到BSD的爱恨纠葛…情杀故事
unix开始收费:

1985年,MIT的Ricth Stallman,是一个极左的人,认为软件是全人类的优秀工程师的结晶,不应该被某个商业组织所独占;就成立了GNU组织,当时有许多黑客比较肯定他的做法,都加入了这个组织;其宣言是GPL(Freedom);为了保证软件的开源性就制定了一个约定:任何使用GPL代码的程序,自己必须遵循GPL协定;
GNU组织提供了许多开源程序:gcc(gnu c complier), vi(visual interface)
* 黑客:在某个有领域有深入研究,并取得成功的人;并非是以破坏为目的的,那叫”crack boy”
1969年,8月;Linus Torvalds成立Linux项目,i386主机上实现,加入GPL组织;

操作系统:GNU/Linux:都是源代码;文本格式;

源代码:需要编译成二进制的程序方可运行;当然普通人没有这个能力;一些世俗的入流的看到编译为二进制程序的商机的组织将这些源码拼凑在一起成为一个发行版;不同GNU程序版本和Linux内核版本组织有不同的发行版本

发行版版本:由GNU程序和kernel内核组织,彼此间没有任何联系;

操作系统的功用
驱动硬件、输出简洁的接口、根文件系统、网络功能、进程管理、内存管理、安全加密

系统组成
库调用:libcall,对系统调用的二次封装;用更多的库调用接口供程序员使用;
系统调用:syscall,内核中抽象出的接口,为保证通用性,也比较底层;
kernel:类似于中间层;抽象底层硬件接口为统一的中间层输出简洁接口;
硬件:计算机得以计算的基础保证;

写程序面向接口:
API:Application Program Interface
libcall:标准C库
POSIX: 兼容libcall(C库), 可跨平台编译;
syscall
ABI: Application Binary Interface
libcall: 运行库
syscall: 运行库
源码编译为对应平台可执行的二进制程序格式
遵循POSIX规范的源码:只有在Unix-like主机上才可以在编译后跨平台运行;
UNIX-Like: HP-UX, AIX, Solaris

5

程序格式:
windows: EXE –> dll库
Linux: ELF –> .so库

不同格式的程序如果在windows和Linux主机间跨平台运行?
库虚拟化!
在Linux上提供wine;可以虚拟出windows程序运行所依赖的运行库;
windows上提供cywin:可以虚拟出linux程序运行环境;

libcall和syscall都是高级语言:
高级语言的分类:
系统级高级语言:C, C++ …;开发操作系统;性能要求高的应用
应用级高级语言:java, python, perl, ruby …;性能要求不高的应用;

写出的程序是文本格式的源码,源码如何转换为对应CPU可执行的指令?
C源码 –> 预处理 –> 编译(gcc) –> 汇编 –> 链接 –> 二进制程序
java/python源码在其虚拟机上运行;(jvm, pvm)虚拟机由C/C++所写的程序;

源码是分割成几个部分,目的方便编译;
如果程序有BUG编译过程中出现,需要重新编译所有源码;但只要拆分源码,各自独立编译,有BUG只修改部分、编译部分源码;

在编译过程序中可能不同源码片段间有依赖关系,这意味着要能编译首先你必需可以读源码;知道依赖关系才知道谁先编译谁后编译;这大多数情况下是不可能的;所以有了项目构建工具:自动实现源码依赖关系分析,自动调用编译器完成编译操作;

项目构建工具:
C/C++: make
java: maven
由项目构建工具根据一些配置文件就可以抹平中间所有复杂环节,直接可以将源码编译为对应平台可运行二进制程序格式;

操作系统
GNU/Linux都是源码;编译为二进制程序拼凑在一起就是一个完整的操作系统;

二进制程序的四大组成部分
二进制程序:可运行 /bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
配置文件:文本格式 /etc
库:二次开发 /lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
帮助手册:程序的使用姿式;买个杯子,装水不用说明书;买个智能洗衣机就需要了;/usr/share/man/man[0-9], /usr/share/doc/application-version

二进制程序的版本
GNU提供的程序: gcc, vi, x-windows …
major.minor.release
major: 主干变化;
minor: 分支变化;
release: 打补丁或修复BUG;

如何安装二进制程序
早期:将二进制程序的四大组成部分放在不同的的目录路径下;这样很不方便;就有需求能自动实现将这些程序的组成部分自动展开至不同的目录;于是就有了包管理器;将程序组成部分打包成一个包;不同发行版的包名及对应管理器不同;

三大主流发行版的包名及管理器;
Redhat: rpm包; rpm
Debian: deb包:dpkg
Slackware: rpm包;rpm
注意:rpm是事实上的工业标准

二进制程序包的命名:
name-VERSION.release.arch.rpm
VERSION: major.minor.release
release: release.os
release: 发行版的主版本号
os: 操作系统平台
arch: 硬件平台:i386, i486, i586, i686, x86_64, amd64, noarch(用应用级高级语言所写的程序;只要有虚拟机即可运行:write once, run anywhere)

源码在编译为二进制程序后有诸多功能,对于一个桌面终端用户来讲有些功能是不必要的;为了避免浪费空间,安装不需要的功能;于是将这些程序分别打包成几个提供不同功能的包;

程序包的分类
主包:与程序包名相同;name-VERSION-release.arch.rpm
支包:name-functions-VERSION-release.arch.rpm (functions: 功能,例如:utils, libs, devel)

程序包管理器的功能:
1、打包程序四个组成部分为一个或几个包;
2、安装:展开至指定目录下;
3、卸载:删除安装生成及程序运行生成的文件;
4、查询、校验、数据库重建

多个支包间安装时可能包间有依赖关系;有时安装一个程序包其依赖的包手动安装完需要消耗大量的时,则有一种需求:可以自动解决依赖关系完成自动安装的程序–>包管理器的前端工具:

包管理器前端工具:自动解决后端管理器的诸多不便之处,自动解决依赖,完成安装被依赖的程序包;
Redhat: rpm包; rpm, yum
Debian: deb包:dpkg,apt-get
Slackware: rpm包;rpm,zypper
Archlinux: ports

对于一个从来没有接触过Linux的人来说,一开始就编译安装;你会吓哭的!所以以下先完成 后端管理器(rpm) –> 前端管理器(yum) –> 编译安装;

获取rpm包:
(1) OS vender提供或镜像服务器;
http://mirrors.aliyun.com
http://mirrors.sohu.com
http://mirros.163.com
华中科医大:http://mirrors.hust.edu.cn
(2) 程序官方
(3) 可信组织:EPEL;

一、rpm命令:

GENERAL OPTIONS
-v: verbose 详细信息;
-vv: verbose^2 更详细过程输出;
-h,–hash:以哈希标识符(hash marks:#)输出进度条;单个#表示2%进度;

-v: verbose 详细信息;
Packages]# rpm -i zsh-5.0.2-7.el7.x86_64.rpm
[root@localhost Packages]# rpm -ev zsh
软件包准备中…
zsh-5.0.2-7.el7.x86_64
-vv: verbose^2 更详细过程输出;
Packages]# rpm -ivv zsh-5.0.2-7.el7.x86_64.rpm
-h,–hash:以哈希标识符(hash marks:#)输出进度条;单个#表示2%进度;
Packages]# rpm -evh zsh
准备中… ################################# [100%]
正在清理/删除…
1:zsh-5.0.2-7.el7 ################################# [100%]

安装:rpm [OPTION] -ivh PACKAGE_FILE
[install-options]
–replacepkgs: 替代原来的包,重新安装;但不能替换配置文件;
–test: potential conflicts. 不安装,报告潜在的冲突(依赖关系);
–nodeps:忽略依赖关系;不建议;假如依赖其文档包,可以忽略;
–noscripts:安装时不执行脚本;
rpm可以自带脚本4类:
preinstall:安装过程开始之前运行的脚本; %pre, –nopre
postinstall: 安装过程完成之后运行的脚本;%post, –nopost
preuninstall: 卸载过程真正开始执行之前运行的脚本;%preun, –nopreun
postuninstall: 卸载过程完成之后运行的脚本;%postun, –nopost
–nosignature:不检查来源合法性;
–nodigest: 不检查包完整性;

安装后重新安装程序包;
[root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm
准备中… ################################# [100%]
软件包 zsh-5.0.2-7.el7.x86_64 已经安装
[root@localhost Packages]# rpm –replace -ivh zsh-5.0.2-7.el7.x86_64.rpm
rpm: –replace: 未知的选项
[root@localhost Packages]# rpm –replacepkgs -ivh zsh-5.0.2-7.el7.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7 ################################# [100%]

测试安装程序包:确定依赖关系;
[root@localhost Packages]# rpm –test -ivh pacemaker-libs-1.1.12-22.el7.x86_64.rpm
错误:依赖检测失败:
libcorosync_common.so.4()(64bit) 被 pacemaker-libs-1.1.12-22.el7.x86_64 需要
libqb.so.0()(64bit) 被 pacemaker-libs-1.1.12-22.el7.x86_64 需要

忽略依赖安装;
[root@localhost Packages]# rpm –test –nodeps -ivh pacemaker-libs-1.1.12-22.el7.x86_64.rpm
准备中… ################################# [100%]
[root@localhost Packages]# rpm –nodeps -ivh pacemaker-libs-1.1.12-22.el7.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:pacemaker-libs-1.1.12-22.el7 ################################# [100%]

安装zsh不执行脚本:注意:默认安装在/etc/shells文件中生成了/bin/zsh,忽略脚本后没有生成;查看脚本方式:在下面查询命令中;
[root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost Packages]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
/bin/zsh
[root@localhost Packages]# rpm -e zsh
[root@localhost Packages]# rpm –noscripts -ivh zsh-5.0.2-7.el7.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost Packages]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@localhos

不检查来源合法性:
[root@localhost Packages]# rpm –test -ivh xz-5.2.2-1.el7.x86_64.rpm
warning: xz-5.2.2-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY <— 请注意:表示来源合法性不通过;
Preparing… ################################# [100%]
package xz-5.2.2-1.el7.x86_64 is already installed
[root@localhost Packages]# rpm –test –nosignature -ivh xz-5.2.2-1.el7.x86_64.rpm <— 不再检查
Preparing… ################################# [100%]
package xz-5.2.2-1.el7.x86_64 is already installed

不检查完整性:由上可知不检查来源合法性就不会有任何警告;

升级:rpm [OPTION] -[UF]vh PACKAGE_FILE
U:升级或安装;升级失败就安装;
F: 仅升级;
–oldpackage: 降级:将新版本程序包降级;
–force:强制升级;
–nodeps:忽略依赖关系;
–test:
注意:
4.0前内核升级后需要重启,所有不建议升级;新版内核安装即可;
升级前程序包的配置如果变化,升级后原配置文件会保留;新版本的程序重命名为: .rpmnew

获取程序包:
[root@localhost ~]# rpm -q zsh 查看当前安装的版本
zsh-5.0.2-7.el7.x86_64
[root@localhost ~]# ls -l zsh-5.0.2-7.el7_1.2.x86_64.rpm 获取的版本
-rw-r–r– 1 root root 2489616 11月 15 20:44 zsh-5.0.2-7.el7_1.2.x86_64.rpm

-F选项只能升级;
[root@localhost ~]# rpm -e zsh (挂载包)
[root@localhost ~]# rpm -Fvh zsh-5.0.2-7.el7_1.2.x86_64.rpm
[root@localhost ~]# rpm -q zsh
未安装软件包 zsh

安装旧版本,升级新版本
[root@localhost Packages]# rpm -ivh zsh-5.0.2-7.el7.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost Packages]# cd
[root@localhost ~]# rpm -Fvh zsh-5.0.2-7.el7_1.2.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7_1.2 ################################# [ 50%]
正在清理/删除…
2:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost ~]# rpm -q zsh
zsh-5.0.2-7.el7_1.2.x86_64

-U可安装,可升级:
[root@localhost ~]# rpm -e zsh
[root@localhost Packages]# rpm -Uvh zsh-5.0.2-7.el7.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost Packages]# rpm -q zsh
zsh-5.0.2-7.el7.x86_64

可升级
[root@localhost ~]# rpm -Uvh zsh-5.0.2-7.el7_1.2.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7_1.2 ################################# [ 50%]
正在清理/删除…
2:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost ~]# rpm -q zsh
zsh-5.0.2-7.el7_1.2.x86_64

–oldpackage 降级:仅适用于-U
[root@localhost Packages]# rpm -q zsh
zsh-5.0.2-7.el7_1.2.x86_64
[root@localhost Packages]# rpm –oldpackage -Fvh zsh-5.0.2-7.el7.x86_64.rpm
[root@localhost Packages]# rpm -q zsh
zsh-5.0.2-7.el7_1.2.x86_64
[root@localhost Packages]# rpm –oldpackage -Uvh zsh-5.0.2-7.el7.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7 ################################# [ 50%]
正在清理/删除…
2:zsh-5.0.2-7.el7_1.2 ################################# [100%]
[root@localhost Packages]# rpm -q zsh
zsh-5.0.2-7.el7.x86_64

如果原配置改变;升级后,新版本配置文件会保留为.rpmsave,仍使用旧版本配置;
[root@localhost Packages]# rpm -q zsh
zsh-5.0.2-7.el7.x86_64
[root@localhost Packages]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost Packages]# echo “123” >> /etc/zshenv <– 升级前
[root@localhost Packages]# cd
[root@localhost ~]# rpm -Fvh zsh-5.0.2-7.el7_1.2.x86_64.rpm
准备中… ################################# [100%]
正在升级/安装…
1:zsh-5.0.2-7.el7_1.2 ################################# [ 50%]
正在清理/删除…
2:zsh-5.0.2-7.el7 ################################# [100%]
[root@localhost ~]# ls /etc/zshenv*
/etc/zshenv /etc/zshenv.rpmsave
[root@localhost ~]# tail -2 /etc/zshenv.rpmsave <– 新版配置文件;
#

[root@localhost ~]# tail -2 /etc/zshenv <– 升级后,原配置文件;

123

卸载:rpm {-e|–erase} [–allmatches] [–nodeps] [–noscripts] [–notriggers] [–test] PACKAGE_NAME …
PACKAGE_NAME:包的简短名;
–allmatches:卸载指定程序包的各版本;
–nodeps:忽略依赖关系;
–test:dry run模式
注意:卸载前配置有如果变化,卸载后配置文件会保留,并重命名为:.rpmsave

使用示例:
原配置文件改变过,卸载时配置文件会保留为.rpmsave文件名;
[root@localhost ~]# rpm -q zsh
zsh-5.0.2-7.el7_1.2.x86_64
[root@localhost ~]# rpm -e zsh
警告:/etc/zshenv 已另存为 /etc/zshenv.rpmsave
[root@localhost ~]# ls /etc/zshenv*
/etc/zshenv.rpmsave
[root@localhost ~]# cat /etc/zshenv.rpmsave
#
# /etc/zshenv is sourced on all invocations of the
# shell, unless the -f option is set. It should
# contain commands to set the command search path,
# plus other important environment variables.
# .zshenv should not contain commands that produce
# output or assume the shell is attached to a tty.
#

123

忽略依赖删除:
[root@localhost ~]# rpm -e gcc <– 先删除被依赖的包,才能删除自己; gcc-c++ 依赖gcc, gcc被gcc-c++依赖;
error: Failed dependencies:
gcc = 4.8.3-9.el7 is needed by (installed) libquadmath-devel-4.8.3-9.el7.x86_64
gcc is needed by (installed) systemtap-devel-2.6-8.el7.x86_64
gcc = 4.8.3-9.el7 is needed by (installed) gcc-c++-4.8.3-9.el7.x86_64
gcc = 4.8.3-9.el7 is needed by (installed) gcc-gfortran-4.8.3-9.el7.x86_64
[root@localhost ~]# rpm –nodeps -e gcc
[root@localhost ~]# rpm -q gcc
package gcc is not installed

查询:rpm -q [查询程序包 | 查询包内信息 ] PACKAGE_NAME
默认查询已经安装过的程序包;-p选项:可以改变默认,查询未安装的程序包;PACKAGE_NAME必须是完整包名:PACKAGE_FILE
查询程序包:
-a 查询所有已经安装过的程序包列表;
-f /PATH/TO/SOMEFILE 查询此文件由哪个程序包生成;
-g, –group GROUP 查询GROUP内的包;
–whatprovides CAPABILITY 查询CAPABILITY( 特性 )由哪个程序包提供; (特性:是程序包安装后生成的)
–whatrequires CAPABILITY 查询CAPABILITY被哪个程序包依赖;
查询程序包内信息:
–changelog 查询rpm包的 修改日志;
-l,–list 查询rpm包 生成的文件列表;
-i, information 查询rpm包的 information;
-c, –configfiles 查询rpm包生成的 配置文件;
-d, –docfiles 查询rpm包生成的 帮助文档
–provides 查询rpm包生成的 CAPABILITY;
–requires 查询rpm包依赖的 CAPABILITY;
–scripts 查询rpm包的 脚本;

查询安装的所有程序包:rpm -qa
查询指定文件由哪个包生成:[root@localhost ~]# rpm -q -f /etc/fstab
查询CAPABILITY( 特性 )由哪个程序包提供; (特性:是程序包安装后生成的):[root@localhost ~]# rpm -q –whatprovides bash
查询CAPABILITY被哪个程序包依赖;[root@localhost ~]# rpm -q –whatrequires bash
查询修改日志:[root@localhost ~]# rpm -q –changelog bash
查询生成的文件列表;[root@localhost ~]# rpm -q -l bash
查询information: [root@localhost ~]# rpm -q -i bash
查询configfile: [root@localhost ~]# rpm -q -c bash
查询帮助文档:[root@localhost ~]# rpm -q -d bash
查询生成的CAPABILITY: [root@localhost ~]# rpm -q –provides bash
查询依赖的CAPABILITY: [root@localhost ~]# rpm -q –requires bash
查询脚本:[root@localhost ~]# rpm -q –scripts bash
查询程序包被谁依赖:查看其提供的CAPABILITY被谁依赖:
[root@localhost ~]# rpm -q –provdes bash
[root@localhost ~]# rpm -q –whatprovides CAPABILITY

校验:
完整性:rpm -V PACKAGE_FILE
S file Size differs
M 权限
5 MD5值改变;
D 主次设备号
L readLink(2) 路径不匹配
U 属主
G 属组
T mTime 最近一次修改时间戳改变;
P CAPABILITY 改变;

安装后不修改
[root@localhost ~]# rpm -i zsh-5.0.2-7.el7_1.2.x86_64.rpm
[root@localhost ~]# rpm -V zsh
注意:没有返回值

安装后修改:
[root@localhost ~]# rpm -qc zsh
/etc/skel/.zshrc
/etc/zlogin
/etc/zlogout
/etc/zprofile
/etc/zshenv
/etc/zshrc
[root@localhost ~]# echo “123” >> /etc/zlogin
[root@localhost ~]# rpm -V zsh
S.5….T. c /etc/zlogin
[root@localhost ~]# useradd centos
useradd: user ‘centos’ already exists
[root@localhost ~]# chown centos.centos /etc/zlogout
[root@localhost ~]# rpm -V zsh
S.5….T. c /etc/zlogin
…..UG.. c /etc/zlogout

合法性:
导入信任的包制作者的公钥:# rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
手动验证单个文件
# rpm -K PACKAGE_FILE

校验: 校验包的数字签名:
数字签名: 用非对称加密的私钥加密对数据提供的指纹;
非对称加密: 加密算法一种;有公钥和私钥:用公钥加密只能用与之配对的私钥解密;公钥可以公开,私钥不能公开;
数据指纹提取: 单向加密可以完成数据指纹提供;

包的提供方:
1、保证数据完整性:单向加密提供包的特征码;
2、保证数据的来源合法性:用私钥加密特征码;
用户:
1、用公开的公钥解密私钥加密的特征码,即完成身份验证:(原因:用私钥加密只能用与之匹配的公钥解密)
2、对数据进行单向加密提取特征码,与解密出的特征码比对;相同时,即完成完整性校验 (原因:特征码类似人类的指纹,世界上不可能有两片相同的树叶)

默认
[root@localhost Packages]# rpm –test -ivh xz-5.2.2-1.el7.x86_64.rpm
warning: xz-5.2.2-1.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Preparing… ################################# [100%]
package xz-5.2.2-1.el7.x86_64 is already installed
导入公钥:
[root@localhost Packages]# rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
[root@localhost Packages]# rpm –test -ivh xz-5.2.2-1.el7.x86_64.rpm
Preparing… ################################# [100%]
package xz-5.2.2-1.el7.x86_64 is already installed
检验单个文件:
[root@localhost Packages]# rpm -K xz-5.2.2-1.el7.x86_64.rpm
xz-5.2.2-1.el7.x86_64.rpm: rsa sha1 (md5) pgp md5 OK

数据库维护:rpm {–rebuilddb|–initdb}
rpm数据库目录:/var/lib/rpm
–initdb: 如果数据库不存在,则初始化;
–rebuilddb: 直接,重建数据库;

注意:不能手动破坏并测试;删除后不能重构和初始化

测试删除数据库重建:
[root@localhost ~]# mkdir -v /backups
[root@localhost ~]# cp -a /var/lib/rpm /backups/
[root@localhost ~]# du -sh /var/lib/rpm
59M /var/lib/rpm
[root@localhost ~]# rpm -qa
注意:显示正常;

[root@localhost ~]# rm -rf /var/lib/rpm
[root@localhost ~]# mkdir /var/lib/rpm
[root@localhost ~]# rpm -qa
注意:不显示

重建数据库:
[root@localhost ~]# rpm –initdb
[root@localhost ~]# ls /var/lib/rpm
Basenames __db.001 __db.003 Group Name Packages Requirename Sigmd5
Conflictname __db.002 Dirnames Installtid Obsoletename Providename Sha1header Triggername
[root@localhost ~]# rpm -qa
注意:不显示

恢复备份:
[root@localhost ~]# rm -rf /var/lib/rpm
[root@localhost ~]# cp -a /backups/rpm /var/lib
[root@localhost ~]# rpm -qa
注意:显示正常;

二、yum命令
YUM: (Yellow Update Modifier), 作者yellow dog, yellow dog也是redhat的一个发行版;
1、自动解决依赖关系;
2、未能很好处理事务中断恢复;Fedora 23之后已经用dnf取代了yum;dnf同yum命令操作;
3、工作模式,访问文件机制是C/S架构;C:yum命令, S: yum仓库指向的文件服务器;

文件服务器:
http://
ftp://
nfs://
file://

工作模式:
首次使用yum时:
1、yum接收到用户的命令,向”配置文件中定义的yum仓库指向的文件服务器”去获取”元数据文件”;
元数据文件:抽取所有程序包元数据(依赖关系、包名、版本 …)为多个压缩文件;
2、将元数据下载至本地”缓存”;(/var/lib/yum)
3、从元数据中分析将要安装程序包的依赖关系,查找本地所有程序包,得到一个依赖且未安装的程序包列表;
4、从”yum源”下载程序包至本地”缓存”,先安装依赖,后安装被依赖的包;

之后每次使用yum时:
1、从”yum源”获取元数据的特征码;
2、与本地缓存中元数据的特征码对比;
3、相同:继续以上步骤:3-4;
4、不同:继续以上步骤:2-4;

使用yum要求:
1、yum命令、rpm命令存在;
2、配置文件:其内部有一个或多个yum仓库;
3、yum仓库:本地自建(节约带宽)或镜像站点;

1、yum命令、rpm命令存在;
[root@localhost ~]# rpm -q rpm
rpm-4.11.3-25.el7.x86_64
[root@localhost ~]# rpm -q yum
yum-3.4.3-154.el7.centos.noarch

2、配置文件:其内部有一个或多个yum仓库;
公共配置:/etc/yum.conf, yum仓库配置文件:/etc/yum.repos.d/*.repo
获取配置格式:# man 5 yum.conf

/etc/yum.conf
[main] yum仓库的名称/ID: main表示仓库的公共配置
cachedir=/var/cache/yum/$basearch/$releasever 定义缓存目录
keepcache=0 下载的缓存文件是否保存?
debuglevel=2 调试级别?
logfile=/var/log/yum.log 安装后日志文件指向?
exactarch=1 是否做精确严格的平台匹配: el7是否能安装el6?
obsoletes=1 废弃程序包是否使用?
gpgcheck=1 是否检查合法?
plugins=1 插件支持?
installonly_limit=5 最多一次安装几个?
bugtracker_url=http://bugs.centos.org/set_project.php?project_id=19&ref=http://bugs.centos.org/bug_report_page.php?category=yum
distroverpkg=centos-release BUG报告?

/etc/yum.repos.d/*.repo:配置文件中定义一个或多个仓库
[repoid] 仓库名
name= 仓库完整名: 功能完整描述
baseurl 仓库访问的单个或多个URL(指向repodata) 文件服务器: ftp, http, nfs, file:///
多个URL类似于镜像功能:不便管理
多个目的:避免服务器出现故障;
mirrorlist: 以镜像方式指明URL; 互联网上存放文件,文件中有多个URL;yum必须支持插件功能 ;
enabled={1|0 } 是否启用仓库;默认启用;
gpgcheck={1|0 } 是否检查其完整性及来源合法性:默认1
repo_gpgcheck 是否检查仓库元数据库文件的完整性及来源合法性;
gpgkey 指明仓库提供的公钥URL;完成检查 完整性及来源合法性;
enablegroups={1|0 } 默认为1,是否支持在此仓库上使用组来批量管理程序包;
failovermethod={roundrobin|priority} 故障转移方法;多个URL,第1个坏了使用哪个?
‘roundrobin’ 随机,默认
‘priority’ 从上而下查找;
keepalive HTTP1.1时是否使用保持连接功能;
bandwidth 指明带宽;[main]
password 指明服务器访问的密码;
cost=1000 开销;默认1000;同类仓库有相同程序包时使用开销小的;多个仓库有同一个版本的应用程序,优先使用cost小的程序;
#开头表示注释;

配置文件变量:
$releasever 当前OS发行版的主版本号
$arch 平台 i386, i486, i586, i686, x86_64
$basearch 基础平台: i386, i486, i586, i686 均为i386;x86_64
$YUM0-$YUM9

配置本地yum仓库:
[root@localhost ~]# cd /etc/yum.repos.d/
[root@localhost yum.repos.d]# mv CentOS-Base.repo{,.bak}
[root@localhost yum.repos.d]# cat CentOS-Base.repo
[C7CentOS]
name=CentOS Linux release 7.4.1708 (Core)
baseurl=file:///media/cdrom
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
enabled=1

3、yum仓库:本地自建或镜像站点;
本地自建:节约带宽;例如:1万台主机到镜像下载1万次和在本地下载1万次;

createrepo命令

yum命令
yum [options] [command] [package …]
options:
–nogpgcheck: 禁用gpgcheck(完整性及来源合法性), 配置gpgcheck=1也会被阻止;
-y: 自动回答为”yes”
-q, –quiet: 静默模式
–disablerepo=repoidglob:临时禁用此处指定的仓库[repoid];
–enablerepo=repoidglob: 临时启用此处指定的仓库[repoid];
–noplugins:临时禁用所有插件;[main] 配置中 plugins

安装程序包,不禁用检验:
[root@localhost ~]# yum reinstall xfsprogs
Total download size: 895 k
Installed size: 3.9 M
Is this ok [y/d/N]: y
Downloading packages:
warning: /media/cdrom/Packages/xfsprogs-4.5.0-12.el7.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID f4a80eb5: NOKEY
Public key for xfsprogs-4.5.0-12.el7.x86_64.rpm is not installed
Retrieving key from file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Importing GPG key 0xF4A80EB5:
Userid : “CentOS-7 Key (CentOS 7 Official Signing Key) <security@centos.org>”
Fingerprint: 6341 ab27 53d7 8a78 a7c2 7bb1 24c6 a8a7 f4a8 0eb5
Package : centos-release-7-4.1708.el7.centos.x86_64 (@anaconda)
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
Is this ok [y/N]:

禁用检验:
[root@localhost ~]# yum –nogpgcheck reinstall xfsprogs
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction

不禁用插件:
[root@localhost ~]# yum reinstall xfsprogs
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies

禁用插件
[root@localhost ~]# yum –noplugins reinstall xfsprogs
Resolving Dependencies

禁用仓库
[root@localhost ~]# yum –disablerepo=C7CentOS –noplugins reinstall xfsprogs
There are no enabled repos.
Run “yum repolist all” to see the repos you have.
To enable Red Hat Subscription Management repositories:
subscription-manager repos –enable <repo>
To enable custom repositories:
yum-config-manager –enable <repo>

[root@localhost ~]# yum –disablerepo=C7CentOS –noplugins repolist
repolist: 0

command is one of:
help [command] 命令使用帮助

显示仓库信息:
程序包:* repolist [enabled|disabled|all]
enabled: 启用;默认
[root@localhost ~]# yum repolist
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id repo name status
C7CentOS CentOS Linux release 7.4.1708 (Core) 9,591
repolist: 9,591
[root@localhost ~]# yum repolist enabled
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
repo id repo name status
C7CentOS CentOS Linux release 7.4.1708 (Core) 9,591
repolist: 9,591
[root@localhost ~]# yum repolist disabled
[root@localhost ~]# yum repolist all

包组:* grouplist
Installed Groups: 已经安装的组
Available Groups: 未安装的组
Available Language Groups: 未安装的语言组
[root@localhost ~]# yum grouplist

安装:# rpm -ivh
程序包:
网络:* install package1 [package2] […]
本地:* localinstall rpmfile1 [rpmfile2] […] 兼容(CentOS 5)而留下;建议使用 install安装

包组:* groupinstall group1 [group2] […]
[root@localhost ~]# yum groupinstall “Development Tools”

重装:* reinstall package1 [package2] […]
# rpm -ivh –replacepkgs
[root@localhost ~]# yum reinstall bash

注意:默认安装较新版本,使用老版本,需要自带版本号;例如: gcc: gnu c complier 编译器 gcc-4.5.4

升级程序包:# rpm -[U|F]vh
* update [package1] [package2] […]
[root@localhost ~]# yum update

降级:* downgrade package1 [package2] […]
# rpm -[U|F]vh –oldpackage

检查升级: * check-update
[root@localhost ~]# yum check-update

卸载程序包:# rpm -e
* remove | erase package1 [package2] […]
注意:卸载程序包,此包依赖的包会一并卸载;
[root@localhost ~]# yum remove bash

查询程序包:# rpm -q
程序包:
查看特性由哪个程序包所提供:* whatprovides feature1 [feature2] […]
# rpm -q –whatprovides 特性由哪个程序包提供
# rpm -q –whatrequires 特性由哪个程序包依赖
# rpm -q -f 文件由哪个程序包提供
[root@localhost ~]# yum whatprovides /bin/ls
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
coreutils-8.22-18.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts
Repo : C7CentOS
Matched from:
Filename : /bin/ls

coreutils-8.22-18.el7.x86_64 : A set of basic GNU tools commonly used in shell scripts
Repo : @anaconda
Matched from:
Filename : /bin/ls

查看所有程序包:list [all|available|updates|installed|extra|obsoletes] [glob_exp1] […]
all 显示所有,默认;
available 可用,未安装
updates 升级包
extra 额外包
obsoletes 废弃的
glob_exp 支持glob格式的通配符;# yum list php*
# rpm -q -a
[root@localhost ~]# yum list bash*
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
bash.x86_64 4.2.46-28.el7 @anaconda
Available Packages
bash-completion.noarch 1:2.1-6.el7 C7CentOS
bash-doc.x86_64 4.2.46-28.el7 C7CentOS
[root@localhost ~]#
29 yum list available
30 yum list updates
31 yum list installed
32 yum list extra
33 yum list obsoletes

以模式搜索程序包名及summary信息:* search string1 [string2] […]
summary: # rpm -q -i
相当于:rpm -qa | grep “”
[root@localhost ~]# yum search bash
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
============================================ N/S matched: bash =============================================
bash-completion.noarch : Programmable completion for Bash
bash-doc.x86_64 : Documentation files for bash
libguestfs-bash-completion.noarch : Bash tab-completion scripts for libguestfs tools
pcp-pmda-bash.x86_64 : Performance Co-Pilot (PCP) metrics for the Bash shell
bash.x86_64 : The GNU Bourne Again shell

Name and summary matches only, use “search all” for everything.

包内:
information:* info […]
# rpm -q -i
[root@localhost ~]# yum info bash
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Installed Packages
Name : bash
Arch : x86_64
Version : 4.2.46
Release : 28.el7
Size : 3.5 M
Repo : installed
From repo : anaconda
Summary : The GNU Bourne Again shell
URL : http://www.gnu.org/software/bash
License : GPLv3+
Description : The GNU Bourne Again shell (Bash) is a shell or command language
: interpreter that is compatible with the Bourne shell (sh). Bash
: incorporates useful features from the Korn shell (ksh) and the C shell
: (csh). Most sh scripts can be run by bash without modification.

详细信息:* groupinfo […]
Mandatory Packages: 必需安装
Default Packages: 默认安装
Optional Packages: 可选安装
[root@localhost ~]# yum groupinfo “Development Tools”

查看程序包依赖的特性:* deplist
# rpm -q –requires 程序包依赖的特性
# rpm -q –provides 程序包提供的特性;

version:
* version
[root@localhost ~]# yum version
Loaded plugins: fastestmirror
Installed: 7/x86_64 330:f56bc33e64789e69dab64f1c124b906aea0f9a1e
Group-Installed: yum 14:82872eae0769d1e579cb33465dba19a0c9ea374c
version

yum事务历史查询:
* history [list|info|packages-list|packages-info|summary|addon-info|redo|undo|roll-back|new|sync|stats]
list
summary 摘要
stats 统计数据
[root@localhost ~]# yum history
Loaded plugins: fastestmirror
ID | Login user | Date and time | Action(s) | Altered
——————————————————————————-
3 | root <root> | 2017-10-06 19:39 | Reinstall | 1 **
2 | root <root> | 2017-10-06 08:43 | Install | 31
1 | System <unset> | 2017-10-06 15:58 | Install | 299
history list
[root@localhost ~]# yum history summary
Loaded plugins: fastestmirror
Login user | Time | Action(s) | Altered
——————————————————————————-
System <unset> | Last day | Install | 299
root <root> | Last day | I, R | 32
history summary
[root@localhost ~]# yum history stats
Loaded plugins: fastestmirror
File : //var/lib/yum/history/history-2017-10-06.sqlite
Size : 406,528
Transactions: 2
Begin time : Fri Oct 6 15:58:27 2017
End time : Fri Oct 6 08:43:51 2017
Counts :
NEVRAC : 330
NEVRA : 330
NA : 330
NEVR : 330
rpm DB : 330
yum DB : 330
history stats

事务:yum命令执行一次(修改类的操作:安装、升级、卸载)叫一个事务
隔离性:一个terminal开始,另一个终端不能开始;
一次只能完成一次事务;
Running transaction check 事务检查
Running transaction test 事务测试
Transaction test succeeded 事务测试成功
Running transaction 运行事务

数据库:
清理缓存:
* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]

packages: 程序包
metadata: 元数据
expire-cache: 过期缓存
rpmdb: 数据库
plugins

生成缓存;yum仓库安装时会先比较缓存;再下载元数据缓存
* makecache
# rpm –initdb|–rebuilddb [–dbpath DIR]

[root@localhost ~]# yum clean all
Loaded plugins: fastestmirror
Cleaning repos: C7CentOS
Cleaning up everything
Maybe you want: rm -rf /var/cache/yum, to also free up space taken by orphaned data from disabled or removed repos
Cleaning up list of fastest mirrors
[root@localhost ~]# yum makecache
Loaded plugins: fastestmirror
C7CentOS | 3.6 kB 00:00:00
(1/4): C7CentOS/group_gz | 3.5 kB 00:00:00
(2/4): C7CentOS/filelists_db | 291 kB 00:00:00
(3/4): C7CentOS/primary_db | 750 kB 00:00:00
(4/4): C7CentOS/other_db | 191 kB 00:00:00
Determining fastest mirrors
Metadata Cache Created

三、编译安装

开源程序源代码获取:
项目官方:
apache.org (ASF)
mariadb.org

代码托管:
SourceForge
Github.com
code.google.com
软件:用编程语言所写的程序代码(源代码)
源代码:编译为二进制程序方可运行;
C源码 –> 预处理 –> 编译(gcc) –> 汇编 –> 链接 –> 二进制程序;
整个过程用项目构建工具即可完成;
C:make:根据Makefile配置文件完成;
java: maven

开发工具:
autoconf: 生成configure脚本;
automake: 生成Makefile.in;

autoconf –> configure
automake –> Makefile.in
confiure + Makefile.in –> Makefile
make + Makefile –> 完成编译

编译安装步骤:
提供开发环境
C6:”Development Tools” “Server Platform Development”
C7: “Development Tools”

1、configure: 根据用户给定的参数,生成配置文件;
–prefix 程序默认安装路径
–sysconfdir 配置文件安装路径
–disable-FEATURE: 默认启用时;此选项表示禁用;
–enable-FEATURE 默认禁用;此选项表示启用;
–with-PACKAGE[=ARG] 依赖的包;
–without-PACKAGE 决不依赖的包;

2、make:根据生成的Makefile文件完成编译生成二进制程序文件;
3、make install:将二进制程序文件复制到指定目录中;

编译后的步骤:手动完成,rpm包管理器;可自动完成;
导出二进制程序
/etc/profile.d/*.sh
export PATH

导出库文件
/etc/ld.so.conf.d/*.conf
ldconfig [-v]
导出头文件
ln -s
导出帮助手册
man.config || man_db.conf
MANPATH

编译安装apache 2.2;启动此服务”It works”
安装开发环境:
# yum groupinstall “Development Tools”
编译:
# tar xf httpd-2.2.29.tar.bz2
# cd httpd-2.2.29
# ./configure –prefix=/usr/local/apache2 –sysconfdir=/etc/apache2
# make
# make install
编译后步骤:
[root@localhost ~]# cd /usr/local/apache2/
[root@localhost apache2]# ls
bin build cgi-bin error htdocs icons include lib logs man manual modules
1、导出二进制程序:
# vim /etc/profile.d/apache2.sh
export PATH=/usr/local/apache2/bin:${PATH}
. /etc/profile.d/apache2.sh
2、导出库;
# vim /etc/ld.so.conf.d/apache2.conf
/usr/local/apache2/lib
3、导出头文件;
ln -s /usr/local/apache2/include /usr/include/apache2

4、导出帮助手册;
# vim /etc/man_db.conf
MANPATH_MAP /usr/local/apache2/bin /usr/local/apache2/man

[root@localhost ~]# apachectl start
httpd: Could not reliably determine the server’s fully qualified domain name, using localhost.localdomain for ServerName
[root@localhost ~]# ss -tnl
LISTEN 0 128 :::80 :::*

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/89046

(0)
逆神阳逆神阳
上一篇 2017-11-27
下一篇 2017-11-27

相关推荐

  • Linux基本文本管理命令

    一.Linux上的文件管理命令都有哪些,其使用的方法及其相关演示1.cp命令:copy (文件复制功能)源文件,目标文件单源复制:cp [OPTION]…[-T] SOURCE DEST多源复制:cp [OPTION]…SOURCE…DIRECTORYcp [OPTION]… -T DIRECTORY SOURCE… 单源复制:cp [OPTION]…[-T…

    2017-09-20
  • 第八周作业

    1、请描述网桥、集线器、二层交换机、三层交换机、路由器的功能、使用场景与区别。    集线器(HUB)主要功能是对接收到的信号进行再生整形放大,以扩大网络的传输距离,同时把所有节点集中在以它为中心的节点上。集线器是一种共享设备,HUB本身不能识别目的地址,当同一局域网内的A主机给B主机传输数据时,数据包在以HUB为架构…

    Linux干货 2017-02-27
  • 文本处理工具

    1、cat命令 功能: 显示文本内容,连接合并文本内容并在标准设备上输出 语法: cat [OPTION]… [FILE]… 选项: -E:显示行结束符(回车)$ -A:显示所有控制符,相当于-vET -n:对显示出的每一行进行编号 -b:对非空白行编号 -s:将连续的空行压缩成一行 -T:把TAB字符显示为^I -v:除了&nb…

    Linux干货 2016-08-07
  • Linux文件管理命令详解–cp,mv,rm

    在Linux系统里平时需要对目录文件做一些管理操作,其中最基本的有cp,mv,rm等命令: cp命令:copy 复制   其中包含源文件,目标文件: copy分为单源复制和多源复制,详解如下:               单源复制:cp [option]…[-T] S…

    Linux干货 2016-11-06
  • linux终端类型

    终端分为:             ∟  物理终端         定义:可将显示器,键盘,鼠标直接接入主机接口的终端;     &nbsp…

    Linux干货 2016-10-18
  • 上篇博客简单提了一下Nginx配置文件的大体组成部分,这次来好好解释一下这些个配置文件。 一、main配置段 分类:    正常运行必备的配置    优化性能相关的配置    用于调试及定位问题相关的配置   …

    Linux干货 2016-10-26