Chinaunix首页 | 论坛 | 博客
  • 博客访问: 534971
  • 博文数量: 260
  • 博客积分: 10435
  • 博客等级: 上将
  • 技术积分: 1939
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-24 14:50
文章分类

全部博文(260)

文章存档

2011年(22)

2010年(209)

2009年(29)

我的朋友

分类: LINUX

2010-05-13 18:22:58

软件包管理工具

由于UNIX的程序设计思想是不重复发明轮子,所以UNIX程序大多都会依赖现有的程序和工具来开发。Linux也继承了UNIX这种优良的传统。这带给我们的好处是开发效率成倍提高,结构灵活,扩展性好。但软件间复杂的依赖关系和冲突关系给软件的安装造成很大的障碍。所以成功的Linux发行版都开发有方便的软件包管理工具,让电脑自动帮我们解决软件包的依赖和冲突。软件包管理工具是区分不同发行版的重要特征之一。如:Debian使用dpkgRedHat使用rpmGentoo使用emergeYellow Dog使用yumYellow Dog Updater),Arch Linux使用pacman。本章主要介绍Debian的软件包管理工具dpkg和它的一些前端工具,如apt-getapt-file等。

4.1. dpkg

dpkgDebian系统的软件包管理工具,它最初于1993年发布,是Debian系统最优秀的特性之一。它通过以下几种关系来标识软件包间的依赖性。分别是:

·   depends(依赖),运行A必须先安装B,且有版本的要求,不同版本也会造成依赖问题。

·   recommends(推荐),系统推荐的软件包可增强你所安装软件的关健功能。你可安装也可不安装。

·   suggests(建议),系统建议的软件包可增强你所安装软件的某些功能,你可安装也可不安装。

·   conflicts(冲突),安装了AB不能正常运行。不要安装有冲突的软件包。

·   replaces(替换),软件包A中的软件会被软件包B中的软件移除或覆盖,不要安装该类软件包。

·   provides(提供),A软件包已提供B软件包的所有功能。你可安装也可不安装该类软件包。

dpkg软件包是一些以.deb结尾的文件,软件包信息集中存放在/var/lib/dpkg/目录下,其中/var/lib/dpkg/info存放有软件包的管理信息。

debian:/var/lib/dpkg/info# ls zhcon.* -l
-rw-r--r-- 1 root root   32 2006-09-26 20:56 zhcon.conffiles
-rwxr-xr-x 1 root root  104 2006-09-26 20:56 zhcon.config
-rw-r--r-- 1 root root 1755 2006-09-28 08:18 zhcon.list
-rw-r--r-- 1 root root 3147 2006-09-26 20:56 zhcon.md5sums
-rwxr-xr-x 1 root root  233 2006-09-26 20:56 zhcon.postinst
-rwxr-xr-x 1 root root  206 2006-09-26 20:56 zhcon.postrm
-rw-r--r-- 1 root root  906 2006-09-26 20:56 zhcon.templates
...

不同后缀的意义如下:

·   .conffiles,文本文件,记录软件包的配置文件列表。

·   .list,文本文件,存放软件包的文件列表和安装位置。

·   .md5sums,文本文件,记录软件包的md5信息,这些信息用来进行软件包验证。

·   .prerm,脚本文件,负责停止与软件包关联的daemon服务,在删除关联软件包之前执行。

·   .postrm,脚本文件,负责修改软件包链接或文件关联,或删除由它创建的临时文件。

·   .config,脚本文件,是软件包的安装配置脚本。

·   .preinst,脚本文件,在解包之前执行,做一些软件包安装前的准备工作。

·   .postinst,脚本文件,在解包之后执行,做一些软件包的安装配置工作。

·   .templates,文本文件,记录一些软件包的安装提示信息。

上面这些文件不是每个都必须的,根据不同的安装要求由软件包维护者自由设置。下面介绍dpkg工具的具体用法。使用dpkg -h命令可以列出该工具的所有语法:

debian:/var/lib/dpkg/info# dpkg -h
用法:dpkg [<选项> ...] <命令>
 
命令:
  -i|--install       <.deb 文件名> ... | -R|--recursive <目录> ...
  --unpack           <.deb 文件名> ... | -R|--recursive <目录> ...
  -A|--record-avail  <.deb 文件名> ... | -R|--recursive <目录> ...
  --configure        <软件包名> ... | -a|--pending
  -r|--remove        <软件包名> ... | -a|--pending
  -P|--purge         <软件包名> ... | -a|--pending
  --get-selections [<表达式> ...]     把已选中的软件包列表打印到标准输出。
  --set-selections                    从标准输入里读出要选择的软件。
  --clear-selections                  取消选中所有不必要的软件包。
  --update-avail 文件>      替换现有可安装的软件包信息。
  --merge-avail 文件>        把文件中的信息合并到系统中。
  --clear-avail                       清除现有的软件包信息。
  --forget-old-unavail                忘却已被卸载的不可安装的软件包。
  -s|--status <软件包名> ...          显示软件包详尽的状态信息。
  -p|--print-avail <软件包名> ...     显示可供安装的版本详情。
  -L|--listfiles <软件包名> ...       列出所有“属于”该软件包(或多个)的文件。
  -l|--list [<表达式> ...             简明地列出软件包的状态。
  -S|--search <表达式> ...            搜寻拥有该文件(或多个文件)的包。
  -C|--audit                          检查搜寻残损的软件包。
  --print-architecture                显示 dpkg 体系架构。
  --compare-vesions <> <关系> <>  比较版本号 - 见下。
  --force-help                        显示本强制选项的帮助信息。
  -Dh|--debug=help                    显示有关出错调试的帮助信息。
 
  -h|--help                           显示本帮助信息。
  --version                           显示版本信息。
  --license | --licence               显示版权和许可证条文。
 
对归档文件使用 dpkg -b|--build|-c|--contents|-e|--control|-I|--info|-f|--field|
  -x|--extract|-X|--vextract|--fsys-tarfile (输入 dpkg-deb --help)
 
供内部使用:dpkg  --assert-support-predepends | --predep-package |
  --assert-working-epoch | --assert-long-filenames | --assert-multi-conrep
 
选项:
  --admindir=<目录>             使用 <目录> 而非 /var/lib/dpkg
  --root=<目录>                 安装到另一个根文件系统。
  --instdir=<目录>              改变安装的根目录的同时保持管理(admin)目录不变。
  -O|--selected-only            忽略没有被选中安装或升级的软件包。
  -E|--skip-same-version        忽略版本与已安装软件版本相同的软件包。
  -G|--refuse-downgrade         忽略版本早于已安装软件版本的的软件包。
  -B|--auto-deconfigure         就算会影响其他软件包,也要安装。
  --no-debsig                   不去试图验证软件包的签名。
  --no-act|--dry-run|--simulate
                                仅仅报告我们要执行的操作 - 但是不执行。
  -D|--debug=<八进制数字>       开启调试功能(参见 -Dhelp 或者 --debug=help)
  --status-fd                发送状态改变的更新信号到文件描述符
  --log=<文件名>                把状态的更动和操作信息记录到 <文件名>
  --ignore-depends=<软件包名>,... 忽略关于 <软件包名> 的所有依赖关系。
  --force-...                     忽视遇到的问题 - 参见 --force-help
  --no-force-...|--refuse-...     当遇到问题时中止运行。
可供--compare-version 使用的比较运算符有:
 lt le eq ne ge gt        (如果版本号为空,那么就认为它先于任意版本号)
 lt-nl le-nl ge-nl gt-nl  (如果版本号为空,那么就认为它后于任意版本号)
 < << <= = >= >> >        (仅仅是为了与主控文件的语法兼容)

介绍几个常用的命令选项:

·   查询软件包

·      debian:~# dpkg -l zhcon
·      期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
·      | 当前状态=(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)
·      |/ 错误?=()/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)
·      ||/ 名称                版本                简介
·      +++-=====================-=====================-==========================================================
·      ii  zhcon                 0.2.6-3               A Fast Console CJK System Using FrameBuffer

如果我们不知道软件包的具体名称,我们也可使用通配符来查询。

debian:~# dpkg -l zh*
期望状态=未知(u)/安装(i)/删除(r)/清除(p)/保持(h)
| 当前状态=(n)/已安装(i)/仅存配置(c)/仅解压缩(U)/配置失败(F)/不完全安装(H)
|/ 错误?=()/保持(?)/须重装(R)/两者兼有(#) (状态,错误:大写=故障)
||/ 名称                版本                简介
+++-=====================-=====================-==========================================================
un  zh-autoconvert        <>                 (无相关介绍)
un  zh-trans              <>                 (无相关介绍)
ii  zhcon                 0.2.6-3               A Fast Console CJK System Using FrameBuffer

·   查看软件包的详细信息

·      debian:~# dpkg -s zhcon
·      Package: zhcon
·      Status: install ok installed
·      Priority: optional
·      Section: utils
·      Installed-Size: 7608
·      Maintainer: Yu Guanghui 
·      Architecture: i386
·      Version: 1:0.2.6-3
·      Depends: libc6 (>= 2.3.6-6), libgcc1 (>= 1:4.1.1-12), libggi2 (>= 1:2.2.1), libncurses5 (>= 5.4-5), libpth2 (>= 2.0.7), libstdc++6 (>= 4.1.1-12), unicon-imc2, debconf
·      Conflicts: unicon-im (<< 3.0.4-9)
·      Conffiles:
·       /etc/zhcon.conf 91253d7043a0cb35a395b4d73d906762
·       /etc/zhcon.conf 91253d7043a0cb35a395b4d73d906762
·      Description: A Fast Console CJK System Using FrameBuffer
·       Zhcon is a fast Linux Console Chinese System which supports framebuffer
·       device.It can display Chinese,Japanese or Korean double byte characters
·       on console.
·       Features include:
·         Full support for Linux FrameBuffer device(from 640x480x8bpp to
·           1024x768x32bpp)
·         Multiple language support (GB2312,GBK,BIG5,JIS,KSCM)
·         Auto-detect and convert between GB2312 and BIG5 encoding(like hztty)
·         Hot key to change language encoding on the fly
·         Can use input method from MS Windows 98 Chinese version or UCDOS for
·           MS-DOS

·   查看已安装软件包所安装的文件列表。

·      debian:~# dpkg -L zhcon
·      /.
·      /usr
·      /usr/bin
·      /usr/bin/zhcon
·      /usr/sbin
·      /usr/share
·      /usr/share/man
·      ...
·       
·      /usr/lib
·      /usr/lib/zhcon
·      /usr/lib/zhcon/input
·      /usr/lib/zhcon/input/big5-ary30.mb
·      /usr/lib/zhcon/input/big5-cj.mb
·      ...
·       
·      /etc
·      /etc/zhcon.conf

还没安装的软件包不能使用该命令列出文件列表。

·   显示.deb软件包的内容,要显示的.deb软件包要在当前目录下。

·      debian:~/inst# dpkg -I jabbin_2.0beta2-1_i386.deb
·       新格式的 debian 软件包,格式版本 2.0
·       大小 2812370 字节:主控包=20219 字节。
·           677 字节,   17       control
·        136505 字节, 1316       md5sums
·       Package: jabbin
·       Version: 2.0beta2-1
·       Section: net
·       Priority: optional
·       Architecture: i386
·       Depends: libc6 (>= 2.3.6-6), libexpat1 (>= 1.95.8), libgcc1 (>= 1:4.1.0), libqt3-mt (>= 3:3.3.6), libspeex1, libssl0.9.8 (>= 0.9.8b-1), libstdc++6 (>= 4.1.0), libx11-6, libxext6, libxss1, zlib1g (>= 1:1.2.1)
·       Installed-Size: 12428
·       Maintainer: Andrew Donnellan 
·       Description: Jabber IM client with VoIP support
·        Jabbin is a Jabber instant messaging client based on Psi.
·        It has support for the Jingle P2P protocol, which is used
·        for Voice over Internet Protocol (VoIP).
·        .
·        Jabbin is compatible with the VoIP protocol used by Google
·        Talk.
·        .
·        Homepage: 

·   显示.deb包中的文件列表,要显示的.deb包要在当前目录下。

·      debian:~/inst# dpkg -c jabbin_2.0beta2-1_i386.deb
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/bin/
·      -rwxr-xr-x root/root   5904104 2006-08-03 05:25 ./usr/bin/jabbin
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/
·      -rw-r--r-- root/root        83 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/dir-wcprops
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/wcprops/
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/text-base/
·      drwxr-xr-x root/root         0 2006-08-03 05:25 ./usr/share/jabbin/iconsets/.svn/tmp/props/
·      ...

·   安装.deb软件包,要安装的.deb文件要在当前目录下。

·      debian:~/inst# dpkg -i jabbin_2.0beta2-1_i386.deb
·      (正在读取数据库 ... 系统当前总共安装有 107878 个文件和目录。)
·      正预备替换 jabbin 2.0beta2-1 (使用 jabbin_2.0beta2-1_i386.deb) ...
·      正在解压缩将用于更替的包文件 jabbin ...
·      正在设置 jabbin (2.0beta2-1) ...
·      debian:~/inst#

使用该命令安装.deb包并不能自动解决软件包的依赖问题,需用dpkg -I查出该软件包的依赖要求手动解决。所以该方法一般用来安装第三方的.deb软件包。如果需系统自动解决软件包的依赖关系,则要使用apttaskseldselectaptitude或图形化的syanpticKPackage等前端工具来安装软件包。

·   删除软件包。

·      debian:~/inst# dpkg -r zhcon
·      (正在读取数据库 ... 系统当前总共安装有 107878 个文件和目录。)
·      正在删除 zhcon ...
·      debian:~/inst#

我们也可用-P选项来删除软件包,它将会清除软件包的相关配置文件。

除了dpkg命令外,系统中还有一些以dpkg开头的命令,用来管理Debian软件包。常用的有:

·   dpkg-reconfigure,重新配置软件包。

·   dpkg-source, dpkg-gencontrol, dpkg-shlibdeps, dpkg-genchanges, dpkg-buildpackage, dpkg-dista ddfile,dpkg-parsechangelog。这些都是debian源码包的管理工具。

4.2. APT

软件包管理是区分不同发行版的一大特征,如RedHat使用RPM软件包来管理软件,Debian使用deb软件包来管理软件。aptDebiandeb软件包高级管理工具,由一组以apt开头的命令组成,如apt-getapt-cacheapt-setup等。它的最低底层还是调用dpkg程序来处理软件包的。通过apt-get工具可自动解决软件包的依赖关系,方便软件的安装和升级。它是Debian发行版的最大特色,一定要好好掌握。

要使用好apt-get就要配置好一个名为sources.list的资源列表,资源列表指向Debian系统的软件库,apt-get会从该软件库安装各种软件包。sources.list文件位于/etc/apt目录下,下面是SargeEtchSid三个版本的写法,你可任选一种,最好不要多版本混用:

#sources.list for Sarge(stable):
deb  stable main contrib non-free
deb  stable/non-US main contrib non-free
deb http://security.debian.org stable/updates main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src  stable main contrib non-free
#deb-src  stable/non-US main contrib non-free
 
#sources.list for Etch(testing):
deb  testing main contrib non-free
deb  testing/non-US main contrib non-free
deb http://security.debian.org testing/updates main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src  testing main contrib non-free
#deb-src  testing/non-US main contrib non-free
 
#sources.list for Sid(unstable):
deb ftp://ftp.us.debian.org/debian unstable main contrib non-free
deb ftp://non-us.debian.org/debian-non-US unstable/non-US main contrib non-free
#Uncomment if you want the apt-get source function to work
#deb-src  unstable main contrib non-free
#deb-src  unstable/non-US main contrib non-free

sources.list文件的内容决定了Debian的版本。安全更新只存在于stabletesting版中,unstable没有安全更新。进入stable的软件都经过严格的依赖测试和安全测试,所以如果你想系统稳定,用于工作,最好使用stable,如果你想使用最新版的软件,就使用testingunstableWoodySargeSidDebian 3.x三个版本中的代号,我们一般都是以代号来称呼debian不同版本。所有Debian发行版的代号全都取自电影Toy StoryWoody是那个牛仔,Sarge是绿色塑胶军队的领导,Sid是破坏玩具的小孩。

我们也可把Debian的发行光盘做为软件库,直接在光盘上安装软件。这时就要用到apt-cdrom命令。命令格式如下:

debian:~# apt-cdrom --help
apt 0.6.46.4 for linux i386 ,编译于 Dec  4 2006 17:48:23
Usage: apt-cdrom [options] command
 
apt-cdrom is a tool to add CDROM's to APT's source list. The
CDROM mount point and device information is taken from apt.conf
and /etc/fstab.
 
Commands:
   add - 增加一个CDROM安装源到sources.list列表
   ident - 报告CDROM的验证信息
 
Options:
  -h   帮助
  -d   指定CDROM挂装点
  -r   为一个已经识别的光盘改名
  -m   不挂装
  -f   快速模式,不检查软件包文件
  -a   完整扫描模式
  -c=? 指定读取的配置文件
  -o=? 设置附加选项
See fstab(5)

·    apt-get update

更新软件包信息库。在Debian中,软件包是通过一个数据库来管理的,通过这个数据库中可跟踪你系统中已安装、没有安装和现在可安装的软件包信息。apt-get安装软件包时就是依靠这个数据库来解决软件包间的依赖关系,从而可自动安装相关软件。我们需定期运行该命令,从而保持数据库的信息为最新。

·    apt-get install package_name1 package_name2 package_name3 ...

安装软件包。如果软件包需其它软件包支持,apt-get会通过搜索软件包数据库找到这种依赖关系,一起下载相关软件。在一个命令行中可同时安装多个软件包,中间用空格隔开即可。安装的软件包默认会存放在/var/cache/apt/archives目录下,以便以后重新安装。如果已安装的软件包损坏了,你可通过--reinstall选项来重新安装。如:

# apt-get --reinstall install package_name

[Note]

 

在需安装的软件包名后加一个减号会删除软件包,如:apt-get install package_name-

只是下载软件,不解包和安装使用-d选项,如:

# apt-get -d install package_name

使用--dry-run选项可使apt-get在安装软件包前进行测试,如:

# apt-get install package_name --dry-run

Debian软件包的名字和软件名不同,所以在安装前如不知道软件包的名字,可到Debian的官方软件库查询,网址是:。或者用下面介绍的apt-cache search package_name命令来查询。

·    apt-get remove package_name1 package_name2 package_name3 ...

删除软件包。如果你想删除没用的软件包,只要使用该命令即可。如果你想把该软件的配置文件也删除,可以用--purge选项,如:

# apt-get --purge remove package_name

[Note]

 

类似地,在删除软件包名后加一个加号会安装软件包,如:apt-get remove package_name+

·    apt-get source package_name1 package_name2 package_name3

下载软件包的的源码版本。

·    apt-get build-dep package_name

构造软件包的源码的编译环境,为编译软件包下载必须的其它软件包。

·    apt-get upgrade package_name1 package_name2 package_name3 ...

软件包升级功能是APT系统这么成功的主要原因。通过该命令,我们就可把软件升级到最版本。在使用该命令前,最好先运行apt-get update命令,以更新软件包数据库。但该方案不是更新系统最好的方法,一些包会因为包依赖问题而保留(kept back)一些旧的软件包。Debian提供了一个更好的升级方案,就是用dis-upgrade。下面一节会详细介绍。

·    apt-get dist-upgrade

更新整个Debian系统。可从网络或本地更新整个系统。它会重新安排好包的依赖性。如果有些包由于一些原因实在不能更新,我们可通过以下命令查询原因:

# apt-get -o Debug::pkgProblemResolver=yes dist-upgrade

[Note]

 

apt-show-versions -u可获得可升级软件包的列表。该命令还有一些有用的选项,可用-h选项查看详细帮助,了解更多功能。

·    apt-get clean

删除下载了的软件包当我们通过apt-get安装软件包时APT会把软件包下载到本地/var/cache/apt/archives/目录。该命令会删除该文件夹内的除锁住外的所有软件包。该文件夹下的文件不可用rm命令删除,一定要使用apt-get命令来删除。

·    apt-get autoclean

删除已下载的旧版本的软件包。该命令类似于上面的命令,但它会有选择地删除旧版本的软件包。

·    apt-get autoremove

自动移除随其它软件自动安装但又不再有用的软件。

·    apt-get dselect-upgrade

通过dselect建议推荐功能更新系统。dselectDebian中一个功能强大的包管理工具。它可帮助用户选择软件包来安装,其中一个有用功能是它会建议和推荐安装其它相关软件包。我们可在APT中使用它这个功能。

·    apt-get check

检查系统中已安装软件包的依赖性。

·    apt-getsecret cow powers

·    debian:~# apt-get moo
·             (__)
·             (oo)
·       /------\/
·      / |    ||
·     *  /\---/\
·        ~~   ~~
·    ...."Have you mooed today?"...

 

阅读(781) | 评论(0) | 转发(0) |
0

上一篇:java vs c++

下一篇:restart network

给主人留下些什么吧!~~