ubuntu软件包管理
apt
先介绍下apt,apt(Advanced Package Tool)高级软件包工具,是一组用来下载、安装、删除和升级软件包以及报告软件包状态的工具,apt不是一个具体的命令,是由一组命令组成的包管理工具集,较常用的有apt-get,apt-cache。apt主要负责下载软件包,而下载到本地之后,就会的调用dpkg来处理软件包。
/etc/apt/sources.list
/etc/apt/sources.list这个文件指定apt查找或安装某个软件包时要搜索的仓库,里面每一行定义一个仓库。仓库就是存放着一组软件包及其相关信息,包括用来描述每个软件包的头部信息、包之间的依赖关系。Ubuntu仓库里面的软件包可以划分为以下几个类别:
1)main #Ubuntu支持的开源软件
2)universe #由社区维护的开源软件
3)multiverse #存在版权限制或法律问题的软件
4)restricted #专有设备驱动程序
5)backports #较新的Ubuntu发行中有的但较早发行中不存在的软件包
apt在选择软件包时,根据sources.list文件中指定的类别来搜索各个仓库。当试图安装某个软件包时,可能会出现以下错误信息:
root@baby-Inspiron-N5110:~# apt-get install xxxReading package lists... DoneBuilding dependency tree Reading state information... DoneE: Unable to locate package xxx
这意味着sources.list文件中定义的任何一个仓库都不包含该软件包,如果没有使用最新版本的ubuntu,也有可能该软件包只能在最新版本中才能使用。尝试在sources.list文件中启动backports仓库。
sources.list文件定义仓库的格式如下:
type URL repository category-list
type=deb #可执行文件的软件包
type=deb-src #源码文件包
URL #指定仓库的位置,通常是一个网址
repository #apt要搜索的仓库的名称
category-list #软件包类别(main,universe,multiverse,restricted,backports多个的话用空格符隔开)
deb http://security.ubuntu.com/ubuntu precise-security main restricted
上面这一行内容来自sources.list文件,他的含义是让apt搜索位于http://security.ubuntu.com/ubuntu的precise-security仓库,查找包含可执行文件的deb软件包。可接受的软件包类别为main,restricted。若把deb替换为deb-src,apt会以同样的方式搜索源文件包,通过命令apt-get source下载源码包。
apt本地软件包索引和apt缓存
/var/lib/apt/lists目录下存放着本地软件包索引及其相关文件。对于/etc/apt/sources.list文件中列出的每一个仓库,这个目录都有一个文件列出这个仓库中的每个软件包的最新版本信息。apt使用这些文件来判断系统中的软件包以及它的缓存中的软件包是否是最新版本。当sources.list文件添加新的仓库时,可使用apt-get update或aptitude update命令来同步/var/lib/apt/lists目录下的索引和仓库中的相关信息,好让apt能够下载新添加的仓库中的软件包。
apt的缓存存放在/var/cache/apt/archives目录中,里面是最近下载的deb文件。默认情况下,apt的cron脚本对这个目录的大小以及这个目录中文件的有效期有一定的限制。
在Ubuntu Linux中,需要说明一个概念--虚拟软件包。
将系统中具有相同或相近功能的多个软件包作为一个软件包集合,称为虚拟软件包,并指定其中一个软件包作为虚拟软件包的默认首选项。提出虚拟软件的意图就是为了防止软件安装过程中发生冲突。例如,exim、sendmail和postfix软件包都是用于邮件传输代理,将"mail-transport-agent"指定为它们的虚拟软件包。当用户安装"mail-transport-agent"时,将选择安装exim、sendmail和postfix其中的首选项。
apt配置文件
apt的配置文件存放在/etc/apt/apt.conf.d目录下。apt cron脚本存放在/etc/cron.daily目录中,这样每天都能运行该脚本,它读取apt.conf.d目录中的配置文件,并根据这些配置文件中的指令来维护apt本地软件包索引以及缓存。
下面的这两个文件控制着apt cron脚本如何维护apt本地软件包索引和apt缓存:
root@baby-Inspiron-N5110:/etc/apt/apt.conf.d# cat 10periodic APT::Periodic::Update-Package-Lists "0";APT::Periodic::Download-Upgradeable-Packages "0";APT::Periodic::AutocleanInterval "0";root@baby-Inspiron-N5110:/etc/apt/apt.conf.d# cat 20archive APT::Archives::MaxAge "30";APT::Archives::MinAge "2";APT::Archives::MaxSize "500";
APT::Periodic::Update-Package-Lists "days";
#每days天将本地软件包索引与它们对应的仓库同步。days为0,禁用这个命令。
APT::Periodic::Download-Upgradeable-Packages "days";
#每days天下载升级系统中所有软件包所需的软件包(不安装)。days为0,禁用这个命令。
APT::Periodic::AutocleanInterval "days";
#每days天清除不再能下载的那些软件包的apt缓存。days为0,禁用这个命令。
APT::Archives::MaxAge "days";
#将days天之前的文件从apt缓存中删除。days为0,禁用这个命令。
APT::Archives::MinAge "days";
#不要将days天之内的文件从apt缓存中删除。days为0,禁用这个命令。
APT::Archives::MaxSize "MB";
#设置apt缓存的最大尺寸。当缓存增加超过MB兆字节的时候,apt cron脚本会删除文件知道缓存的尺寸小于这个尺寸。它首先删除那些尺寸最大的文件。MB为0,禁用这个命令。
aptitude的使用
aptitude是一款基于apt的包挂管理工具,功能类似于apt-get,这要用于软件包的管理。aptitude有两个界面:伪图形界面和文本界面。这里仅介绍文本界面。aptitude工具的日志记录在/var/log/aptitude中,日志的可读性非常好。
aptitude autoclean #清除不再能够下载的那些软件包的apt缓存。
aptitude clean #将所有软件包从apt缓存中删除
aptitude download #下载某个软件包的deb文件
aptitude upgrade #升级指定的软件包
aptitude full-upgrade #升级系统中所有软件包,并按需安装新的软件包
aptitude safe-upgrade #升级系统中所有软件包,不安装新的软件包
aptitude install #安装指定的软件包以及软件包依赖的所有软件包
aptitude reinstall #重新安装指定的软件包
aptitude purge #删除指定的软件包包括配置文件
aptitude remove #删除指定的软件包,包括它依赖的软件包,不删除配置文件
aptitude search #查找软件包,在sources.list指定的仓库寻找
aptitude show #显示软件包的详细信息,包括依赖信息
aptitude update #将本地apt软件包索引文件与仓库中的文件同步
当aptitude删除删除某软件包的时候,也会删除在安装该软件包时自动安装的依赖软件包。
要注意这么几项:
1)aptitude update:apt corn脚本会在夜间自动执行软件包索引文件的同步,但是若在/etc/apt/sources.list中添加了新的仓库后,想要立即使用,必须运行这个命令。
2)aptitude safe-upgrade与full-upgrade的区别在于aptitude full-upgrade在升级所有软件包时,为了满足依赖关系会安装一些尚未安装的软件包,而aptitude safe-upgrade只升级系统中所有只依赖于已安装到系统中的软件包的那些软件包,这条命令不会安装新的软件包。
3)aptitude search package-list通过此命令在搜索时,仓库中的每个软件包名与package-list中的某个元素匹配的软件包都会显示一行信息:
root@baby-Inspiron-N5110:/tmp# aptitude search apachep apache2 - Apache HTTP Server metapackage p apache2:i386 - Apache HTTP Server metapackage v apache2-dev - v apache2-dev:i386 - p apache2-doc - Apache HTTP Server documentation v apache2-mpm - v apache2-mpm:i386 - p apache2-mpm-event - Apache HTTP Server - event driven model ......
每行的第一列中的字母给出了对应软件包在系统中的状态:i说明已经安装,c表示出了配置文件之外其余已删除,p表示已清除(包括配置文件),v表示虚拟软件包。第一列第二个字母给出了将要对相应软件包执行的存储动作。如果第3个字母为A,就意味着对应软件包曾经自动安装过。
apt-cache
apt-cache是linux下的一个apt软件包管理工具,它可查询apt的二进制软件包缓存文件。APT包管理的大多数信息查询功能都可以由apt-cache命令实现。apt-cache使用的缓存信息由apt-cache gencaches命令生成,这些缓存信息来自于/etc/apt/sources.list文件中指定的源(仓库),这些缓存信息包括每个仓库包含的所有软件包的详细信息及其依赖关系等。缓存信息存放于/var/lib/dpkg/status。
若将/var/lib/dpkg/status删除或改成其他文件名,apt-cache这个命令也就会失去作用:
root@baby-Inspiron-N5110:/var/lib/dpkg# apt-cache show bind9E: Could not open file /var/lib/dpkg/status - open (2: No such file or directory)E: The package lists or status file could not be parsed or opened.E: No packages found
错误信息显示,无法打开/var/lib/dpkg/status文件!!!
apt-cache主要用法:
Commands:
gencaches #重新构建源码包和代码包的缓存
showpkg #显示单个软件包信息(包括包的信息,正向依赖包和反向依赖包等)
showsrc #显示源文件的各项记录(包括版本号、安装状态及包依赖关系等)
stats #显示一些基本的统计信息
dump #简要显示整个缓存文件的内容
dumpavail #把所有有效的包文件列表打印到标准输出
unmet #显示所有未满足的依赖关系
search #搜索软件包,可用正则表达式
show #以便于阅读的格式介绍该软件包
depends #显示指定软件包所依赖的软件包(正向依赖包)
rdepends #显示软件包的反向依赖关系,即有什么软件包需依赖你所指定的软件包
pkgnames #列出所有软件包的名字(通过管道过滤查看软件仓库是否包含该软件包)
dotty #生成可用 GraphVis 处理的软件包关系图
xvcg #生成可用 xvcg 处理的软件包的关系图
policy #显示软件包的安装设置状态
Options:
-h #显示帮助文档
-p=? #软件包缓存.
-s=? #源码包缓存.
-q #让输出可作为日志 - 不显示进度
-i #只显示未满足依赖关系的重要信息.
-c=? #读取指定配置文件
-o=? #设置任意指定的配置选项,例如 -o dir::cache=/tmp
apt-file
apt-file是一款专门用于软件包搜索的工具,它的用法与apt-cache类似,先通过apt-file update命令依照/etc/apt/sources.list文件中指定的源生成缓存信息,存放于/var/cache/apt/apt-file目录下,查询时直接访问这些缓存信息。
apt-file的主要用法:
apt-file update #根据/etc/apt/sources.list文件中指定的源更新缓存
apt-file search #查询某个文件来自于哪个软件包(类似于dpkg -S filename,但是apt-file查询时这个软件包可以不安装)
apt-file find #同search
apt-file list #查询某个软件包会生成哪些文件(类似dpkg -L,但apt-file查询时这个软件包可以不安装)
apt-file show #同list
apt-file purge #清空缓存
option:
--cache | -c cache-directory #指定缓存放置的目录,默认是/var/cache/apt/apt-file
--ignore-case | -i #查询时忽略大小写
--sources-list | -s sources.list #指定配置软件包仓库的文件,默认/etc/apt/sources.list。
其他的选项可以通过man查询。
apt-get
apt-get是apt众多的工具中最常用的一个,这也是一个包管理工具。两个相关目录:本地软件包索引位于/var/lib/apt/lists目录下,最近下载的软件包缓存于/var/cache/apt/archives目录下,这两个上面已经介绍。
apt-get用法:
Commands:
apt-get update #更新本地软件包索引/var/lib/apt/lists
apt-get upgrade #更新所有已安装的软件包
apt-get install #安装软件包
apt-get remove #删除软件包(不删除配置文件,也不删除依赖的软件包)
apt-get remove --purge #删除软件包(删除配置文件,不删除依赖的软件包)
apt-get autoremove --purge #删除软件包(删除配置文件,删除依赖的软件包)
apt-get source #下载该包的源代码
apt-get build-dep #安装package编译需要的相关的编译环境
apt-get dist-upgrade #更新所有已安装的软件包
apt-get clean #清理缓存(清空/var/cache/apt/archives/和/var/cache/apt/archives/partial/这两个目录)
apt-get autoclean #清理缓存(只清理/var/cache/apt/archives/目录下无法在下载的软件包)
apt-get check #更新apt缓存,检查是否有损坏的依赖关系
apt-get download #下载软件包至当前目录下
dpkg:debian软件包管理系统
debian软件包管理系统(dpkg)数据库记录了哪些软件包安装到系统中、每个软件包安装到什么位置、安装的版本以及依赖于哪些软件包。debian软件包管理系统有很多管理工具,这些工具用于安装、卸载、升级、查询和验证软件包。最初也是最主要的管理工具就是dpkg。虽然dpkg可以完成软件包管理的大部分任务,但是其他工具可以让你更容易地完成任务。这些工具有:apt-cache,apt-file,aptitude,apt-get。这些工具上面都已经介绍,下面来介绍下dpkg。
dpkg管理系统处理.deb格式的文件,这些文件通常被称为deb文件。因为dpkg不能从仓库中下载deb文件,所以由aptitude,apt-get这些工具来执行这项任务。默认情况下,下载的deb文件存放在/var/cache/apt/archives目录下。然后由dpkg完成后续的安装,它会将可用软件包信息存放到/var/lib/dpkg/available,并将软件包安装信息存放到/var/lib/dpkg/status中。
另外,再强调一下,这个/var/lib/dpkg/status文件非常重要,这相当于一个缓存文件,dpkg软件包管理系统在包的状态发生改变后,例如删除了某包,安装了某包,本地软件包索引发生了改变,都会去更新这个文件,很多工具的查询信息都来自于这个文件,例如aptitude show,aptitude search,dpkg -l|--list,apt-cache的几乎所有的命令等。
dpkg涉及到的几个文件:
/etc/dpkg/dpkg.cfg #dpkg的配置文件
/var/log/dpkg.log #dpkg的默认日志文件(在配置文件中定义)
/var/lib/dpkg/available #可获取的软件包列表
/var/lib/dpkg/status #可获取的软件包的状态信息描述文件(apt-cache的相关查询就是基于这个文件的内容)
dpkg用法:
dpkg -i|--install packageName.deb #安装指定软件包
dpkg -r, --remove, -P, --purge #删除软件包(--remove,-r,保留配置文件。-P, --purge连同配置文件一起删除)
dpkg --update-avail #更新可用软件包列表
dpkg -l|--list #显示软件包的相关信息,若后面不加包名,则显示所有软件包的相关信息(包括安装和没有安装的)
dpkg --info|-I packageName.deb #显示指定软件包的信息,后面要指定包名,例:dpkg --info
dpkg --status|-s #显示软件包的相关信息(仅限于安装的软件包)
dpkg -L #查询系统中已安装的软件包所安装的位置(仅限于已安装的软件包,不同于apt-file list)
dpkg --search|-S filename #查询某个文件来自于哪个软件包(仅限于已安装的软件包,不同于apt-file search)
当用dpkg -l|--list列出软件包的相关信息时,有一定的格式简单介绍下
root@baby-Inspiron-N5110:/tmp# dpkg --list "bind*"Desired=Unknown/Install/Remove/Purge/Hold| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)||/ Name Version Description+++-===========================-===========================-======================================================================un bind(no description available)un bind9 (no description available)un bind9-doc (no description available)ii bind9-host 1:9.8.1.dfsg.P1-4ubuntu0.10 Version of 'host' bundled with BIND 9.Xii bind9utils 1:9.8.1.dfsg.P1-4ubuntu0.10 Utilities for BIND
上面的命令是列出所有以bind开头的软件包,头部的第1行列出了可能的软件包期望状态,第2行列出了可能的软件包状态。每条信息的第一列为desire,第二列为status。上面第一列的u表示dpkg未识别的包,状态列的n表示尚未安装该包。第1列和第2列意思差不多表示该包已安装。
Desire(选择状态)u(unknown dpkg不知道的包i(install) 已安装r(remove) 已删除,但是保留配置文件p(purge) 已删除,未保留配置文件h(hold) 不由dpkg处理Status(软件包状态)n(not install) 尚未安装i(installed) 已安装c(config-files) 没有安装,系统中只有配置文件u(unpacked) 解包,但没有配置f(failed-config) 解包,没有配置,配置失败h(half-installed) 部分安装,安装尚未完成
常用的就这些,需要更详细的信息可以man dpkg~~~