Linux入门之软件包管理
在linux有很多类的软件包管理机制,但是在redhat、centos这类版本的系统中,都会使用一种相同的机制,就是rpm软件包管理机制,当然,还有其它版本的linux使用的不同机制:
debian:使.deb文件,dpkg包管理器
redhat:使用.rpm文件,rpm包管理器
软件包在使用中又分类两种(源码包和二进制包):
源码包:一般是提供了一些源码模块和编译脚步组合起来的压缩文件,命令格式如:
name-version.tar.{gz|bz2|xz} 等,这里列举出来一个源码包:
[root@localhost ~]# ls -l tengine-1.4.2.tar.gz
-rw-r--r-- 1 root root 1185902 Aug 15 18:57 tengine-1.4.2.tar.gz
二进制rpm包:实现被编译包的,功能模块事先已经被设置好的软件,命令格式如:
rpm包的组成:
主包:
name-version-release.arch.rpm 例如:
bind-9.7.1-1.e15.i586.rpm
子包:
name-toolname-9.7.1-1.e15.i586.rpm 例如:
bind-libs-9.7.1-1.e15.i586.rpm
bind-utils-9.7.1-1.e15.i586.rpm
包名格式:
name-version-release.arch.rpm
bind-major.minor.release-release.arch.rpm
版本号说明:
主版本号:软件包有重大改进
此版本号:某个子功能发生重大变化
发行号:修正了部分bug,调整了一点功能
软件管理器的核心功能:
1、制作软件包;
2、安装、卸载、升级、查询、校验;
注意:rpm包自身有依赖关系,及安装软件包时需要先安装其依赖的软件包
软件包工具分类:
前段工具:yum,apt-get
后端工具:rpm,dpt
rpm命令:
rpm rpmduild
rpm数据库:/var/lib/rpm
注意:/var/lib/rpm中的某些文件如果只是被破坏,可以通过命令来创建或初始化数据库,但是文件如果都被删除,其数据库信息将无法恢复,因此,要时常对此做备份
rpm命令使用方法:
1、安装:
rpm -i /PATH/TO/PACKAGE_FILE 注意:这里是软件包文件的路径
-h:以#符号显示进度,每个#符号表示2%进度
-v:显示详细过程
-vv:显示更为详细的过程
rpm -ivh /PATH/TO/PACHAGE_FILE 提示:这里一般组合使用显示其安装状态
--nodeps:忽略依赖关系;
--replacepkgs:重新安装,替换原有安装;
--replacefiles:会替换原有文件;
--force:强行安装,可以实现重装或降级;
--nosgnature:不检查来源的合法性
--nodigest:不检查完整性
--noscripts:不执行程序包脚步
%pre:安装前脚步;--nopre
%post:安装后脚本;--nopost
%preun:卸载前脚步;--nopre
%postun:卸载后脚步;--nopost
注意:有时对于来源不明的软件包,可以使用以上选项来防止软件包里的危险程序
2、升级:
rpm -Uvh /PATH/TO/NEW_PACKAGE_FILE:如果装有老版本的,则升级,否则重装
rpm -Fvh /PATH/TO/NEW_PACKAGE_FILE:如果有老版本的,则升级,否则退出
--oldpackage:降级
注意事项:
1、不要对系统内核进行升级或降级安装,Linux执行多内核并存,因此直接安装新内核即可
2、如果对kernel升级,升级前如果改变了原内核中配置文件,那么升级后,原内核的配置文件将被重命名为filename.rpmnew的文件,而使用新内核的文件
3、查询
rpm -q PACKAGE_NAME:查询指定包是否已经安装
rpm -qa:查看已经安装的所有软件包
rpm -qi PACKAGE_NAME:查询指定包的安装包的说明信息;
rpm -ql PACKAGE_NAME:查询指定包安装后生成的文件列表;
rpm -qc PACKAGE_NAME:查询指定包安装后生成配置文件;
rpm -qd PACKAGE_NAME:查询指定包安装的帮助文件;
rpm --scripts PACKAGE_NAME:查询指明包中包含的脚步
rpm -qf /PATH/TO/SOMEFILE:查询指定的文件是由哪个rpm包安装以后生成的;
rpm --whatprovides CAPABILTTY :查询关键字或命令是由哪个包替换
rpm --whatrequires CAPABILTTY:查询指定包或命令是被哪个包所依赖
如果包尚未安装,我们需要查询其说明信息、安装以后会生成的文件:
rpm -qpi /PATH/TO/PACKAGE_FILES 查看软件包文件信息
rpm -qpl /PATH/TO/PACKAGE_FILES 查看软件包安装后生成哪些文件
如果安装后的文件有所丢失,而又有配置而不像重装去覆盖文件,可以通过工具处理:
rpm2cpio 包文件|cpio -itv 预览包文件
rpm2cpio 包文件|cpio -idv “*.conf” 展开包文件
注意:里面可以是特定路径或者文件通配符
rpm --scripts /PACKAGE_NAME:查询包生成的脚步文件
-R:查询指定的程序包所依赖库及软件
--provides:列出指定程序包提供的工具、命令
--changelog:查询rpm包的更改信息
4、卸载
rpm -e PACKAGENAME
rpm --erase PACKAGENME
--nodeps:忽略依赖关系任然卸载
--test:只是测试卸载过程,并不真正卸载
--noscripts:卸载时不运行过程脚步
--notriggers:不启动触发器
--allmatches:卸载全部与其相配的文件
5、校验
rpm -V PACKNAME PACKAGE_NAME
信息说明:
S 表示软件更改信息
M 显示权限信息
5 显示加密信息
D 显示主次设备号
L 显示链接路径数
U 显示包用户
G 显示包用户组
T 显示更改时间
p 显示更新对比属性
6、校验软件包来源合法性,及软件包完整性:
密钥文件:
/etc/pki/rpm-gpg/目录下:
RPM-GPG-KEY-readhat-release
RPM-GPG-KEY-centos-release
检查软件包的完整性:
rpm -K /path/to/rpmfile
信息说明:
dsp, gpg:验证来源合法性,也即验证前面字段,可以使用--nosignature略过此项
sha1, md5:验证软件包完整性,可以使用--nodigest,略过此项
在此之前需要有公钥的存在,可以使用命令导入公钥:
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
卸载公钥:
rpm -qa gpg-pubkey* 找出公钥名称
rpm -e gpg-pubkey...... 卸载公钥
7、重建数据库
数据库文件路径:/var/lib/rpm/
使用命令重建:
rpm
--rebuilddb:重建数据库,一定会重新建立;
--initdb:初始化数据库,没有才建立,有就不建立;
案例:
#挂载CentOS镜像到/mnt/iso文件夹
[root@mzf ~]# mount /dev/cdrom /mnt/iso/ mount: block device /dev/sr0 is write-protected, mounting read-only
#cd进入/mnt/iso目录
[root@mzf ~]# cd /mnt/iso/ [root@mzf iso]# pwd /mnt/iso
#查看软件包存放在Packages中
[root@mzf iso]# ls CentOS_BuildTag EULA p_w_picpaths Packages repodata RPM-GPG-KEY-CentOS-Debug-6 RPM-GPG-KEY-CentOS-Testing-6 EFI GPL isolinux RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Security-6 TRANS.TBL
#cd到此Packages目录中
[root@mzf iso]# cd Packages/
#找出tree软件
[root@mzf Packages]# find ./ -name "tree-1.5.3-3.el6.x86_64.rpm" ./tree-1.5.3-3.el6.x86_64.rpm
#发现已经安装
[root@mzf Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm Preparing... ########################################### [100%] package tree-1.5.3-3.el6.x86_64 is already installed
#那就先卸载此文件
[root@mzf Packages]# rpm -e tree
#再次安装,显示进度安装成功
[root@mzf Packages]# rpm -ivh tree-1.5.3-3.el6.x86_64.rpm Preparing... ########################################### [100%] 1:tree ########################################### [100%]
#安装zsh发现已经被安装过
[root@mzf Packages]# rpm -ivh zsh-4.3.11-4.el6.centos.2.x86_64.rpm Preparing... ########################################### [100%] package zsh-4.3.11-4.el6.centos.2.x86_64 is already installed
#使用--force强制安装并覆盖之前的安装
[root@mzf Packages]# rpm -ivh --force zsh-4.3.11-4.el6.centos.2.x86_64.rpm Preparing... ########################################### [100%] 1:zsh ########################################### [100%]
#查询bind是否已经安装,发现只是一些库和工具
[root@mzf Packages]# rpm -qa | grep '^bind' bind-libs-9.8.2-0.47.rc1.el6.x86_64 bind-utils-9.8.2-0.47.rc1.el6.x86_64
#安装一个服务器配置,显示此包依赖于bind-9.8.2-0.47.rc1.el6 包
[root@mzf Packages]# rpm -ivh bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm error: Failed dependencies: bind = 32:9.8.2-0.47.rc1.el6 is needed by bind-chroot-32:9.8.2-0.47.rc1.el6.x86_64
#那么可以选择一起安装,也可以忽略、强制安装
[root@mzf Packages]# rpm -ivh --nodeps --force bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm Preparing... ########################################### [100%] 1:bind-chroot warning: group named does not exist - using root warning: group named does not exist - using root%) warning: group named does not exist - using root%) warning: group named does not exist - using root%)
说明:虽然装上了,但是显示一些错误信息,因为没有主配置文件,这里我们还是一起安装
[root@mzf Packages]# rpm -ivh bind-9.8.2-0.47.rc1.el6.x86_64.rpm Preparing... ########################################### [100%] 1:bind warning: /etc/sysconfig/named created as /etc/sysconfig/named.rpmnew ########################################### [100%]
#卸载刚才安装的软件
[root@mzf Packages]# rpm -e bind-chroot #没有信息就说明已经安装成功
#检验软件包来源合法性,这里显示正常
[root@mzf Packages]# rpm -K bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm bind-chroot-9.8.2-0.47.rc1.el6.x86_64.rpm: rsa sha1 (md5) pgp md5 OK
#而检验是通过公钥文件来处理的,如果没有这些文件,将会检查失效
[root@mzf Packages]# ls /etc/pki/rpm-gpg/ RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Debug-6 RPM-GPG-KEY-CentOS-Security-6 RPM-GPG-KEY-CentOS-Testing-6
#通过命令导入密钥:
[root@mzf Packages]# rpm --import /mnt/iso/RPM-GPG-KEY-CentOS-6
#查看刚才安装的密钥
[root@mzf Packages]# rpm -qa | grep 'gpg.*key' gpg-pubkey-c105b9de-4e0fd3a3
#卸载此密钥
[root@mzf Packages]# rpm -e gpg-pubkey
如果安装过的软件的某些文件被删除或者破坏,如何只恢复指定文件而不重装?
#查看tree执行文件的路径
[root@mzf Packages]# which tree /usr/bin/tree
#删除出tree执行文件
[root@mzf Packages]# rm -f /usr/bin/tree
#再次执行已经找不到此命令
[root@mzf Packages]# tree -bash: tree: command not found
#通过rpm2cpio将rpm包生成的文件列表写成数据流传给cpio查看
[root@mzf Packages]# rpm2cpio ./tree-1.5.3-3.el6.x86_64.rpm | cpio -tv -rwxr-xr-x 1 root root 41136 Jan 14 2015 ./usr/bin/tree drwxr-xr-x 2 root root 0 Jan 14 2015 ./usr/share/doc/tree-1.5.3 -rw-r--r-- 1 root root 18009 Aug 13 2004 ./usr/share/doc/tree-1.5.3/LICENSE -rw-r--r-- 1 root root 4167 Oct 20 2009 ./usr/share/doc/tree-1.5.3/README -rw-r--r-- 1 root root 3375 Jan 14 2015 ./usr/share/man/man1/tree.1.gz
#根据上面显示时说明展开默认在当前当文件夹
#那么我们切换到家目录
[root@mzf Packages]# cd
#只展开出tree命令
[root@mzf~]#rpm2cpio /mnt/iso/Packages/tree-1.5.3-3.el6.x86_64.rpm | cpio -idv ./usr/bin/tree ./usr/bin/tree 132 blocks
#拷贝这个命令到原来tree命令所在的目录
[root@mzf ~]# cp usr/bin/tree /usr/bin/tree
#发现tree命令又可以使用了
[root@mzf ~]# tree . ├── anaconda-ks.cfg ├── checkdisk.sh
重建库文件
#查询库文件
[root@mzf ~]# ls /var/lib/rpm/ Basenames __db.001 __db.003 Dirnames Group Name Packages Provideversion Requirename Sha1header Triggername Conflictname __db.002 __db.004 Filedigests Installtid Obsoletename Providename Pubkeys Requireversion Sigmd5
#备份移动库文件
[root@mzf ~]# mkdir backup [root@mzf ~]# mv /var/lib/rpm/* backup/
#已经没有任何库文件
[root@mzf ~]# ls /var/lib/rpm/
#初始化库文件
[root@mzf ~]# rpm --initdb [root@mzf ~]# ls /var/lib/rpm/ __db.001 __db.002 __db.003 __db.004 Packages
#重建库文件
[root@mzf ~]# rpm --rebuilddb [root@mzf ~]# ls /var/lib/rpm/ Packages
#查询已经失效
[root@mzf ~]# rpm -qa 说明:这里的重建只是重新生成库文件,但以前的记录已经没有了,这时我们还原
#将刚才的文件再次移动到/var/lib/rpm下
[root@mzf ~]# mv -f backup/* /var/lib/rpm/
#查询之前安装的软件,发现可以查看了
[root@mzf ~]# rpm -qa | grep '^bind.*' bind-libs-9.8.2-0.47.rc1.el6.x86_64 bind-9.8.2-0.47.rc1.el6.x86_64
bind-utils-9.8.2-0.47.rc1.el6.x86_64
注意:这里如果只是一点文件或者锁文件破坏,还可以使用重建数据库拯救,但是如果/var/lib/rpm里的文件都被删除了,就算重建了,记录是找不回来的,这时就需要对库文件进行备份了