Linux软件包管理

一、软件包管理

软件包的核心功能:制作软件包;安装、卸载、升级、查询、校验。在系统管理中,软件包管理是非常重要的,是系统管理的基础;我们可以利用软件包做很多事情:例如软件包的安装、更新、查询,以及几个常用的软件包管理工具,比如 system-cofig-packages 、yum 、rpm等的文档目录等;内容包括三个部分:二进制包的管理,源代码包的管理,以及脚本安装。而二进制包又分为rpm包、yum包,这两种包管理各有用处,其中它们的主要区别是:yum包是在线安装的,yum会去网上的yum库去选择自己所需要的包,而rpm所需要的操作比较仔细,我们也要做很多的准备工作。

二、配置文件

1、在讲软件包之前我们先来了解一下配置文件:/etc

帮助文件:/usr/share/man

/usr:全局共享只读

/usr/local:bin,sbin,lib,etc,man:独立的体系

1)、/etc,/bin,/sbin,/lib:系统运行或启动需要用到的程序,这些目录不能挂载额外的分区,必须在根文件系统的分区上;

2)、/usr/目录下的bin,sbin,lib:操作系统核心功能,可以(应该)单独分区;

3)、/usr/local目录下的bin,sbin,lib,etc,man:安装操作系统以后的第三方软件,建议独立分区;

4)、/proc,/sys:伪文件,不能单独分区,默认为空;

5)、/dev:设备,不能单独分区;

udev: 内核识别程序是靠驱动程序;

6)、/home:建议单独分区;

7)、/root:一般不用单独分区;

8)、/var:应该单独分区,里面的日志信息不希望在重新分区时信息的丢失;

9)、/boot:内核,initrd(initramfs)一般情况下单独分区。

2、软件包管理器:打包成一文件:二进制程序,库文件,配置文件,帮助文件;生成数据库,追踪所安装的每一个文件。目前来说比较主流的三大发行版:Redhat,SUSE,Debian。Redhat,SUSE的安装包RPM,而Debian的是dpt。

RPM是软件包管理工具,注意软件包不能混用,SUSE的不能拿到Debian上使用。尽管这些软件包方便了我们安装程序,但这里面还有一个让人非常头痛的问题,那就是依赖关系,如我们开发的时候X依赖与Y的某些库,那怎么办?如果我们只装X能运行起来吗?当然不行啦,所以后面又开发了更高级的东西,前端工具和后端工具来解除这种依赖关系。

前端工具:yum:Yellowdog Update Modifier

后端工具:rpm,dpt

三、rpm命令

由上面所讲的内容我们来看一下rpm命令,rpm命令是管理软件包的,而rpmbuild是创建rpm包的。rpm有一个强大的数据库,存在/var/lib/rpm,rpm包可以安装、查询、卸载、升级、校验、数据库的重建、验证数据报等工作

1、rpm命名规则:包的组成部分包括主包和子包

主包:bind-9.7.1-1.e15.i586.rpm

子包:bind-libs-9.7.1-1.i586.e15.rpm

包名格式:name-version-release.arch.rpm

包名 版本号 发型号

bind-major.minor.release-release.arch.rpm

主版本号:重大改进

次版本号:某个子功能发生重大变化

发型号:修正了部分bug,调整了一点功能

rpm包:有二进制格式;源码格式的:rpm包作者下载源程序,编译配置完成后,制作成rpm包

uname -r:查看内核版本号

[root@server57 ~]# uname -r

2.6.18-308.el5

uname -a:查看系统平台版本

clip_p_w_picpath002

2、rpm安装:前提是这个包你得有

rpm -i /path/to/PACKAGE_FIEL(软件包路径)

-h:以#显示进度,每个#表示2%

-v:显示详细信息

-vv:显示更详细的信息

我们也可以把这些子命令放在一起如rpm -ivh /path/to/PACKAGE_FIEL(软件包路径)下面我们先在ftp上下载一个软件包,然后进行安装(lftp 172.16.0.1;

get:下载到本地;mget:下载多个 ;cd pub/Server ;get 文件名)

clip_p_w_picpath004

clip_p_w_picpath006

如果有依赖关系的包我们还要强行安装时,我们就要使用--nodeps:忽略依赖关系,但安装的软件包不能用,因为它所依赖的软件包没有安装

clip_p_w_picpath008

rpm –ivh --replacepkgs:重新安装,替换原有安装

clip_p_w_picpath010

rpm –ivh --force:强行安装,可以实现重装或降级;用法同上

rpm –ivh --test:仅测试是否有依赖关系,不安装;用法同上

3、查询:

rpm -q PACKAGE_FILE(不能使用软件包路径,使用软件包名称):查询指定包是否已经安装

如[root@server57 ~]# rpm -q zsh

zsh-4.2.6-6.el5

rpm -qa :查询已经安装的所有包

如rpm -qa | grep ”^z";查询以z开头的软件包

[root@server57 ~]# rpm -qa | grep "^z"

zlib-1.2.3-4.el5

zip-2.31-2.el5

zenity-2.16.0-2.el5

zsh-4.2.6-6.el5

rpm -qi 软件包名称:查询指定包的说明信息

如[root@server57 ~]# rpm -qi zsh

Name : zsh Relocations: (not relocatable)

Version : 4.2.6 Vendor: Red Hat, Inc.

Release : 6.el5 Build Date: Sa

rpm -ql 软件包名称:查询指定包安装后生成哪些文件列表

[root@server57 ~]# rpm -ql zsh

/bin/zsh

/etc/skel

rpm -ql 软件包名称 | less:查看软件包安装时生成的文件列表

rpm -qc 软件包名称:查询指定包安装的配置文件

[root@server57 ~]# rpm -qc zsh

/etc/skel/.zshrc

/etc/zlogin

/etc/zlogout

/etc/zprofile

/etc/zshenv

/etc/zshrc

rpm -qd 软件包名称:查询指定包安装的帮助文件

[root@server57 ~]# rpm -qd zsh

/usr/share/doc/zsh-4.2.6/BUGS

/usr/share/doc/zsh-4.2.6/CONTRIBUTORS

/usr/share/doc/zsh-4.2.6/FAQ

/usr/share/doc/zsh-4.2.6/FEATURES

rpm -q --scripts 软件包名称:查询指定包中包含的脚本

rpm -qf /path/to/somefile:查询指定的文件是由哪个rpm包安装生成的

[root@server57 ~]# rpm -qf zsh-4.2.6-6.el5.i386.rpm

file /root/zsh-4.2.6-6.el5.i386.rpm is not owned by any package

如果某个rpm包尚未安装,我们需要查询其说明信息、安装以后会生成的文件

rpm -qpi /path/to/package_file:

i:软件包的信息

rpm -qpl /path/to/package_file:(软件包安装需要的文件)

4、升级

rpm -Uvh /path/to/new_package_file:如果装有老版本的,则升级,否则,安装

rpm -Fvh /path/to/new_package_file:如果装有老版本的,则升级,否则,退出

rpm –ivh --force /path/to/new_package_file:强行安装,覆盖掉原有软件包。

clip_p_w_picpath012

如果升级以后不能用怎么办?那就降级:rpm –Uvh --oldpackage:降级

clip_p_w_picpath014

查看是否降级成功:

clip_p_w_picpath016

5、卸载

rpm -e package_name:如果软件包有依赖关系,则不要卸载,否则软件包不能用,若要强行卸载用rpm -e --nodeps package_name

--nodeps:忽略依赖关系

6、校验

rpm -V 包名:校验文件是否被非法改过

如果我们把zsh包里的/usr/share/zsh/4.2.6/functions/zkbd文件删除,把/usr/share/zsh/4.2.6/functions/zfmark文件修改看看会出现什么情况?

S file Size differs:文件大小改变

M Mode differs (includes permissions and file type):模式改变(权限和文件类型)

5 MD5 sum differs:MD5码改变

D Device major/minor number mismatch:设备文件主次版本号不匹配

L readLink(2) path mismatch:链接路径不匹配

U User ownership differs:属主改变

G Group ownership differs:属组改变

T mTime differs:最近一次的修改时间改变

clip_p_w_picpath018

7、创建数据库:/var/lib/rpm

ls /var/lib/rpm

rpm --rebuilddb:创建数据库,坏了或执行此命令,就一定会重新建立。

rpm --initdb:初始化数据库,没有才建立,有就不用建立

8、检验来源合法性,及软件包完整性:

加密类型:

对称:加密解密使用同一个密钥

公钥:一对密钥:公钥,私钥;公钥隐含于私钥中可以提取出来,并公开出去;

公钥加密速度慢,需要身份验证

单向:单向加密提取MD5码

ls /etc/pki/rpm-gpg/:中有这个命令RPM-GPG-KEY-redhat-release,你把它导入到rpm命令中去(RPM-GPG-KEY是公钥)

如果一个软件包每有keys,是否能检查出其完整性吗?rpm -K 未安装的包:

clip_p_w_picpath020

那我们就先把秘钥导入:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release(只能验证红帽rpm包)

检验:

clip_p_w_picpath022

[root@server57 ~]# rpm -K zsh-4.2.6-6.el5.i386.rpm

zsh-4.2.6-6.el5.i386.rpm: (sha1) dsa sha1 md5 gpg OK

注意:

dsa,gpg:验证来源合法性,也即验证签名;也可以使用--nosignature,略过此项

sha1,md5:验证软件包完整性;可以使用--nodigest,略过此项

rpm –K --nosignature zsh-4.2.6-6.el5.i386.rpm

rpm –K --nodiges zsh-4.2.6-6.el5.i386.rpm

四、yum

1、关于yum:

Yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基于rpm包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。yum所依赖的不是包而是rpm能力, yum的特点是:可以同时配置多个资源库;简洁的配置文件(/etc/yum.conf);使用方便;保持与RPM数据库的一致性。

2、yum仓库中的元数据文件:

primary.xml.gz:当前仓库所有RPM包的列表;各种依赖关系;每个RPM安装生成的文件列表

filelists.xml.ga:当前仓库中所有RPM包的所有文件列表;

other.xml.gz:额外信息,RPM包的修改日志

repomd.xml:记录的是上面三个文件的时间戳和校验和

comps*.xml:RPM包分组信息

3、配置yum仓库:下面这四个路径,每个路径都独立的yum园

ftp://172.16.0.1/pub/{Server,VT,Cluster,ClusterStorage}

如果我们想要本地主机要想使用自己的路径来当做安装rpm包时yum仓库的话,就需要告诉yum库本地目录有哪些yum库可用。

yum 的配置文件 /etc/yum.conf

[main]:核心片段

cachedir=/var/cache/yum:缓存路径

keepcache=0:是否保存缓存区中的文件

debuglevel=2:调试级别

logfile=/var/log/yum.log:日志

distroverpkg=redhat-release:发行版版本号的名称

tolerant=1:容错

exactarch=1:精确的,严格检查平台版本

obsoletes=1:过期的要不要废弃

gpgcheck=1:要不要检查

plugins=1:提供插件

# Note: yum-RHN-plugin doesn't honor this.

metadata_expire=1h

# Default.

# installonly_limit = 3

# PUT YOUR REPOS HERE OR IN separate files named file.repo

# in /etc/yum.repos.d(如果需要给你的yum库提供操控配置文件的话,请把它们放在不同的文件里面,并命名为file.repo)

4、如何为yum定义repo文件

[Repo_ID]:标识

name=Description(真正意义上的名称)

baseurl=ftp://(repo所在的位置)

http://

file:///:第三个/是根路径(本地路径)

enabled={0|1}0表示禁用,1表示启用

gpgcheck={0|1}:检查gpg完整性

gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release

5、yum命令

yum [options] [command] [package ...]

yum list :列表

all:默认是all

available:可用的,仓库中有尚未安装的

installed:已经安装的

updates:可用的升级

yum clean :清理缓存

yum repolist:显示repolist列表

all

enabled:默认

disabled

安装:yum install 包名:可以解决依赖关系,并把所依赖的软件包都安装好。

如我们安装一个有依赖关系的包进行安装:yum install php53-mysql

clip_p_w_picpath024

出来好依赖关系,开始下载与其有关的包,最后安装完成。

clip_p_w_picpath026

yum 中也有一个选项是 –y :自动回答为yes

yum –nodeps:

升级: yum update :升级

update_to:升级为指定版本

卸载: yum remove|erase 包名:

provides|whatprovides:指定文件或特性是由哪个包生成的

如:yum provides /etc/inittab

groupinfo:显示组信息

yum groupinfo "Development Tools"

grouplist:组列表

groupinstall:

yum groupinstall "Development Tools""Development Libraries" -y

groupremove:

groupupdate:

localinstall:本地安装

yum localinstall php53-mysql-5......:可以解决依赖关系

6、定义一个yum库(进入yum.repos.d :cd /etc/yum.repos.d,在yum.repos.d下编辑)vim server.repo

[Server]

name=Server

baseurl=ftp://172.16.0.1/pub/Server

enabled=1

gpgcheck=0

编辑完成后用yum list | less:分页查看yum

clip_p_w_picpath028

也可以添加一个VT

[Server]

name=Server

baseurl=ftp://172.16.0.1/pub/Server

enabled=1

gpgcheck=0

[VT]

name=VT

baseurl=ftp://172.16.0.1/pub/VT

enabled=1

gpgcheck=0

clip_p_w_picpath030

yum repolist命令:

clip_p_w_picpath032

7、如何以光盘做yum库

先把光盘挂载上

mkdir /media/cdrom

mount –r /dev/cdrom /media/cdrom

之前我们在yum.repos.d中编辑过Server.repo ,如果我们把它改名为Server.repo.backup:mv Server.repo Server.repo.backup,此时这个文件就不能用了,这时我们就要用到光盘。

vim cd.repo

[Server]

name=Server

baseurl=file:///media/cdrom/Server

enabled=1

gpgcheck=0

8、如何创建yum 仓库:

createrepo:这是一个rpm包,不用进入yum.repos.d就可以创建

clip_p_w_picpath034

clip_p_w_picpath036

我们举个例子:我们创建一个目录 (这是空目录)我们把/media/cdrom/VT/*.rpm复制到/yum/VT/ ,步骤如下:

mkdir –pv /yum/VT

cp /media/cdrom/VT/*.rpm /yum/VT/

cd /etc/yum.repos.d

vim cdrom.repo

[Base]

name=Server

baseurl=file:///media/cdrom/Server

enabled=1

gpgcheck=0

[VT]

name=VT

baseurl=file:///yum/VT

enabled=1

gpgcheck=0

创建yum园

createrepo /yum/VT/

ls /yum/VT/

yum clean all

yum repolist

cd /media/cdrom/VT/repodata/

ls

cp comps-rhel5-vt.xml /root

cd

createrepo -g /root/comps-rhel5-vt.xml /yum/VT/

五、rpm安装

二进制格式:别人已经将源码编译好的,有些特性是在编译时选定的,如果编译未选定此特性,rpm包将无法使用;rpm包的版本会落后于源码包,甚至落后很多,这时我们就要定制了:即手动编译安装,而编译要用到编译环境或开发环境。

make:项目管理工具

makefile:配置文件,定义了make(gcc,g++)按何种次序去编译这些源程序文件中的源程序(makefile并不属于程序)

automake:可以生成makefile.in(半成品,还不完善)-->mkefile

autoconf-->configure

make install 安装

编译安装的三步骤

前提:准备开发环境(编译环境)

tar :归档解压缩

cd

./configure:功能:让用户选定编译特性;检查编译环境;

--help:获取使用格式

--prefix=/path/to/somewhere

--sysconfdi=/path/to/confile_path

make

make install

例如:

安装“Development Tools”和“Development Libraries”

yum groupinstall “Development Tools” “Development Libraries”

下载tengine-1.2.1.tar.gz

#tar xf tengine-1.4.2.tar.gz(归档解压缩)

# cd tegnine-1.4.2

./configure --prefix=/usr/local/tengine --conf-path=/etc/tengine/tengine.conf --without-http_rewrite_module(有某种关系,类似于依赖)

# make

# make install

#cd /usr/local/tengine

ls

cd sbin/

pwd

vim /etc/profile

clip_p_w_picpath038

/pub/source/Tengine

/etc/profile

PATH=$PATH:/usr/

1、修改PATH环境变量,以能够识别此程序的二进制文件路径

修改/etc/profile文件

在/etc/profile.d/目录建立一个以.sh为后缀的文件,在里面定义

2、默认情况下,系统搜索库文件的路径/lib,/usr/lib;要增添额外搜索路径

在/etc/ld.so.conf.d/中创建以.conf为后缀名的文件,而后把要增添的路径直接写至此文件中;

#ldconfig通知系统重新搜索库文件

-v:显示重新搜寻库的过程

3、头文件:输出给系统

默认:/usr/include

增添头文件搜寻路径,使用链接进行

两种方法:

ln -s /usr/local/tengine/include/* /usr/include:每一个文件都链接

ln -s /usr/local/tengine/include/ /usr/include/tengine:给目录创建链接

4、man 文件路径:默认安装在--prefix指定的目录下的man目录:/usr/share/man

1、man -M /path/to/man_dir command

2、在/etc/man.config中添加一条MANPATH

例题:

[root@server57 ~]# tar xf httpd-2.2.16.tar.bz2

[root@server57 ~]# cd httpd-2.2.16

[root@server57 httpd-2.2.16]# rpm -q httpd:查看是否安装此软件包

[root@server57httpd-2.2.16]#./configure--prefix=/usr/local/apach--sysconfdir=/etc/httpd

[root@server57 httpd-2.2.16]# make

[root@server57 httpd-2.2.16]#make install

[root@server57httpd-2.2.16]#cd /usr/local/apache

[root@server57 apach]# vim /etc/profile.d/httpd.sh

export PATH=$PATH:/usr/loacl/apache/bin

完成,退出一下,重新登录,查看:

clip_p_w_picpath040

导出

[root@server57 ~]# ldconfig –v

[root@server57 apach]# vim /etc/ld.so.conf.d/httpd.conf

/usr/loacl/apache/lib

[root@server57 apach]# ldconfig -v | grep apr

[root@server57 apach]# ln -sv /usr/local/apach/include/ /usr/include/httpd

[root@server57 apach]# vim /etc/man.config

clip_p_w_picpath042

netstat命令:跟网络相关

-r:显示路由表

-n:用数字的形式显示

-rn:显示路由表而不会显示主机名

-t:建立的TCP链接

-u:显示UDP连接

-l:显示监听状态的连接

-tl:显示监听TCP状态的链接

-ul:显示监听UDP状态的链接

-tul:TCP和UDP都显示

-p:显示监听指定的套接字的进程的进程号及进程名

clip_p_w_picpath044

clip_p_w_picpath046