您的位置:首页 > 其它

Ubuntu探秘之二:软件包管理系统

2012-07-05 10:08 344 查看
在我们探秘之旅开始之前,了解自己系统上安装了哪些软件包、各个软件包的作用以及该软件包安装了哪些文件及目录是非常有用和重要的。以后的每一次探秘我都会用到这些命令以列出我的ubuntu10.04系统上安装的相关软件包,这与你在自己的系统上实验时的结果可能不同。

现在的系统为何要用软件包管理系统呢?

要回答这些问题,需要了解现在的软件开发都非常讲究可重用性,也就是说一个人写的功能代码可能会以库函数的形式发布供别人使用。

最常用的就是glic函数库,它提供了常见的C语言标准库函数。由于这种代码的共享性,就造成成了软件之间的依赖关系即安装本软件前需要安装

为其提供部分功能代码的其它软件。对于现在的很多软件这种依赖关系非常复杂,因为这种关系存在递归性和版本差别。为了解决这种复杂的依赖关系,现代的linux系统都提供了各种软件包管理机制,如REDHAT系列的基于RPM包管理,Debian的deb包管理等。

这次探秘的是基于debian的包管理机制,对于RPM包管理机制,可以参考附件。Ubunt用到的软件包管理工具主要有两个:dpkg和apt

一、首先介绍DPKG

DPKG ---dpkg is a toolto install, build, remove and manage Debianpackages.

功能:

1.安装、移除已下载到本地的软件包。

2.查询、解包已经下载到本地的软件包。

3.维护和保存已经安装到本地的软件包信息。

总之,dpkg是一个底层的软件包管理系统,主要用于对[color=#ff00]已下载到本地和已安装的软件包[/color]进行管理.

(1)、最常用选项:

以下五个选项用于[color=#ff00]软件包的安装与移除[/color]

-ipackage_file #安装软件包,必须是deb包的完整名称

-r package #移除软件包,但保留其配置文件

-P package #移除软件包的所有文件

--unpack package_file #解开软件包到系统目录但不配置

--configure package #配置软件包

以下四个选项用于查询[color=#ff00]已经安装到系统的软件包信息[/color]

-l package-name-pattern #查看系统中软件包名符合pattern模式的软件包

-L package-name #查看package-name对应的软件包安装的文件及目录

-s package-name #查看package-name对应的软件包信息

-S filename-search-pattern #从已经安装的软件包中查找包含filename的软件包名称

(2)、让我们做一些实验:

1、首先列出我的系统(ubuntu 10.04)上安装的与dpkg相关的软件包

[color=#ff00]geekard@geekard-laptop:~$ dpkg -l\*dpkg*[/color]

|Status=Not/Inst/Cfg-files/Unpacked/Failed-cfg/Half-inst/trig-aWait/Trig-pend

|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)

||/Name Version Description

+++-=================================-=================================-==================================================================================

[color=#ff00]ii[/color] dpkg 1.15.5.6ubuntu4.1 Debian package management system

un dpkg-dev <none> (nodescription available)

un dpkg-iasearch <none> (nodescription available)

以ii(install ok installed )开头表示Name对应的软件包已安装, 以un(unknown oknot-installed)开头表示没有安装 ,以rc开头的表示deinstall okconfig-files即要重新安装。

那些没有安装的软件包(以un开头)的信息是从已经安装的软件包的Recommends,Suggests 字段获得的。

2、查看已安装的dpkg软件包信息:

[color=#ff00]geekard@geekard-laptop:~$ dpkg -sdpkg[/color]

Package: dpkg

Essential: yes

[color=#ff00]Status[/color]: install okinstalled #该软件包已经安装

Priority: required

Section: admin

Installed-Size: 6608

Origin: debian

Maintainer: Ubuntu Core Developers <[email=ubuntu-devel-discuss@lists.ubuntu.com][color=#0070af]ubuntu-devel-discuss@lists.ubuntu.com[/color][/email]>

Bugs: debbugs://bugs.debian.org

Architecture: i386

[color=#ff00]Version[/color]:1.15.5.6ubuntu4.1

[color=#ff00]Replaces[/color]: manpages-de(<= 0.4-3), manpages-pl (<=20051117-1) #该软件包将要替换的文件

Pre-Depends: libc6 (>= 2.11), coreutils(>= 5.93-1),lzma #该软件包依赖的其它软件包及版本

[color=#ff00]Suggests[/color]:apt #安装该软件包时建议同时安装的其它软件包

Breaks: emacs21 (<< 21.4a+1-5.7),emacs21-nox (<< 21.4a+1-5.7), emacs22(<= 22.2-0ubuntu2), emacs22-gtk (<=22.2-0ubuntu2), emacs22-nox (<= 22.2-0ubuntu2), jed(<< 1:0.99.18+dfsg.1-13), jed-extra(<= 2.5.3-2), konqueror (<=4:4.2.96-1),
pinfo (<< 0.6.9-3.1),tkinfo (<< 2.8-3.1), xemacs21-support(<< 21.4.22-2), xjed(<< 1:0.99.18+dfsg.1-13)

Conflicts: apt (<< 0.7.7), aptitude(<< 0.4.7-1), dpkg-dev(<< 1.14.16), dpkg-iasearch(<< 0.11), sysvinit(<<2.82-1) #与该软件包相冲突的其它软件包

[color=#ff00]Conffiles: [/color] #该软件包提供的配置文件(configfiles)及校验信息

/etc/dpkg/dpkg.cfg f4413ffb515f8f753624ae3bb365b81b

/etc/alternatives/README 69c4ba7f08363e998e0f2e244a04f881

/etc/cron.daily/dpkg b6b8dc21210ea50db7cc4636f521758f

/etc/logrotate.d/dpkg 9e25c8505966b5829785f34a548ae11f

[color=#ff00]Description[/color]: Debian packagemanagementsystem #该软件包功能描述,从中可以看出为用于安装与卸载debian软件包的低级工具

This package provides the low-level infrastructure for handlingthe

installation and removal of Debian software packages.

.

For Debian package development tools, install dpkg-dev.

Homepage: [color=#0070af]http://wiki.debian.org/Teams/Dpkg[/color]

Original-Maintainer: Dpkg Developers <[email=debian-dpkg@lists.debian.org][color=#0070af]debian-dpkg@lists.debian.org[/color][/email]>

geekard@geekard-laptop:~$

3、查看dpkg软件包安装到系统中的文件:

[color=#ff00]geekard@geekard-laptop:~$ dpkg -Ldpkg[/color]

/.

/etc

/etc/dpkg #dpkg的配置目录

/etc/dpkg/dpkg.cfg

/etc/dpkg/dpkg.cfg.d

/etc/alternatives

/etc/alternatives/README

。。。

/usr/bin #dpkg相关命令

[color=#ff00]/usr/bin/dpkg

/usr/bin/dpkg-deb[/color]

/usr/bin/dpkg-divert

[color=#ff00]/usr/bin/dpkg-query[/color]

/usr/bin/dpkg-split

/usr/bin/dpkg-statoverride

/usr/bin/dpkg-trigger

/usr/bin/update-alternatives

。。。

/var

/var/lib

[color=#ff00]/var/lib/dpkg [/color] #dpkg用于存储已安装到本地的软件包信息的目录

/var/lib/dpkg/alternatives

/var/lib/dpkg/info

/var/lib/dpkg/parts

/var/lib/dpkg/updates

。。。

geekard@geekard-laptop:~$

4、dpkg软件包相关文件介绍([color=#ff00]重点![/color]):

/etc/dpkg/dpkg.cfg #Configuration file with default options.

/var/log/dpkg.log #Defaultlog file (see /etc/dpkg/dpkg.cfg(5) and option --log).

[color=#ff00]/var/lib/dpkg/available[/color]文件 #存放系统上曾经安装(包括现在)过的软件包信息。即使以后该软件包被卸载,这些信息仍然保留。这些信息就是dpkg -lpattern列出的内容。

[color=#ff00]/var/lib/dpkg/status[/color] 文件#存放系统上已经安装的软件的状态信息如标记为安装、卸载、重新安装等。

[color=#ff00]/var/lib/dpkg/info [/color] 目录#非常重要!记录安装的软件包控制目录中的控制信息文件如 control、. Conffiles ,.preinst , .postinst , .prerm , .postrm , .list ,.md5suns 等,用于后期软件包的查询和移除。

例如:dpkg -r package-name 就是根据info目录中该软件包对应的控制信息文件来对其进行移除的。

available与status文件的差别就是前者记录所有安装过的(不管现在是否已经卸载)的信息而后者只记录已安装但没卸载的软件包信息。这也可以从两者记录的软件包数量上看出来,命令如下:

geekard@geekard-laptop:~$ for file in/var/lib/dpkg/{available,status}

> do

> echo " packages in "${file}" file are : $(grep -wPackage "${file}" | wc -l ) "

> done

输出为:

packages in /var/lib/dpkg/available file are : 1597

packages in /var/lib/dpkg/status file are : 1531

5、另外再提一下[color=#ff00]debian软件包中包含的内容及用途[/color]:

debian软件包其实是以.deb为后缀的归档文件,其内容主要包括两方面:Package control data 和Upstreamdata,前者为软件包控制数据,dpkg就是根据这些文件来安装该软件包的,主要是一些脚本文件如:

control 文本文件,提供该软件包的metadate也称“元数据”,通常为软件包的名称、版本、作者、依赖关系、架构、功能描述等内容

conffiles 文本文件,即configurefiles的缩写,主要记录该软件包包含的配置文件完整路径

preinst 脚本文件,preinstall 即安装软件包前要做的工作,通常为建立相关目录、检测系统环境等

postinst 脚本文件,postinstall即安装软件包后要做的工作,通常为开启daemon,建立菜单项和快捷方式等。

prerm 脚本文件,preremove,即在移除或重新安装该软件包前要做的工作

postrm 脚本文件,post remove即在移除该软件包后要做的工作

其它的就是Upstream data,即要安装到系统中的所有文件。这些文件可以通过双击deb软件包用packageinstaller工具看到。

二、下面我们再来探秘一下ATP工具

APT --- a simple command lineinterface for downloadingand installing packages.

功能:

1.从网络的软件源下载最新的软件包metadate(也就是各软件包的索引和摘要信息文件)和binary or sourcepackage .

2.利用下载到本地的metadate,完成软件包的搜索、系统的更新。

3.安装和移除软件包时自动寻找最新版本并自动解决依赖关系。

总之,APT工具主要利用[color=#ff00]从网络软件源下载到的metadate完成软件包的搜索、下载、安装和移除[/color],后两种功能是通过调用底层的dpkg完成的。

(1)让我们看一下安装到系统上的相关软件包

[color=#ff00]geekard@geekard-laptop:~$ dpkg -l\*apt* |grep ii[/color]

ii apt 0.7.25.3ubuntu9.1 [color=#ff00]Advanced front-end fordpkg[/color]

ii apt-utils 0.7.25.3ubuntu9.1 APT utility programs

ii aptitude 0.4.11.11-1ubuntu10 terminal-based package manager

geekard@geekard-laptop:~$

最重要的就是apt软件包,从描述信息:Advanced front-end fordpkg中可以看出其依赖于dpkg,是其前端工具.

(2)查看apt软件包的信息

[color=#ff00]geekard@geekard-laptop:~$ dpkg -sapt[/color]

Package: apt

Status: install ok installed

Priority: important

Section: admin

Installed-Size: 5460

Maintainer: Ubuntu Core Developers <[email=ubuntu-devel-discuss@lists.ubuntu.com][color=#0070af]ubuntu-devel-discuss@lists.ubuntu.com[/color][/email]>

Architecture: i386

Version: 0.7.25.3ubuntu9.1

Replaces: libapt-pkg-dev (<< 0.3.7),libapt-pkg-doc (<< 0.3.7)

Provides: libapt-pkg-libc6.10-6-4.8

。。。。

让我们重点看一下相关目录及文件

[color=#ff00]geekard@geekard-laptop:~$ dpkg -Lapt[/color]

/.

/usr

/usr/bin

/usr/bin/apt-cache

/usr/bin/apt-cdrom

/usr/bin/apt-config

[color=#ff00]/usr/bin/apt-get [/color] #这个是搜索、安装、卸载软件包最常用到的命令

/usr/bin/apt-key

/usr/bin/apt-mark

。。。。

/etc/apt/preferences.d

[color=#ff00]/etc/apt/sources [/color] #这个文件很重要,记录的是软件源的地址

/etc/apt/sources.list.d

/etc/apt/trusted.gpg.d

。。。

/var

/var/cache

/var/cache/apt

[color=#ff00]/var/cache/apt/archives [/color] #已经下载到的软件包都放在这里(用的是apt-getupgrade 命令),要定期清理否则会占用很大空间并有可能带来版本冲突问题。

/var/cache/apt/archives/partial #这个是没有完全下载的软件包存放目录

/var/lib

/var/lib/apt

/var/lib/apt/lists #这个目录很重要,里面存放的都是软件源的metadate,也就是用apt-getupdate 时下载的文件

/var/lib/apt/lists/partial

/var/lib/apt/mirrors

/var/lib/apt/mirrors/partial

/var/lib/apt/periodic

(3)下面谈一下我对[color=#ff00]系统更新和用新立得工具查找软件包原理的理解[/color]:

/var/lib/apt/lists目录存放的是已经下载的各软件源的metadata,这些数据是系统更新和软件包查找工具的基础。

Ubuntu Software Center 、Snaptic SoftwaresManager 和UpdateManager等工具就是利用这些信息来更新和安装软件的。

Ubuntu SoftwareCenter主要用于软件的安装、卸载和查询。其安装和卸载软件的信息来源是/var/lib/dpkg/states,查询软件的信息来源是/var/lib/apt/lists/。

Snaptic Softwares Manager 的工作方式类似。

UpdateManager是系统更新工具,它是将系统已经安装的软件版本信息(存储在/var/lib/dpkg/states)与/var/lib/apt/lists/中同名的软件版本进行比较(比较Version字段),从而判断更新与否,然后将所有需要更新的软件在窗口中列出。

(4)让我们看一下向/etc/apt/source.list文件中添加软件源的方法,以我的配置为例:

geekard@geekard-laptop:~$ sudo cat /etc/apt/sources.list|tail

deb [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color] lucid mainmultiverse restricted universe

deb [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color]lucid-backports main multiverse restricted universe

deb [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color]lucid-proposed main multiverse restricted universe

deb [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color]lucid-security main multiverse restricted universe

deb [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color]lucid-updates main multiverse restricted universe

deb-src [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color] lucid mainmultiverse restricted universe

deb-src [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color]lucid-backports main multiverse restricted universe

deb-src [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color]lucid-proposed main multiverse restricted universe

deb-src [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color]lucid-security main multiverse restricted universe

deb-src [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color]lucid-updates main multiverse restricted universe

geekard@geekard-laptop:~$

ubuntu的[color=#ff00]软件源类型[/color]有4种分别为:

main Canonical-support opensourcesofts 即canoniacl公司(ubuntu幕后的开发团队)支持的开源软件

multiverse 各开源社区支持的开源软件

restricted 有专利限制的设备驱动软件(主要是显卡驱动)

universe 有版权限制的软件(但个人在一定条件下可以自由使用)

ubuntu用于[color=#ff00]更新的软件源类型[/color]有4种分别为:

security 重要的安全更新

updates 建议的更新

proposed pre-releaseupdates

backports unsupported updates

向source.list文件[color=#ff00]添加源的格式[/color]为:

[color=#ff00] deb|deb-src [color=#0070af]http://path/to/ubuntu/[/color] ubuntu发行版名称 |发行版名称-更新的类型 软件源类型...

[/color]


如deb [color=#0070af]http://debian.ustc.edu.cn/ubuntu/[/color] lucid-backports mainmultiverse restricted
universe

当要下载源码包时需要添加源码源(以deb-src开头)。

(5)最后介绍一下apt常用的命令及选项:

Usage: apt-get [options] command

apt-get[options] install|remove pkg1 [pkg2 ...]

apt-get[options] source pkg1 [pkg2 ...]

Commands:

update - Retrieve new lists ofpackages #从源服务器上下载metadate到/var/lib/apt/lists目录中

upgrade - Perform anupgrade #更新系统,下载的软件包放在/var/cache/apt/archives 目录中

install - Install new packages(pkg is libc6 not libc6.deb) #安装软件包并自动解决依赖关系

remove - Removepackages #卸载软件包

purge - Remove packages andconfig files

source - Download sourcearchives #下载软件包的源代码,前提是source.lst文件中由deb-src开头的源

clean - Erase downloadedarchivefiles #清理软件包缓存即/var/cache/apt/archives目录中的内容

好了,Ubuntu的包管理机制就是这些,相信你看了后会有些收获,有问题或不完善的地方希望大家跟贴!

另外,为了方便熟悉RPM包管理机制的童鞋向deb包管理机制转变,我将两者作了对比,限于篇幅故放在附件中,有兴趣的童鞋可以下载看看。

让我们挖掘linux的奥秘,享受技术带来的快乐!记住unix的哲学就是在探索中just have fun !

from:http://blog.chinaunix.net/space.php?uid=7547035&;do=blog&id=60268

qita 发表于 2011-5-21 08:37
安装包

dpkg -i package.deb

sudo apt-get install package 安装包

sudo apt-get install package - - reinstall 重新安装包

sudo apt-get -f install 修复安装"-f = ——fix-missing"

显示该包的版本、安装信息等

dpkg -l package

dpkg -s package (详细)

apt-cache show package 获取包的相关信息,如说明、大小、版本等

搜索特定的包

apt-cache search package

列出当前所有已安装的包

dpkg -l

删除包

dpkg -r package

dpkg -P package (包括配置文件)

sudo apt-get remove package 删除包

sudo apt-get remove package - - purge 删除包,包括删除配置文件等

列出与该包关联的文件

dpkg -L package

解开 deb 包的内容

dpkg –unpack package.deb

从所有安装包中找寻文件keyword

dpkg -S keyword

列出 deb 包的内容

dpkg -c package.deb

sudo apt-get update 更新源

# apt-get update

运行成功之后,你就可以搜到在你的发行版中有哪些软件了,命令是apt-cache,运行这个命令是在本机是检索,而不连到网上。如:

sudo apt-get upgrade 更新已安装的包

sudo apt-get dist-upgrade 升级系统

sudo apt-get dselect-upgrade 使用 dselect 升级

apt-cache depends package 了解使用依赖

apt-cache rdepends package 是查看该包被哪些包依赖

sudo apt-get build-dep package 安装相关的编译环境

apt-get source package 下载该包的源代码

sudo apt-get clean && sudo apt-get autoclean 清理无用的包

sudo apt-get check 检查是否有损坏的依赖

================================举例=============================

# apt-cache search baseutils

这个命令可以列出baseutils这个软件包的情况,有还是没有,还有版本等。

看到库里有这个软件包后,就可以安装它:

# apt-get install baseutils

这时我们就可以看到apt-get的威力了。如果baseutils依赖于某个另外的软件,或者一个运行库xyz.0.01.so,apt-get会自动下载这个包(或含有这个库的软件包)。这叫做自动依赖性处理。通常,如果你只用Debian软件库内的软件,是不会发生找不到包或包版本不对的情况的,除非用的是正在开发的Testing或Unstable版本。

卸载软件:

# apt-get remove baseutils

如果想看一下库里有多少软件:

# apt-cache stats

Total package names : 22502 (900k)

Normal packages: 17632

Pure virtual packages: 281

Single virtual packages: 1048

Mixed virtual packages: 172

Missing: 3369

...

把本机所有软件升级到最新版:

# apt-get upgrade

最后是最强力的--把整个发行版都升到新版本:

# apt-get dist-upgrade

升级时注意那些影响系统起动的东西,比如升级了内核,升级了grub或lilo等,这之后你应当重新运行grub或是lilo,让它们指向正确的位置,否则升级之后会工作不正常的。

用apt-get安装软件时,它会从网上(在sources.list里指的那个站点)下载所用的软件包,这个包将存在本机上,目录是:/var/cache/apt/archives/。时间长了,这里会变得非常巨大,占用大量的硬盘空间。要想清理这个目录,可以运行:

# apt-get clean

还有一个自动清理功能,它只清除那些没用的或者是不完整的软件包:

# apt-get autoclean

这样在重装某软件时就依然能使用已经下载好的,而不是再到网上去下载。

dpkg - 底层一些的包管理工具

用上apt(高级包管理工具)之后,一般是不需要处理单个的deb文件的。如果需要,就要用dpkg命令。比如想自己装gedit:

# dpkg -i gedit-2.12.1.deb

卸载:

# dpkg -r gedit

这里只写名字即可。还可以加上--purge(-P)标志:

# dpkg -P gedit

这会连同gedit的配置文件一起删除,只用-r的话是不删除配置文件的。

如果不想安装一个deb包,但想看一下它里面有什么文件:

# dpkg -c gedit-2.12.1.deb

如果想多看点信息:

# dpkg -I gedit-2.12.1.deb

也可以用通配符来列出机器上的软件:

# dpkg -l gcc*

这会列出所有gcc开头的软件包:

Desired=Unknown/Install/Remove/Purge/Hold

Status=Not/Installed/Config-files/Unpacked/Failed-config/.

/ Err?=(none)/Hold/Reinst-required/X=both-problems

/ Name Version Description

+++-===============-==============-========================

ii gcc 4.0.1-3 The GNU C compiler

ii gcc-3.3-base 3.3.6-8ubuntu1 The GNU Compiler Colletio

un gcc-3.5 none (no description available)

其中,第1个 i 表示希望安装,第2个 i 表示已经安装,第3个字段是问题(如果有)(这3个字的含义可以看上面那3行,desired, status, err),后面是名字,版本和描述。un就表示,Unknown, not-installed。

如果想看某包是否已经安装:

# dpkg -s gedit

如果想看某软件都有哪些文件,都装到了什么地方:

# dpkg -L gedit

如果只想看其中的某些文件,就加上Grep:

# dpkg -L gedit grep png

当然还有aptitude和Aptitude,前者是终端上运行的带菜单的工具,后者是X窗口上运行的图形化的程序。

还有,列出某包的详情:apt-cache show gedit
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: