前言
首先说说一个软件的诞生过程:
程序员用编程语言写文本格式的源代码,但是计算机只能读懂二进制文件,那么就需要将源代码转换成二进制格式,这个过程称为编译。编译用的工具称为编译器,编译器有很多种,在Linux上常用gcc这个编译器。利用编译器,得到二进制格式的文件(二进制程序(Windows上.exe.msi,Linux.elf)、库文件、配置文件、帮助文件)。
手动编译是一个麻烦的事情,所以软件发行商将程序照平台编译好之后,成为二进制的程序包。Windows的程序包就两个步骤:安装和卸载。
Linux的程序包根据发行版的不同,格式也不一样。主要是RedHat系的RPM包和debian系的deb包。主要介绍RPM包,以后再介绍deb包的使用。
Linux不是,Linux的哲学有一点是:Linux由众多功能单一的程序构成,只做一件事,并做到最好。那么这些功能单一的程序怎么去实现复杂的工作呢?
分工和协作嘛,我不会的事让别人去做,我会的事我还可以让其他比我做得更好的人去做。所以在Linux的程序包之间有着复杂的包间依赖关系,A程序需要B程序,B程序又依赖于C程序…
如果要单个单个的去安装包的话是一件很折磨人的事情,A包装上了告诉你没装B包,我运行不了,没满足依赖关系,那就装B包,B包装好了说你没装C包,C包又装好了,又缺D包…这可咋整2333。而且包的格式还不一样。
Linux的程序包根据发行版的不同,格式也不一样。主要是RedHat系的RPM包和debian系的deb包。主要介绍RPM包,以后再介绍deb包的使用。
下面进入正题:介绍RPM包、rpm命令、前端工具yum
RPM包
红帽系Linux用rpm命令管理RPM程序包RPM包:
主要实现的是 :安装、升级、卸载、查询、校验和数据库维护
语法: rpm [OPTION] [PACKAGE_FILE]
安装: -i,--install
升级: -u,--update,-F,--freshen
卸载: -e,--erase
查询: -q,--query
检验: -V,--verify
数据库维护: --builddb,--initdb
安装:
rpm {-i|--install} [install-options] PACKAGE_FILE ...
rpm -ivh PACKAGE_FILE
-v:
-vv
[install-options]:
-h:显示进度,hash marks,每个#表示2%
--test:测试安装
--nodeps:不检测依赖直接安装
--replace:重新安装(不会修改配置文件,如果是想通过重装恢复默认配置,将那个配置文件删除后replace)
--noscript
注意:rpm可以自带脚本:
preinstall:安装前进行,%pre,--nopre
postinstall:安装后运行,%post,--nopost
preuninstall:卸载前运行,%preun,--unpreun
postuninstall:卸载完运行,%postun,--nopsdtun
--nosignature:不检查包签名信息,不检查来源合法性
--nodigest:不检验包完整性信息
升级:
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
-U:升级或安装
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
-F:只升级,如果原来没有,不安装
rpm -Uvh PACKAGE_FILE
rpm -Fvh PACKAGE_FILE
--oldpackage:降级为较老版本的;回滚
--force:强制升级;
注意:
1.不要对内核进行升级操作;Linux支持多内核版本共存,因此,直接安装新版本内核
2.如果某原程序包的配置文件被修改过,升级后同名的配置文件不会被更新,而是把新配置文件重命名提供;一般叫filename.rpmnew(原文件的新版)
查询:
rpm {-q|--query} [select-options] [query-options]
[select-options]:
PACKAGE_NAME:查询指定程序包是否安装,
-f, --file:查询文件是由哪个程序生成的
-g, --group:
-a, --all:查询所有已经安装过的包
-p, --package PACKAGE_FILE:用于实现对未安装的程序包执行查询操作
--whatprovides CAPABILITY:查询指定的CAPABILITY由哪个程序包提供
--whatrequires CAPABILITY:查询指定的CAPABILITY被哪个程序包所依赖
[query-option]
--changelog:查看版本更迭
-l, --list:程序安装生成的文件列表
-i, --info:程序包相关的信息,版本号、大小
-c, --configfiles:List only configuration files (implies -l).
-d, --docfiles:List only configuration files (implies -l).
--provides:List capabilities this package provides.
-R, --requires:List capabilities on which this package depends.
--scripts:List the package specific scriptlet(s) that are used as part of the installation and uninstallation processes.
用法:
-qi PACKAGE,-qf FILE,-qc PACKAGE,-ql PACKAGE,-qd PACKAGE
-qpi PACKAGE_FILE,-qpl PACKAGE_FILE,-qpc PACKAGE_FILE...
包相关信息查询:-i, --info
有这些信息:版本、配置文件、文档文件、安装生成的文件、包间依赖、包的脚本
校验:
rpm {-V|--verify} [select-options] [verify-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
文件大小、权限、校验码、主次设备号、属主、属组、修改时间、功能
包来源合法性验证和完整性验证:
来源合法性验证:
GPG密钥
数字签名:
包制作者将包的特征码非对称加密,
1.将源包提取特征码a
2.用私钥加密特征码a,放在包的后面
3.用户用公钥得到特征码a,再算得到包的特征码b,匹配ab特征码
获取并导入信任的包制作者的密钥:
对于CentOS发行版来说:
rpm --imprt /etc/pkl/rpm-gpg/RPM-GPG-KEY-CentOS-7
通过光盘导入数字签名:
rpm --import /media/cdrom/RPM-GPG-KEY-CentOS-7
完整性验证:
验证:
1.安装此组织签名的程序时,会自动执行验证;
2.手动验证:rpm -K PACKAGE_FILE
数据库(database)(包的数据库)重建:
rpm管理器数据库路径:/var/lib/rpm/
查询操作:通过此处的数据库进行
rpm {--initdb|--rebuilddb}
--initdb:初始化数据库,当前无任何数据库时新建,有数据库时不操作
--rebuilt:根据已安装的程序包首部信息(headers)重建数据库
但是rpm只是解决了包的安装卸载的问题,有个困扰用户的巨大问题没有被解决:包间依赖!在红帽系列的上采用了yum这个前段工具。
所以我们通常使用yum管理软件,很好用哦。
yum
yum能干什么呢?yum能根据所要安装的软件,分析软件的依赖关系,并且在软件仓库中下载软件到本地安装,也就是说,只需要输入一条yum指令就可以直接装好软件并使用了特别方便。下面介绍yum的用法:
yum命令用法:
yum [OPTIONS] [COMMAND] [PACKAGE]
看看有哪些command可以用:
* install package1 [package2] [...]
* update [package1] [package2] [...]
* update-to [package1] [package2] [...]
* update-minimal [package1] [package2] [...]
* check-update
* upgrade [package1] [package2] [...]
* upgrade-to [package1] [package2] [...]
* distribution-synchronization [package1] [package2] [...]
* remove | erase package1 [package2] [...]
* autoremove [package1] [...]
* list [...]
* info [...]
* provides | whatprovides feature1 [feature2] [...]
* clean [ packages | metadata | expire-cache | rpmdb | plugins | all ]
* makecache [fast]
* groups [...]
* search string1 [string2] [...]
* shell [filename]
* resolvedep dep1 [dep2] [...]
(maintained for legacy reasons only - use repoquery or yum provides)
* localinstall rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use install)
* localupdate rpmfile1 [rpmfile2] [...]
(maintained for legacy reasons only - use update)
* reinstall package1 [package2] [...]
* downgrade package1 [package2] [...]
* deplist package1 [package2] [...]
* repolist [all|enabled|disabled]
* repoinfo [all|enabled|disabled]
* repository-packages <enabled-repoid> <install|remove|remove-or-reinstall|remove-or-distribution-synchronization> [package2] [...]
* version [ all | installed | available | group-* | nogroups* | grouplist | groupinfo ]
* history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
* load-transaction [txfile]
* updateinfo [summary | list | info | remove-pkgs-ts | exclude-updates | exclude-all | check-running-kernel]
* fssnapshot [summary | list | have-space | create | delete]
* fs [filters | refilter | refilter-cleanup | du]
* check
* help [command]
有点多了,常用的选项有这些:
显示仓库列表:repolist [all|enable|disable]
显示程序包:list
# yum list [all| glob_exp1] [glob_exp2] [...]
# yum list {available|installed|updates} [glob_exp1] [...]
安装程序包:install
install package [package2] [...]
reinstall package1 [package2] [...] (重装)
升级程序包:
update [package1] [package2] [...]
downgrade package1 [package2] [...] (降级)
检查升级:check-update
卸载程序包:
remove| erase package1
查询包信息:info
info [...]
查看指定特性或文件是由哪个程序包所提供的:
provides | whatprovides feature1 [feature2] [...]
清除本地缓存(包):
clean [ package | metadate | expire-cache | rpmdb | plugins | all ]:我爱用all选项
构建缓存:
makecache
搜索关键字:
search string1 [string2] [...]
以指定的关键字搜索程序包及summary信息
依赖关系分析:
deplist package1 [package2] [...]
yum历史事务:
history [info|list|packages-list|packages-info|summary|addon-info|redo|undo|rollback|new|sync|stats]
安装及升级本地的包:
localinstall rpmfile1 [rpmfile2] [...]
localupdate rpmfile1 [rpmfile2] [...]
包组管理相关的命令:groups
groupinstall group1 [group2] [...]
groupupdate group1 [group2] [...]
grouplist [hidden] [groupwildcard] [...]
groupremove [groupr1] [groupr2] [...]
grouprinfo group1 [group2] [...]
yum仓库
再来说说仓库,repository,仓库又被称为源,有本地源和网络源,可以用光盘作为本地源获取软件并安装,这样不用担心软件来源和安全问题。网络源国内有阿里源(吐槽一下阿里源太慢了),搜狐源,还有清华大学的源。
将光盘作为本地源
首先挂载光盘:
mount -r /dev/cdrom /media/cdrom
# -r只读挂载,将光盘挂载到/media目录下的cdrom目录
修改本地的yum仓库文件,/etc目录下的/etc/yum.repos.d/目录下的以.repo文件。
vi /etc/yum.repos.d/locationcdrom.repo
# 格式如下
[repositoryID]
#自定义一个软件仓库的ID
name=
#
baseurl=
enabele=
gpgcheck=
然后用yum repolist查看是否已经建立好的仓库
#yum repolist还会更新一下本地软件仓库列表的缓存
如果想将定义一个网络源,.repo文件需要将baseurl选项修改为网络源的URL即可。
那么我平常只会用到几款软件并不想让本地缓存变得特别大,怎么办?
可以自建yum仓库。用createrepo一键轻松搞定!
eg:我有100个RPM包放在~/software目录下
createrepo ~/software
于是就建立了一个repodate目录,就可以提供给本地使用了
本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/90826
评论列表(1条)
博文描述的有点简单哈~可以深入一点,类似yum中遇到的问题、搭建网络yum源等~