程序包管理是在电脑中自动安装、配制、卸载和升级软件包的工具组合,在各种系统软件和应用软件的安装管理中均有广泛应用。
在Linux发行版中,几乎每一个发行版都有自己的软件包管理系统。常见有: 管理deb软件包的dpkg以及它的前端apt(使用于Debian、Ubuntu)。 rpm以及它的前端yum(使用于Fedora)、前端ZYpp(使用于openSUSE)、 前端urpmi(使用于Mandriva Linux、Mageia)等。使用软件包管理系统将大大简化在Linux发行版中安装软件的过程。其他软件包管理系统有ArchLinux中使用的Pacman,Gentoo使用的基于源代码的Portage和Mac系统下的Homebrew等。
Name:软件包名
Major:主版本号,如软件的框架做重大更改后才会修改
Minor:次版本号,如软件添加了某些新功能后才会修改
第一个Release:发行号,如软件修复了某些bug后才会修改
第二个Release:修订号,如源码未做过修改,发行商对发行的RPM包进行再次发行后才会修改
Arch:硬件平台架构
RPM程序包管理的主要功能是安装,升级,卸载,查询,验证等。
实验前准备
实验环境为CentOS 6.6
把光盘放入虚拟机,挂载光盘
[root@localhost ~]# mkdir /media/cdrom/ [root@localhost ~]# mount -r /dev/cdrom /media/cdrom/
通用选项
-v:显示安装的详细信息
-vv:显示安装时的更详细信息
-h:通过50个#号来显示安装进度
常用查询选项
rpm {-q|--query} [select-options] [query-options]
[select-options]
PACKAGE_NAME:包名
-a:查询已安装的包
-p PACKAGE_FILE:对未安装包的详细信息查询,与[query-options]配合使用
-f或--file FILE:查询某文件有哪个包生成
[query-options]
--changelog:查询RPM包的变更信息
-c, --configfiles:显示包的配置文件
-d, --docfiles:显示包的帮助文件
-i, --info:显示包的信息,包含包名,版本和描述
-l, --list:显示包中的所有文件
--provides:列出包提供的功能
-R或--requires:列出这个包所依赖的功能
--scripts:列出包安装和卸载时运行的特定脚本
preinstall: 安装前执行的脚本
postinstall: 安装后执行的脚本
preuninstall: 卸载前执行的脚本
postuninstall: 卸载后执行的脚本
查询某包是否安装
[root@localhost Packages]# rpm -q zsh package zsh is not installed
查询已安装的所有包
[root@localhost Packages]# rpm -qa
查询某文件由哪个包安装生成的
[root@localhost Packages]# rpm -qf /etc/fstab setup-2.8.14-20.el6_4.1.noarch
查询未安装包的相关信息与与[query-options]配合使用
[root@localhost Packages]# rpm -qpi zsh-4.3.10-7.el6.x86_64.rpm
[root@localhost Packages]# rpm -qpc zsh-4.3.10-7.el6.x86_64.rpm
查询RPM包的变更信息
[root@localhost Packages]# rpm -q zsh --changelog * Mon Aug 05 2013 James Antill <james.antill@redhat.com> - 4.3.10-7 - Change {NAME:OFFSET:LENGTH} substitution feature to ignore KSH_ARRAYS option. - Fixup tests. - Resolves: rhbz#820530
查询所提供的功能
[root@localhost Packages]# rpm -q xz --provides xz = 4.999.9-0.5.beta.20091007git.el6 xz(x86-64) = 4.999.9-0.5.beta.20091007git.el6
查询所依赖的功能
[root@localhost Packages]# rpm -q xz --requires /bin/sh libc.so.6()(64bit) libc.so.6(GLIBC_2.2.5)(64bit) libc.so.6(GLIBC_2.3)(64bit) libc.so.6(GLIBC_2.3.4)(64bit) libc.so.6(GLIBC_2.4)(64bit) libc.so.6(GLIBC_2.6)(64bit) libc.so.6(GLIBC_2.7)(64bit) liblzma.so.0()(64bit) libpthread.so.0()(64bit) libpthread.so.0(GLIBC_2.2.5)(64bit) rpmlib(CompressedFileNames) <= 3.0.4-1 rpmlib(FileDigests) <= 4.6.0-1 rpmlib(PayloadFilesHavePrefix) <= 4.0-1 rtld(GNU_HASH) xz-libs = 4.999.9-0.5.beta.20091007git.el6 rpmlib(PayloadIsXz) <= 5.2-1
常用安装选项
rpm {-i|--install} [install-options] PACKAGE_FILE ...
[install-options]
--test 测试安装
--nodeps 忽略依赖关系
--replacepkgs 重新安装RPM包
软件包的安装
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
软包重新安装
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm --replacepkgs Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
测试安装
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm --test Preparing... ########################################### [100%] [root@localhost Packages]# rpm -q zsh package zsh is not installed
忽略依赖关系
[root@localhost Packages]# rpm -ivh gcc-4.4.7-11.el6.x86_64.rpm error: Failed dependencies: cloog-ppl >= 0.15 is needed by gcc-4.4.7-11.el6.x86_64 cpp = 4.4.7-11.el6 is needed by gcc-4.4.7-11.el6.x86_64 [root@localhost Packages]# rpm -ivh gcc-4.4.7-11.el6.x86_64.rpm --nodeps Preparing... ########################################### [100%] 1:gcc ########################################### [100%]
常用卸载选项
rpm {-e|--erase} [--allmatches] [--nodeps] [--noscripts] [--notriggers] [--test] PACKAGE_NAME ...
卸载程序,如卸载程序的配置文件被修改过,卸载是被更改的配置文件将被重命名为***.rpmsave
[root@localhost Packages]# rpm -e zshwarning: /etc/zlogin saved as /etc/zlogin.rpmsave
常用升级选项
rpm {-U|--upgrade} [install-options] PACKAGE_FILE ...
rpm {-F|--freshen} [install-options] PACKAGE_FILE ...
[install-options]
--oldpackage:降级安装
--force: 忽略冲突,强制执行过程
升级安装,U 选项:如果有较旧版本程序包,则升级安装;否则,则执行安装操作
[root@localhost Packages]# rpm -Uvh zsh-4.3.10-7.el6.x86_64.rpm Preparing... ########################################### [100%] 1:zsh ########################################### [100%] [root@localhost Packages]# rpm -q zsh zsh-4.3.10-7.el6.x86_64
升级安装, F 选项:如果有较旧版本程序包,则升级安装;否则,中止
[root@localhost Packages]# rpm -q bash bash-4.1.2-15.el6_4.x86_64 [root@localhost Packages]# rpm -Fvh bash-4.1.2-29.el6.x86_64.rpm Preparing... ########################################### [100%] 1:bash ########################################### [100%] [root@localhost Packages]# rpm -q bash bash-4.1.2-29.el6.x86_64 [root@localhost Packages]# rpm -Fvh zsh-4.3.10-7.el6.x86_64.rpm [root@localhost Packages]# rpm -q zsh package zsh is not installed
降级安装
常用校验选项
rpm {-V|--verify} [select-options] [verify-options]
[select-options]
PACKAGE_NAME:包名
-a:查询已安装的包
-p PACKAGE_FILE:对未安装包的详细信息查询,与[query-options]配合使用
-f或--file FILE:查询某文件有哪个包生成
[verify-options]
--nosignature: 不检查来源合法性
--nodigest: 不检查完整性
对程序进行校验,/etc/zlogin更改后,校验信息如下
[root@localhost Packages]# vim /etc/zlogin [root@localhost Packages]# rpm -V zsh S.5....T. c /etc/zlogin
开始的9个选项分别表示如下:
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
后面的c选项位置有如下选项,被更改的文件类型:
c %config configuration file.
d %doc documentation file.
g %ghost file (i.e. the file contents are not included in the package payload).
l %license license file.
r %readme readme file.
其他相关
为了验证程序包来源和合法性和完成性,安装的时候需要对程序包进行校验。密钥存放位置/etc/pki/rpm-gpg/
当有warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY 提示时,可以导入光盘中的公钥或到官网下在相关公钥。
导入PUBKEY rpm --import PUBKEY ...
[root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm warning: zsh-4.3.10-7.el6.x86_64.rpm: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Preparing... ########################################### [100%] 1:zsh ########################################### [100%] [root@localhost cdrom]# rpm --import RPM-GPG-KEY-CentOS-6 [root@localhost Packages]# rpm -ivh zsh-4.3.10-7.el6.x86_64.rpm --replacepkgs Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
PUBKEY的查询与删除
[root@localhost base]# rpm -q gpg-pubkey package gpg-pubkey is not installed [root@localhost base]# rpm --import /media/cdrom/RPM-GPG-KEY-CentOS-6 [root@localhost base]# rpm -q gpg-pubkey gpg-pubkey-c105b9de-4e0fd3a3
[root@localhost base]# rpm -q gpg-pubkey gpg-pubkey-c105b9de-4e0fd3a3 [root@localhost base]# rpm -e gpg-pubkey-c105b9de-4e0fd3a3 [root@localhost base]# rpm -q gpg-pubkey package gpg-pubkey is not installed
RPM数据库
为了能有效管理系统上的软件,RPM有一个数据库,存放在/var/lib/rpm文件夹下。RPM文件尝尝会安装,移除,升级等操作,某些动作可能导致RPM数据损坏,可以通过以下来初始化和重建
[root@localhost ~]# rpm --initdb [root@localhost ~]# rpm --rebuilddb
YUM全名Yellow dog Updater,是一个基于RPM包管理的字符前端软件包管理器。能够从指定的服务器自动下载RPM包并且安装,可以处理依赖性关系(安装A-->B,B-->C,B和C就需要一起安装),并且一次安装所有依赖的软件包,无需繁琐地一次次下载、安装。
如下图,一个程序有这么多的rpm包,为什么不打包在一个中呢?
1、为了重复利用既有的软件功能,因此很多软件都会以函数库的方式释放出部分功能,以方便其他软件的调用
2、节省磁盘空间,不必为了调用相应的库而把整个软件都安装上
3、安全,功能越多,BUG的可能性就越大
YUM客户端相关配置
主配置文件/etc/yum.conf
[main]
cachedir=/var/cache/yum/$basearch/$releasever
缓存存放路径,如安装包
keepcache=0
安装成功后是否保存缓存和包,默认1保存,0不保存
debuglevel=2
调试级别0-10,默认为2
logfile=/var/log/yum.log
日志目录
exactarch=1
默认为1,不会更新i686的包到i386的包
obsoletes=1
gpgcheck=1
是否检查GPG签名
plugins=1
是否支持插件,0关闭,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
接下来就是定义软件仓库位置的配置文件,目录为/etc/yum.repos.d,可以有1个或多个,文件由以下主要参数构成
[repository_ID]:在所有配置文件中必须唯一
name:一个通俗易懂的名字
baseurl:指向YUM仓库的链接
$releasever This is replaced with the package's version, as listed in distroverpkg. This defaults to the version of the redhat-release package.
$arch This is replaced with your system's architecture, as listed by os.uname() in Python.
$basearch This is replaced with your base architecture. For example, if $arch=i686 then $basearch=i386.
$YUM0-9 This is replaced with the value of the shell environment variable of the same name. If the shell environment variable does not exist, then the configuration file variable will not be replaced.
为让不同的系统获取相应版本的软件,可以通过一下替换来实现:
http://mirrors.sohu.com/centos/6/os/x86_64/
http://mirrors.sohu.com/centos/$releasever/os/$basearch
enabled:是否启用YUM仓库,0启用,1禁用
gpgcheck:GPG签名检查,1启用,0不检查 http://mirrors.sohu.com/centos/6/os/x86_64/
gpgkey:Public Key存放位置
cost:开销默认为1000,越小优先级越高
YUM的相关命令
选项
--enablerepo= 启用repo --disablerepo= 禁用repo 注意:优先级高于/etc/yum.repos.d/*.repo配置文件中定义的属性; -y: 自动回答为yes --nogpgcheck
列出所有仓库,程序包,包组
# yum repolist 列出所有仓库 # yum list all 列出所有的软件(包含未安装仓库上可用的) # yum list installed 列出所有已安装的软件 # yum list available 列出仓库上的软件 # yum grouplist 列出包组
安装程序包
# yum install PACKAGE_NAME ... 安装程序包 # yum install PACKAGE-VERSION 如果要安装指定的版本的程序 # yum reinstall PACKAGE_NAME 重装指定的程序包
升级程序包
yum update PACKAGE_NAME 升级程序包 yum update PACKAGE-VERSION 如果有多个版本的升级包可用,且仅期望升级到指定版本: yum downgrade PACKAGE_NAME 降级 yum check-update 检查可用升级
卸载程序包
yum remove|erase PACKAGE_NAME 卸载程序包依赖于指定程序包的其它包,会被一并卸载
查询程序包
yum list 列出所有包 yum info PACKAGE_NAME 显示包的信息 yum search KEYWORD 根据关键字模糊查询包名或包的sumary信息包含此KEYWORD的相关列表; yum provides|whatprovides /path/to/somefile 查询包所提供的功能
包组管理
yum grouplist 显示所有包组 yum groupinfo "GROUP_NAME" 显示某包组的相关信息: yum groupinstall "GROUP_NAME" 安装包组 yum install @GROUP_NAME yum groupremove "GROUP_NAME" 卸载包组 yum remove @"GROUP_NAME" yum groupupdate "GROUP_NAME" 升级包组:
安装本地rpm包
yum localinstall /path/to/rpm_package_file ... yum install /path/to/rpm_package_file ... CentOS7上使用
YUM导入PUBKEY,在/etc/yum.repos.d下新建sohu.repo
[Sohu]
name=SohuRepo
baseurl=http://mirrors.sohu.com/centos/$releasever/os/$basearch
gpgcheck=1
gpgkey=http://mirrors.sohu.com/centos/6/os/x86_64/RPM-GPG-KEY-CentOS-6
cost=900
Downloading Packages: zsh-4.3.10-7.el6.x86_64.rpm warning: rpmts_HdrFromFdno: Header V3 RSA/SHA1 Signature, key ID c105b9de: NOKEY Retrieving key from http://mirrors.sohu.com/centos/6/os/x86_64/RPM-GPG-KEY-CentO Importing GPG key 0xC105B9DE: Userid: "CentOS-6 Key (CentOS 6 Official Signing Key) <centos-6-key@centos.org> From : http://mirrors.sohu.com/centos/6/os/x86_64/RPM-GPG-KEY-CentOS-6 Is this ok [y/N]: n
本地创建YUM仓库
新建相应的文件夹,挂载光驱,拷贝文件到可以读写的文件夹
[root@localhost Packages]# mkdir /tmp/CentOS6.6 /media/cdrom [root@localhost Packages]# mount -r /dev/cdrom /media/cdrom [root@localhost Packages]# cp /media/cdrom/Packages/* /tmp/CentOS6.6/
创建YUN仓库
[root@localhost Packages]# createrepo /tmp/CentOS6.6/ Spawning worker 0 with 4184 pkgs Workers Finished Gathering worker results Saving Primary metadata Saving file lists metadata Saving other metadata Generating sqlite DBs Sqlite DBs complete
生成相应的文件
[root@localhost repodata]# ls 2492566dbeda19963c5a8a638185aa1e858aa6dea5f145b7090a7816fa63162e-filelists.sqlite.bz2 280947c3ee9847a2312ddb02e6b91ecacbbc29bde81d4c094e2e9f25e210ead7-primary.sqlite.bz2 73d30f44b66092492893e3ce0bbf8c20ffd625b7eca70b04c6776e216e1149a4-filelists.xml.gz 858abeedbb1e06aacfff0cd8d90f7948fdcd232f82e1dfb3c4f308cb7d79b314-other.xml.gz 970f7ec74fbca72ff525949a31dcfae8fd98a5ed27674b978e441593b2dddf5d-other.sqlite.bz2 aa9011cf9321a5b1eab983fba6612218dab558a2618a1ad5a5a0d0f6f0026446-primary.xml.gz repomd.xml [root@localhost repodata]# pwd /tmp/CentOS6.6/repodata
对默认的YUM仓库改名,创建自己的地址
[root@localhost yum.repos.d]# mv CentOS-Base.repo CentOS-Base.repo.bak [root@localhost yum.repos.d]# pwd /etc/yum.repos.d [root@localhost yum.repos.d]# cat my.repo [myrepo] name=myrepo baseurl=file:///tmp/CentOS6.6 gpgcheck=0
创建成功
[root@localhost yum.repos.d]# yum repolist Loaded plugins: fastestmirror, refresh-packagekit, security Loading mirror speeds from cached hostfile myrepo | 2.9 kB 00:00 ... myrepo/primary_db | 3.4 MB 00:00 ... repo id repo name status myrepo myrepo 4,184 repolist: 4,184